1. Maven依赖图
使用 IDEA 可以看到 compile 级别的依赖图如下:
| 依赖 | 官网 | 简介 |
|---|---|---|
| fastjson | https://github.com/alibaba/fastjson | Fastjson 是一个可以将Java对象序列化成JSON格式,或者将JSON格式反序列化为Java对象的Java库。 |
| netty-all | http://netty.io | Netty是一个异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序 |
| slf4j-api | http://www.slf4j.org | Simple Logging Facade for Java |
2. 解读
通过上面的Maven依赖图,以及依赖包的介绍,我们可以大胆假设:
1. 基于 netty 开发的服务端和客户端
2. 服务端和客户端的传输报文使用了 fastjson 处理。
3. 验证
我们从
wiki\sdk_develop_guide.md中找到了服务端和客户端关于通信协议的约定协议格式
<length> <header length> <header data> <body data>1 2 3 4协议分4部分,含义分别如下
- 大端4个字节整数,等于2、3、4长度总和
- 大端4个字节整数,等于3的长度
- 使用json序列化数据
- 应用自定义二进制序列化数据
第三部分,Header格式
123456789101112{"code": 0,"language": "JAVA","version": 0,"opaque": 0,"flag": 1,"remark": "hello, I am respponse /127.0.0.1:27603","extFields": {"count": "0","messageTitle": "HelloMessageTitle"}}这里已经说明了,内容是 json ,那么有关这部分内容的处理,必然会使用 fastjson
com.alibaba.rocketmq.remoting.netty.NettyDecoder- 继承自:
io.netty.handler.codec.LengthFieldBasedFrameDecoder
从类名上可以看出来,用来做解包的,也就是把上述协议中的二进制数据,按照(1)部分的length,来读取后3部分 - 重写了
public Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception方法,主要是解包完成后将二进制数据通过RemotingCommand.decode(byteBuffer)反序列化成一个com.alibaba.rocketmq.remoting.protocol.RemotingCommand对象
- 继承自:
com.alibaba.rocketmq.remoting.netty.NettyEncoder- 继承自:
io.netty.handler.codec.MessageToByteEncoder
从类名上可以看出来,用来做封包的,也就是把一个com.alibaba.rocketmq.remoting.protocol.RemotingCommand对象序列化成二进制数据 - 重写了
public void encode(ChannelHandlerContext ctx, RemotingCommand remotingCommand, ByteBuf out) throws Exception方法,主要是调用remotingCommand.encodeHeader()序列化包头、remotingCommand.getBody()序列化包体,并将序列化的结果写入到 netty 的写缓冲里
- 继承自:
4. 其他
通过搜索,发现了 rocketmq-remoting 中使用的一些环境变量
源文件:NettyDecoder
com.rocketmq.remoting.frameMaxLength
默认值 用途 8388608一个协议包的最大长度 com.rocketmq.remoting.nettyPooledByteBufAllocatorEnable
默认值 用途 false是否使用netty的ByteBuf分配池
源文件:NettySystemConfig
com.rocketmq.remoting.socket.sndbuf.size
默认值 用途 65535设置netty的ChannelOption.SO_SNDBUF。值得注意的是:
- Broker中如果未设置,
com.alibaba.rocketmq.remoting.netty.NettySystemConfig#SocketSndbufSize = 131072- NameServer中如果未设置,
com.alibaba.rocketmq.remoting.netty.NettySystemConfig#SocketSndbufSize = 2048- FilterServer中如果未设置,
com.alibaba.rocketmq.remoting.netty.NettySystemConfig#SocketSndbufSize = 65535com.rocketmq.remoting.socket.rcvbuf.size
默认值 用途 65535设置netty的ChannelOption.SO_RCVBUF。值得注意的是:
- Broker中如果未设置,
com.alibaba.rocketmq.remoting.netty.NettySystemConfig#SocketSndbufSize = 131072- NameServer中如果未设置,
com.alibaba.rocketmq.remoting.netty.NettySystemConfig#SocketSndbufSize = 1024- FilterServer中如果未设置,
com.alibaba.rocketmq.remoting.netty.NettySystemConfig#SocketSndbufSize = 1024com.rocketmq.remoting.clientAsyncSemaphoreValue
默认值 用途 2048CommunicationMode.ASYNC消息的并发数com.rocketmq.remoting.clientOnewaySemaphoreValue
默认值 用途 2048CommunicationMode.ONEWAY消息的并发数