从浅到深使用pm2来彻底掌握微服务运维精髓

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 从浅到深使用pm2来彻底掌握微服务运维精髓

前面发了一篇多种姿势后台启动进程提到pm2,它就像一个大管家一样,高效管理协调多个微服务,神奇吧。


本文会从简单使用,切入到微服务管理。


所以下面,我们先试一个web服务来熟悉它。接着,围绕一个极简微服务平台,运用pm2来管理,举一反三从而熟悉甚至掌握微服务管理运维的精髓!文末有好书推荐!


安装与使用

全局安装

npm install -g pm2


查看应用程序进程


pm2 ls 

image.png

当前pm2管家没有启动任何服务,所以上面展示了一个空列表。

第一个简单web应用效果

如下,左边浏览器为web主页,右边为nodejs启动终端

image.png

上图展示的应用代码如下,可以复制保存为: simpleweb.js

直接运行启动命令:node simpleweb.js

const pid = require('process').pid
const server = require('http').createServer((req,res)=>{
    console.log(new Date() + ' - visiting app')
    res.write("Levin - PM2 DEMO - ProcessId: "+pid)
    res.end()
})
server.listen(8000,()=>{console.log('listening at 8000, pid:',pid)})

以上代码使用NodeJS内置http模块来创建一个服务器监听8000端口,打开浏览器访问能看到进程号。

接下来都交给pm2

关闭上面进程后使用命令:pm2 start simpleweb.js

查看应用进程,日志

一旦讲应用交由pm2管理,我们可以用使用下面命令

pm2 ls #查看进程
pm2 logs simpleweb #或者pm2 logs 应用序号,pm2 ls返回的第一列
pm2 monit #监控查看当前应用的日志

效果如下,看到simpleweb这个应用了把,pm2帮我们管理了。

image.png

image.png

不过我们这里使用: pm2 start simpleweb.js --watch。

后面加了–watch,这个能够监听默认当前工作目录。

试着修改文件比如下图中间终端移动文件,pm2 检测到变化重启web应用,左边浏览器web页面打印新的进程id,右边日志也更新了。

image.png

pm2 保证应用程序进程常驻

读者可以试着kill -9 命令杀进程(加上面浏览器显示的进程ID),刷新web页面之后打印了新的进程id。

这时候 pm2发现程序挂了,自动恢复了。


这里简单带过一下pm2的原理

我们看到pm2命令被执行后,系统中多了一个守护进程“PM2 v4.5.6: God Daemon", 下图。

它维护了一些进程信息在当前用户主目录下 .pm2目录。

当我们把这个进程杀掉之后,连带被pm2使用的服务都被停掉了。必须启动pm2 daemon之后再restart


image.png

感受到pm2的魅力了吧,其他命令可使用pm2 -h查看。


这里先使用pm2 delete simpleweb,清理一下应用。


下面进入多个服务管理场景,稍微复杂一点,加一点耐心看完下去就能学会一个微服务并掌握它的运维管理。


管理一个迷你的微服务平台

简单带过一下微服务

把人体看作一个微服务平台,那眼睛就是一个专门接入图像数据的微服务,大脑就是一个执行数据计算的微服务,然后有些还是成对出现的(双热实例)。


商品展示微服务平台


image.png

上图有两个微服务

  • LevinUIApp前台服务:用来展示产品库存数据。
  • BackendApp后端产品服务:提供产品库存数据 给前台服务但是有两个worker子进程。

启动UI服务

#这里加上--name指定了应用名为uiapp
pm2 start ui-app/app.js --name uiapp

image.png

启动后端进程

后端服务启动两个worker线程(-i) :

#雷学委demo代码,指定进程名字为levinbapp并启动两个worker线程,用更多CPU来提高效率。
pm2 start backend-app/app.js --name levinbapp -i 2

效果如下,目前有两个应用进程了。

image.png

这里通过-i轻易的横向拓展更多个worker。 想要玩更多的服务,读者可以看完学会后自行尝试。

看效果并微服务日志:

#雷学委demo代码
pm2 monit

运行上面代码,同时打开两浏览器页面。

刷新前端应用(最左边窗口),会调用后端接口(中间的窗口),monit控制台切换服务查看日志。

如果刷新后端接口,monit控制台实时打印日志。

image.png

使用下面命令杀掉中间的后端服务, 一次刷新最左边uiapp应用,和中间的后端服务窗口。显示服务下线了。

而且在最右边monit窗口,能方便实时的切换服务日志,和查看服务状态,这是很不错的。

image.png

用起来还是很简单的,pm2管家覆盖支持了程序查日志,起停服务恢复等等。


那么下面的配置化管理,让我们更加简单专业的管理微服务平台。


配置化管理启动/停止服务群

使用 pm2 ecosystem 生成类似下面的ecosystem.config.js文件,这个可以启动的。读者可以不使用博主的代码,自己做一个前台app.js和后台app.js试试看。

module.exports = {
  apps : [{
    name: 'uiapp',
    script: './ui-app/app.js',
    watch: ['./ui-app']
  }, {
    name: 'levinbapp',
    script: './backend-app/app.js',
    watch: ['./backend-app']
  }],
  deploy : {//ssh方式把微服务整个附属到生产服务器!
    production : {
      user : 'root',
      host : 'alicloudtx',//阿里云主机
      ref  : 'origin/master',
      repo : 'GIT_REPOSITORY',
      path : '/demo/levin-demo-msa',
      'pre-deploy-local': '',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
      'pre-setup': ''
    }
  }
};

简单介绍一下:apps属性配置了需要pm2管理的服务群。

然后deploy属性支持用户使用pm2直接把多个服务群部署到阿里云。

然后使用: pm2 start ecosystem.config.js


image.png

部署到云上,这里不展示了,只要配置好ssh,即可部署到任意云平台。


总结

微服务平台,总是表现为多个服务多个机器分布式运行,资源和算力拓展了,管理等复杂度提升了。


可能两个服务登录不同机器,查看日志还容易,当服务到达成百上千的时候问题就很明显。


所以,我们需要(孵化)像pm2这样的工具,提供下面的便利:


开发和运维上的便利

无缝接入服务管理

这个对NodeJS应用来说,几乎是神器,pm2 原生地支持了应用程序管理,提供了命令管理查看用户应用。


举Springboot开发的微服务平台为例,开发应用的同学需要引入SpringCloud等组件进行服务发现,注册到注册中心。本人也使用过春天全家桶来制作微服务平台,再简化还得定制一个通用SpringBoot Starter,理念也是类似的!


统一管理日志工作台

特别是在微服务环境下,多个服务,使用pm2 monit,可以很方便的一个monit工作台切换微服务日志。大型平台那就需要做日志搜索了,比较成百上千个服务在pm2 monit窗口切换也不现实,这也是pm2缺少的地方!


不过,pm2还有一个在线版的Keymetics 做专业微服务平台监控管理的工作台(收费)。


更容易的应用弹性伸缩

上面启动后台服务的时候,加了一个-i参数,指定数量就能启动多worker服务。

虽然在NodeJS中还是单进程多线程,但是这个参数化实例拓展,这个设计是很有指导意义的!


服务启动/恢复操作的封装,原子性

我们使用pm2 start/stop appname即可,而非开发进入多个应用目录手动打node app.js。再者pm2会常驻应用保证应用不掉线,这个设计也是值得参考。


比如下面的命令:

#记得加 -i 2否则启动一个worker单线程处理ui的请求。
pm2 start levinbapp -i 2

image.png

整体编排和部署配置化管理

一个配置管理整个微服务的多个服务和实例,还能快速部署到云平台!


说到这,读者会不会觉得有些地方跟k8s(kubernetes)有相似的地方,无缝契合,配置化编排,弹性伸缩等等。 在NodeJS应用这一块pm2几乎是轻量接入,不需要像k8s那样去进行很多配置才能用起来。


本文主要是通过pm2使用展示了微服务应用的管理运维,指出一个更好的方向,以此引导读者把握并朝着这些角度开发优化微服务平台的运维与管理!

看看你周边的微服务可以想想怎么更好更方便的定位日志,服务部署,起停/横向拓展等等?


至于书籍


想做微服务的务必把这本书《微服务设计》看完。


这对架构实施和运营微服务很有帮助,算是微服务领域内比较经典的书籍,看了不下两遍!


还有参考链接中的MicroServicePattern 网站,上面有很多例子。


题外话,对NodeJS比较熟的同学可以去阅读一下它的源码,像服务常驻/热加载更新/无缝接入管理,这些优秀的实现值得挖一挖,可以开发出优秀的运维监控平台。


代码和参考链接

上文的微服务代码: https://blog.csdn.net/geeklevin/article/details/117458297?spm=1001.2014.3001.5501

pm2官网: https://pm2.keymetrics.io/docs/usage/quick-start/

书籍:https://book.douban.com/subject/26772677/

微服务网站: https://microservices.io/patterns/microservices.html


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
运维 监控 Cloud Native
自动化运维的魔法书云原生之旅:从容器化到微服务架构的演变
【8月更文挑战第29天】本文将带你领略自动化运维的魅力,从脚本编写到工具应用,我们将一起探索如何通过技术提升效率和稳定性。你将学会如何让服务器自主完成更新、监控和故障修复,仿佛拥有了一本能够自动翻页的魔法书。
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
763 30
|
运维 资源调度 调度
容器微服务运维
【10月更文挑战第16天】业务容器化后,运维需采用面向容器的新型平台,主要由镜像仓库、资源调度、容器调度、调度策略和服务编排组成。镜像仓库负责存储与分发容器镜像,支持权限控制、镜像同步和高可用性设计;资源调度解决不同环境下的机器部署问题;容器调度实现容器在主机上的合理分配;调度策略优化容器主机选择;服务编排则处理服务间的依赖关系和服务发现,支持自动扩缩容以适应业务需求变化。
|
运维 Kubernetes 安全
云时代的运维之光:容器化与微服务架构的融合之道
在数字化浪潮中,企业IT架构的演进从未停歇。本文以浅显的语言探讨了容器技术与微服务架构如何协同工作,提高运维效率。我们将从基础概念出发,逐步深入到它们在实际工作中的应用,最后分享一些行业内的最佳实践。无论你是运维新手还是资深专家,这篇文章都将为你带来新的视角和思考。
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
弹性计算 运维 Kubernetes
自动化运维的新篇章:容器编排与微服务架构
【7月更文挑战第14天】在数字化转型的浪潮中,企业对运维效率和系统可靠性的需求日益增长。本文深入探讨了自动化运维的最新趋势——容器编排和微服务架构,并阐述了如何通过这些技术提升运维效率、降低系统复杂性以及提高服务的可用性和可扩展性。文章不仅介绍了相关技术和工具的选择,还提供了实际案例分析,旨在为读者提供一套完整的解决方案框架,以适应快速变化的市场需求。
|
运维 Kubernetes 监控
自动化运维的新篇章:容器化与微服务架构的融合
【6月更文挑战第22天】在数字化时代的浪潮中,企业IT架构正经历着一场深刻的变革。本文将探讨自动化运维如何通过容器化技术与微服务架构的结合,提升系统的可维护性、扩展性和敏捷性。我们将深入分析这一结合背后的技术细节,以及它如何影响日常运维工作,同时提供一系列实用的操作建议和最佳实践。
|
运维 Kubernetes 云计算
云计算时代的运维革新:容器化与微服务架构的融合之道
在云计算技术飞速发展的当下,企业IT运维面临前所未有的挑战与机遇。传统的运维模式已难以满足现代业务对敏捷性、可伸缩性和自动化的需求。本文深入探讨了容器化技术和微服务架构如何共同推动运维领域的革命,通过数据支持和科学分析,揭示了这一融合趋势如何提高运维效率、降低风险并促进创新。
|
运维 Cloud Native 持续交付
"揭秘云原生技术:从容器化到微服务,自动化运维如何重塑未来应用架构?悬念重重,等你来探!"
【8月更文挑战第21天】随着云计算的迅猛发展,云原生技术作为设计云应用的最佳实践,正驱动企业数字化转型。本文解析云原生技术概念与特性,通过容器化(如Docker)、微服务架构(如Spring Boot)、自动化运维(如Jenkins)及持续交付等关键领域,并辅以代码实例,探讨云原生在电商等行业的应用,展现其如何助力企业实现高效、灵活与可靠的系统构建,促进业务增长。
214 0

热门文章

最新文章