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 = 65535
com.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 = 1024
com.rocketmq.remoting.clientAsyncSemaphoreValue
默认值 用途 2048
CommunicationMode.ASYNC
消息的并发数com.rocketmq.remoting.clientOnewaySemaphoreValue
默认值 用途 2048
CommunicationMode.ONEWAY
消息的并发数