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

前面发了一篇多种姿势后台启动进程提到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

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

  1. Node.js微服务 2 :基于Seneca和PM2构建Node.js微服务

    2.1 选择Node.js的理由 如今,Node.js已经成为国际上许多科技公司的首选方案.特别的,对于在服务器端需要非阻塞特性(例如Web Sockets)的场景,Node.js俨然成了最好的选择. ...

  2. 浅谈分布式存储系统Pangu2.0——它让双11运维变得智能起来

    摘要: 12月13-14日,由云栖社区与阿里巴巴技术协会共同主办的<2017阿里巴巴双11技术十二讲>顺利结束,集中为大家分享了2017双11背后的黑科技.本文是<省身:分布式存储系 ...

  3. 由浅到深了解工厂模式

    作者 点先生 日期 2018.9.26 唠个嗑 先给各位观众老爷道个歉,在上一篇文章的末尾本来说了这次要给大家分享代理模式,但是臣妾,做不到啊! 最近公司给我了一个新项目,于是比较忙一点,再加上代理模 ...

  4. 前端div里的内容下沉_自学Web前端的五个不同阶段,从浅入深

    1.学习HTML,这是最简单,最基本的是要掌握div,formtable.Ulli.P.跨度.字体这些标签,这些都是最常用的,尤其是DIV和表格,DIV,表也可以用于布局,但不灵活,和用于基本表处理数 ...

  5. 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)

    新一代NET代码保护工具 MaxtoCode 的原理简介 MaxtoCode作为新一代保护工具,他有绝对优于目前所有NET代码保护工具的强度,是目前最保护强度最高的解决方案.但它也有缺点,最大的缺点即 ...

  6. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

  7. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

  8. javafx由浅到深的 认识(一)

    javafx是一款比较新兴的语言框架,随着javafx越来越实用,估计许多程序员也会慢慢接触它,故我在这里对它由浅到深进行介绍一下. 首先,要了解javafx,就应该先知道.xml文件的布局软件,以往 ...

  9. Angular浅入深出系列 - 写在前面

    本系列目录: 写在前面 基础知识 控制器(Controller) 作用域(Scope) 集合(Collection) 模块(Module) 依赖注入(Dependency Injection) 服务( ...

最新文章

  1. Eigen求解数学问题(一)
  2. WIN7+wampserver2.4+zend stadio10.6.1配置Xdebug
  3. linux笔记之 开机服务启动的控制,系统日志的查看,防火墙的关闭
  4. 讲讲大厂面试必考的假设检验
  5. 教你学会七种维护服务器安全最佳技巧
  6. 集群,分布式,微服务的区别
  7. TypeScript入门教程 之 为什么使用TypeScript
  8. Java8新特性总结 - 1.接口新增默认方法和静态方法
  9. JS执行Promise
  10. linux下ftp相关的一些指令
  11. 开发中一些常用的css小技巧
  12. 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制隔离级别
  13. C# DataTable.Select() 筛选数据
  14. 通过释放cache内存解决ubuntu死机问题
  15. 10分钟搞定工作周报
  16. Java转码amr_java实现amr转mp3
  17. Windows远程连接Linux界面的两种方法
  18. linux的核心安装下的命令行,linux lilo命令参数及用法详解--linux安装核心载入,开机管理程...
  19. JAVA 并发编程学习总结
  20. win10计算机的时间格式,win10系统更改excel时间和日期的格式的图文步骤

热门文章

  1. vue项目美食杰菜谱大全实现(二)
  2. 留言板:简单的留言功能实现
  3. 李东生的功守道:收桑榆,失东隅
  4. Mac:解决移动硬盘异常退出后无法识别
  5. MTK之后台发送中英文短信篇
  6. Redis——Redis主从复制(工作流程详解)
  7. AI安全01 人工智能的安全性
  8. 2.3将英尺转化为米数.py
  9. transform: rotate(1turn)
  10. 从零开始搭建口袋妖怪管理系统(2)-借助ngRoute实现详情页面跳转