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

举报
雷学委 发表于 2021/12/14 09:07:06 2021/12/14
【摘要】 这是我参与更文挑战的第2天,活动详情查看: 更文挑战前面发了一篇多种姿势后台启动进程提到pm2,它就像一个大管家一样,高效管理协调多个微服务,神奇吧。本文会从简单使用,切入到微服务管理。所以下面,我们先试一个web服务来熟悉它。接着,围绕一个极简微服务平台,运用pm2来管理,举一反三从而熟悉甚至掌握微服务管理运维的精髓!文末有好书推荐! 安装与使用 全局安装npm install -g pm...

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

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

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

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

安装与使用

全局安装

npm install -g pm2

查看应用程序进程

pm2 ls 

在这里插入图片描述
当前pm2管家没有启动任何服务,所以上面展示了一个空列表。

第一个简单web应用效果

如下,左边浏览器为web主页,右边为nodejs启动终端
在这里插入图片描述
上图展示的应用代码如下,可以复制保存为: 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帮我们管理了。
在这里插入图片描述
在这里插入图片描述
不过我们这里使用: pm2 start simpleweb.js --watch。

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

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

pm2 保证应用程序进程常驻

读者可以试着kill -9 命令杀进程(加上面浏览器显示的进程ID),刷新web页面之后打印了新的进程id。
这时候 pm2发现程序挂了,自动恢复了。

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

我们看到pm2命令被执行后,系统中多了一个守护进程“PM2 v4.5.6: God Daemon", 下图。
它维护了一些进程信息在当前用户主目录下 .pm2目录。
当我们把这个进程杀掉之后,连带被pm2使用的服务都被停掉了。必须启动pm2 daemon之后再restart。
在这里插入图片描述
感受到pm2的魅力了吧,其他命令可使用pm2 -h查看。

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

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

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

简单带过一下微服务

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

商品展示微服务平台

在这里插入图片描述
上图有两个微服务

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

启动UI服务

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

在这里插入图片描述

启动后端进程

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

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

效果如下,目前有两个应用进程了。
在这里插入图片描述
这里通过-i轻易的横向拓展更多个worker。 想要玩更多的服务,读者可以看完学会后自行尝试。

看效果并微服务日志:

#雷学委demo代码
pm2 monit

运行上面代码,同时打开两浏览器页面。
刷新前端应用(最左边窗口),会调用后端接口(中间的窗口),monit控制台切换服务查看日志。
如果刷新后端接口,monit控制台实时打印日志。
在这里插入图片描述
使用下面命令杀掉中间的后端服务, 一次刷新最左边uiapp应用,和中间的后端服务窗口。显示服务下线了。

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

pm2 stop levinbapp

在这里插入图片描述

用起来还是很简单的,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
在这里插入图片描述
部署到云上,这里不展示了,只要配置好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

在这里插入图片描述

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

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

说到这,读者会不会觉得有些地方跟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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。