当前位置: 移动技术网 > IT编程>软件设计>架构 > pomelo源码解析之组件解析(四)

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

2020年07月17日  | 移动技术网IT编程  | 我要评论

消息处理组件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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网