欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-19 10:20:30
文章目录消息处理组件server过滤器globalFilterService、filterService处理消息模块handlerService计划任务模块cronHandlers监听client的服务器组件包含哪些东西?采用哪种连接this.connector加解密this.encode this.decode是否RSA加密this.useCrypto是否黑名单过滤this.useHostFil......

消息处理组件server

具体文件是:pomelo/lib/common/components/server.js
组件加载后写入app中 app.components.__server__
对外两个处理接口:

/**
 * Proxy server handle
 */
pro.handle = function(msg, session, cb) {
	this.server.handle(msg, session, cb);
};

/**
 * Proxy server global handle
 */
Component.prototype.globalHandle = function(msg, session, cb) {
	this.server.globalHandle(msg, session, cb);
};

每一个非master进程都会加载的组件,进行消息的处理。
这个组件比较复杂,我们慢慢来看。

pomelo/lib/server/server.js中

pro.start = function() {
  if(this.state > ST_INITED) {
    return;
  }

  this.globalFilterService = initFilter(true, this.app);
  this.filterService = initFilter(false, this.app);
  this.handlerService = initHandler(this.app, this.opts);
  this.cronHandlers = loadCronHandlers(this.app);
  loadCrons(this, this.app);
  this.state = ST_STARTED;
};

可以看到启动时,加载了4个模块,具体分析下:

过滤器globalFilterService、filterService

在initFilter中可以看到就是加载了app中过滤属性。这个过滤属性是可以在启动服务器前*配置的。对应的就是application.js中的接口。
这些过滤器被filterService.js封装,filterService对外提供2个接口:
beforeFilter还有afterFilter,分别是消息前过滤和消息后过滤

很容易分析在handle和globalHandle中的使用过程。

  1. globalHandle中采用全局过滤 globalFilterService.beforeFilter
  2. doForward or doHandle
    doForward: RPC到msgRemote中进行处理(最终调用doHandle)。 注意:这个msgRemote只有后端服务器才会加载。
  3. doHandle中采用该进程自己的过滤 filterService.beforeFilter
  4. 调用handlerService处理消息,然后调用本身的response
  5. 在doHandle.response中调用进程自己的过滤 filterService.afterFilter
  6. 回到globalHandle.response中调用全局过滤 globalFilterService.afterFilter

处理消息模块handlerService

消息的具体处理模块。

  1. 加载可处理的模块:loadHandlers
    也就是 app/servers/serverName/handler下的所有js模块的函数
  2. 直接调用js中的具体函数进行处理

计划任务模块cronHandlers

  1. 加载loadCrons
    加载配置:/config/crons.json 将当前服务器可用的写到this.crons中
  2. 在afterStart中调用计划任务模块,写入配置的任务
  3. 在server的构造函数中注册了两个消息ADD_CRONS、REMOVE_CRONS
    最终暴露给外部是在application中的addCrons和removeCrons

监听client的服务器组件

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

主要是对pomelo/lib/connectors的封装,处理客户端的socket消息
connectors详解

包含哪些东西?

在connector中包含有几个部分,挨个分析下

采用哪种连接this.connector

在getConnector中可以看到支持外部传入,默认使用的sioconnector

加解密this.encode this.decode

创建该组件时支持传入加解密函数,如果不传入就调用this.connector中加解密

是否RSA加密this.useCrypto

对消息进行认证setPubKey、getPubKey

是否黑名单过滤this.useHostFilter

this.blacklist是黑名单ip的数组,没提供接口,可以直接写入
this.blacklistFun黑名单过滤函数,支持传入该函数

是否异步发送消息this.useAsyncCode

主要是跟加解密函数配合sendAsync
如果加解密函数中需要异步,则这个属性需要设置为true

使用rpc字典opts.useDict

使用字典算是额外的加密。在pomelo平台中有个通用的加解密模块
pomelo\lib\connectors\common\coder.js
如果要自己实现加解密的话,也需要对字典这里做处理

使用protobuf序列化

通上边的字典部分,也需要在加解密中做支持

在start中

this.server: 本身进程的server
this.session: 连接管理
this.connection: connection组件:
保存连接进来的玩家,连接数等信息

基本流程

  1. 启动一个connector监听配置中的‘clientPort’端口 getConnector
  2. 在afterStart中,注册connector的‘connection’消息到hostFilter
  3. hostFilter做黑名单过滤,之后转到bindEvents
  4. 在bindEvents中最大连接数控制,为新连接的用户生成一个session
  5. 在bindEvents中监听该连接的‘message’消息,负责消息解谜、验证
  6. 在handleMessage中处理消息,直接转到该进程的server组件的globalHandle
  7. server组建处理后,给客户端发送反馈

以上就完成了客户端连接过来,并通信的过程

本文地址:https://blog.csdn.net/qq_37543025/article/details/85950498

相关标签: pomelo源码解析