Dubbo源码解析(十二)dubbo 协议探秘

本文深入探讨了Dubbo协议的结构和优势,揭示了其高性能的秘密。Dubbo协议包含Header和Message Body,Header有128位,主要包含Magic Number。消息体则包括服务相关信息和序列化数据。相较于HTTP,Dubbo协议直接使用二进制编码,减少了编解码步骤,提高了效率,尤其在与SpringCloud的http协议对比中,凸显其高效性能。
摘要由CSDN通过智能技术生成

众所流传,rpc协议十高性能的协议,是远超http协议的性能呢,但是现在由于异构跨语言系统的之间的交互与调用,从而springcloud 大放异彩,而springcloud 使用的就是http协议,当前跨语言协议还有thrift,protobuff、avro等。当然之前dubbo是hession序列化,导致只有java客户端。但是现在已经dubbo-nodejs,dubbo-php这些项目了(还没看,囧)。

那么这个dubbo协议长什么样呢,在我们眼中的http、tcp协议的包体应该都历历在目。大约是header + body,当然这个dubbo也不失众人所望,仍是如此结构
在这里插入图片描述

Header

详细头总共有128位,即16字节,第0-15位是MagicNumer

下标 说明
0-7 高位魔法数
8-15 低位魔法数
16 标记消息是请求(1)还是响应(0)
17 标记消息是否需要返回,1需要返回,0不需要
18 标记消息是心跳、连接、断开这种事件还是普通的请求响应,1表示事件
19-23 标记此消息的序列化方式,fastjson是6
24-31
  • 20 - OK
  • 30 - CLIENT_TIMEOUT
  • 31 - SERVER_TIMEOUT
  • 40 - BAD_REQUEST
  • 50 - BAD_RESPONSE
  • 60 - SERVICE_NOT_FOUND
  • 70 - SERVICE_ERROR
  • 80 - SERVER_ERROR
  • 90 - CLIENT_ERROR
  • 100 - SERVER_THREADPOOL_EXHAUSTED
32-95 请求ID,Long类型
96-127 消息体长度,Integer类型

消息体

128之后表示消息体内容,但是有个注意的点,他是有一定顺序的。在使用hession序列化的时候,直接使用的是writeUTF方法。

  • Dubbo version
  • Service name
  • Service version
  • Method name
  • Method parameter types
  • Method arguments
  • Attachments
    看一看代码,或许就比较清晰了。

hession2编码相关代码

        RpcInvocation inv = (RpcInvocation) data;

        out.writeUTF(inv.getAttachment(Constants.DUBBO_VERSION_KEY, DUBBO_VERSION));
        out.writeUTF(inv.getAttachment(Constants.PATH_KEY));
        out.writeUTF(inv.getAttachment(Constants.VERSION_KEY));

        out.writeUTF(inv.getMethodName());
        out.writeUTF(ReflectUtils.getDesc(in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值