Pigeon源码分析
Pigeon是公司Hydra服务化框架的底层通讯框架, 其实现参考了淘宝Dubbo的底层通讯实现.这也是为何我在 <<Dubbo源码分析>> 一文中没有分析远程服务调用具体实现的原因.
分析并熟悉Pigeon框架对于如何使用Netty通讯框架,自定义协议,序列化/反序列化等方面都具有积极的指导意义.
谈谈使用Netty开发协议的一些步骤及注意点:
-
当然首先应该根据业务需求确定协议结构
-
根据协议结构固定住请求(req),响应(res)对象的结构
-
Netty开发时, 注意ChannelHandler的顺序
a. 如果是InBound, 则ChannelHandler的顺序一般为: Decrypt Handler–>Decoder Handler–>HeartBeat Hander–>Req构建Handler–>协议处理Handler
b. 如果是OutBound, 则ChannelHandler的顺序一般为:Encrypt Handler–>Encoder Handler–>HeartBeat Hander–>Res构建Handler–>协议处理Handler (注意调用顺序为反序)
其中, Codec部分(Encoder,Decoder)可以考虑采用多种序列化方式(JDK,JSON,XML,Protobuf,Avro等等)
-
Netty4的线程模型中, InBound和OutBound事件均在EventLoop线程(及IO线程)中处理, 需要注意避免耗时操作导致线程阻塞
-
同步调用一般通过Future.get()来实现阻塞同步调用, 异步调用则通过Callback方式进行
-
如果ChannelHandler无状态, 可考虑在ChannelHandlerContext中共享(@Shareable)
-
特定方法调用分两种情况:
a. 类固定, 方法指定, 则req信息中需包含方法信息(方法签名, 参数等), server端通过反射实现
b. 类和方法均指定, 则req信息中需包含类和方法信息(类,方法签名, 构造器,参数等),server端同样通过反射实现
-
注意维护已建立的server和client的Channel连接(保存, 动态更新),便于后续做路由,负载均衡,监控等处理