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. 验证

  1. 我们从 wiki\sdk_develop_guide.md 中找到了服务端和客户端关于通信协议的约定

    1. 协议格式
      <length> <header length> <header data> <body data>

      1        2               3             4
      
    2. 协议分4部分,含义分别如下

      1. 大端4个字节整数,等于2、3、4长度总和
      2. 大端4个字节整数,等于3的长度
      3. 使用json序列化数据
      4. 应用自定义二进制序列化数据
    3. 第三部分,Header格式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      {
      "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

  2. com.alibaba.rocketmq.remoting.netty.NettyDecoder

    1. 继承自:io.netty.handler.codec.LengthFieldBasedFrameDecoder
      从类名上可以看出来,用来做解包的,也就是把上述协议中的二进制数据,按照(1)部分的length,来读取后3部分
    2. 重写了 public Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception 方法,主要是解包完成后将二进制数据通过 RemotingCommand.decode(byteBuffer) 反序列化成一个 com.alibaba.rocketmq.remoting.protocol.RemotingCommand 对象
  3. com.alibaba.rocketmq.remoting.netty.NettyEncoder

    1. 继承自:io.netty.handler.codec.MessageToByteEncoder
      从类名上可以看出来,用来做封包的,也就是把一个 com.alibaba.rocketmq.remoting.protocol.RemotingCommand 对象序列化成二进制数据
    2. 重写了 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 消息的并发数