2019-09-29-阿里三面

1:ZAB协议

//待补齐

2:DUBBO协议

Dubbo协议先抄官方一张图吧,由图可以知道,Dubbo协议是一个字节型的协议,使用字节的特定位置表示特定的含义。

1:0-16 bit位,第一个字节和第二个字节表示魔法值,用于标识是dubbo协议,它的值是 0xdabb

2:16 bit位,一个bit位,用于标识是请求还是响应,1表示请求,0表示响应

3:17 bit位,一个bit位,只在是请求时才有用,用于标识是否需要从服务器返回值。

4:18 bit位,一个bit位,用于标识是不是一个事件,比如,心跳事件。如果是,设置成 1.

5:19-24 bit位,5个bit位,标识序列化类型,比如,如果是fastjson,值是6,总共支持2^5中序列化类型。

6:24-31 bit位,一个字节,表示服务器的响应状态码。仅在是请求时才有用。

  • 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_ERROR

 以上一个int,前四个字节的内容。

7:第4个自己和第12个字节内容表示请求id,标识唯一的请求。64位长整数。

8:第13个字节和第16个字节:序列化后的内容长度(可变部分),按字节计数。int类型。

9:Variable Part

  • 被特定的序列化类型(由序列化 ID 标识)序列化后,每个部分都是一个 byte [] 或者 byte

    • 如果是请求包 ( Req/Res = 1),则每个部分依次为:
      • Dubbo version
      • Service name
      • Service version
      • Method name
      • Method parameter types
      • Method arguments
      • Attachments
    • 如果是响应包(Req/Res = 0),则每个部分依次为:
      • 返回值类型(byte),标识从服务器端返回的值类型:
        • 返回空值:RESPONSE_NULL_VALUE 2
        • 正常响应值: RESPONSE_VALUE 1
        • 异常:RESPONSE_WITH_EXCEPTION 0
      • 返回值:从服务端返回的响应bytes

**注意:**对于(Variable Part)变长部分,当前版本的dubbo框架使用json序列化时,在每部分内容间额外增加了换行符作为分隔

http://dubbo.apache.org/zh-cn/blog/dubbo-protocol.html

3:RocketMQ内部实现相关

//待补齐

猜你喜欢

转载自www.cnblogs.com/shuiyonglewodezzzzz/p/11605638.html