pomelo源码解析之组件解析(二)

监控器组件

主要功能就是监控进程的一些运行信息,进程重启
基于pomelo-admin

master监控器

具体文件是:pomelo/lib/common/components/master.js
组件加载后写入app中 app.components.__matser__

master的配置文件是在config/master.json中
可以发现就是生成了一个master对象,pomelo/lib/master/master.js

Server.prototype.start = function(cb) {
  moduleUtil.registerDefaultModules(true, this.app, this.closeWatcher);
  moduleUtil.loadModules(this, this.masterConsole);

  var self = this;
  // start master console
  this.masterConsole.start(function(err) {

生成一个admin-masterConsole,然后加载模块,看一下具体有哪些模块:

masterwatcher

处理masterConsole的注册、断开、重连消息
封装watchdog类,处理monitor(普通监控器)的四个消息

var masterMethods = {
  'subscribe': subscribe,
  'unsubscribe': unsubscribe,
  'query': query,
  'record': record
};

watchdog

存储注册过来的monitor(普通监控器),广播消息等

watchServer

在pomelo-admin/lib/modules中,下同
这里就是处理master和monitor之间的通用性的消息
详情查看pomelo-admin/lib/modules/watchServer.js中的monitorHandler和clientHandler

systemInfo

master主动请求或者monitor主动反馈的一些系统信息

nodeInfo

master主动请求或者monitor主动反馈的一些node进程信息

monitorLog

master向monitor发送请求收集日志信息

scripts

master在monitor上执行脚本

profiler

v8-profiler

看回master.js在start中:

  this.masterConsole.start(function(err) {
    if(err) {
      process.exit(0);
    }
    moduleUtil.startModules(self.modules, function(err) {
      if(err) {
        utils.invokeCallback(cb, err);
        return;
      }

      if(self.app.get(Constants.RESERVED.MODE) !== Constants.RESERVED.STAND_ALONE) {
        starter.runServers(self.app);
      }
      utils.invokeCallback(cb);
    });
  });

看到会用starter这个模块启动服务器:
在starter.js中可以发现,会根据你设置在app上的type来选择启动哪些服务器。对于master来说就是不启动任何东西。
而对于选择了具体服务器id的就会读取该server的配置,设置一些启动参数并已子进程的方式启动

再往下看,处理了masterConsole的‘disconnect’消息
在这里根据一些策略:
ping几次超时,端口占用等,进行进程的重启

普通监控器

具体文件是:pomelo/lib/common/components/monitor.js
组件加载后写入app中 app.components.__monitor__

普通监控器很简单,就是启动一个pomelo-admin的monitorConsole连接到masterConsole上
加载的模块唯一不用就是

monitorwatcher

提供有几个操作:

var monitorMethods = {
  'addServer': addServer,
  'removeServer': removeServer,
  'replaceServer': replaceServer,
  'startOver': startOver
};

连接后直接发送record消息给master
唯一需要注意的就是,RPC的服务器信息是在这个组件中控制的:

var addServers = function(self, servers) {
  if(!servers || !servers.length) {
    return;
  }
  self.app.addServers(servers);
};

var removeServers = function(self, ids) {
  if(!ids || !ids.length) {
    return;
  }
  self.app.removeServers(ids);
};

var replaceServers = function(self, servers) {
  self.app.replaceServers(servers);
};

总结

主要就是用于master进程和子进程之间的一些监控,子进程注册到master上,并把其他注册在master上的子进程写到rpc中,用于服务器进程间的rpc通信

猜你喜欢

转载自blog.csdn.net/qq_37543025/article/details/85808624