pomelo源码解析之组件解析(四)
文章目录
消息处理组件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中的使用过程。
- globalHandle中采用全局过滤 globalFilterService.beforeFilter
- doForward or doHandle
doForward: RPC到msgRemote中进行处理(最终调用doHandle)。 注意:这个msgRemote只有后端服务器才会加载。
- doHandle中采用该进程自己的过滤 filterService.beforeFilter
- 调用handlerService处理消息,然后调用本身的response
- 在doHandle.response中调用进程自己的过滤 filterService.afterFilter
- 回到globalHandle.response中调用全局过滤 globalFilterService.afterFilter
处理消息模块handlerService
消息的具体处理模块。
- 加载可处理的模块:loadHandlers
也就是 app/servers/serverName/handler下的所有js模块的函数
- 直接调用js中的具体函数进行处理
计划任务模块cronHandlers
- 加载loadCrons
加载配置:/config/crons.json 将当前服务器可用的写到this.crons中
- 在afterStart中调用计划任务模块,写入配置的任务
- 在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组件:保存连接进来的玩家,连接数等信息
基本流程
- 启动一个connector监听配置中的‘clientPort’端口 getConnector
- 在afterStart中,注册connector的‘connection’消息到hostFilter
- hostFilter做黑名单过滤,之后转到bindEvents
- 在bindEvents中最大连接数控制,为新连接的用户生成一个session
- 在bindEvents中监听该连接的‘message’消息,负责消息解谜、验证
- 在handleMessage中处理消息,直接转到该进程的server组件的globalHandle
- server组建处理后,给客户端发送反馈
以上就完成了客户端连接过来,并通信的过程
本文地址:https://blog.csdn.net/qq_37543025/article/details/85950498
上一篇: 035.集群安全-Pod安全
下一篇: Python基础篇_实例练习(二)
推荐阅读