dubbo系列之网络通信编码解码-provider请求和响应编码
简要
这篇博客分两个部分:
1:provider 请求编码
2:provider响应结果编码
源码解析
在provider收到consumer编码后的数据时,首先要开始解码,下面先看一下provider是如何解码的。
provider请求编码
NettyCodecAdapter.InternalDecoder类
messageReceived()
1 | msg = codec.decode(channel, message); |
ExchangeCodec类
decode()
1 | public Object decode(Channel channel, ChannelBuffer buffer) throws IOException { |
取出在consumer请求编码阶段传入的消息体长度和消息头。
decode()
1 | protected Object decode(Channel channel, ChannelBuffer buffer, int readable, byte[] header) throws IOException { |
decodeBody()
1 | protected Object decodeBody(Channel channel, InputStream is, byte[] header) throws IOException { |
data的值
这样,整个provider解码的过程就结束了
provider响应结果编码
所谓响应结果编码,也就是对DemoServiceImpl类中return语句的编码。
1 | return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress(); |
NettyCodecAdapter.InternalEncoder类
encode()
1 | codec.encode(channel, buffer, msg); |
ExchangeCodec类
encode()
1 | else if (msg instanceof Response) {//响应 |
encodeResponse()
1 | protected void encodeResponse(Channel channel, ChannelBuffer buffer, Response res) throws IOException { |
encodeResponseData()
1 | protected void encodeResponseData(Channel channel, ObjectOutput out, Object data) throws IOException { |
我们可以看到,虽然provider和consumer的消息体还是有一些区别的
总结一下
dubbo的消息头是一个定长的 16个字节。
第1-2个字节:是一个魔数数字:就是一个固定的数字
第3个字节:序列号组件类型,它用于和客户端约定的序列号编码号
第四个字节:它是response的结果响应码 例如 OK=20
第5-12个字节:请求id:long型8个字节。异步变同步的全局唯一ID,用来做consumer和provider的来回通信标记。
第13-16个字节:消息体的长度,也就是消息头+请求数据的长度。