Dawn's Blogs

分享技术 记录成长

0%

Triple协议 (1) Triple协议简介

Triple 协议简介

Triple 协议是 Dubbo3 设计的基于 HTTP 的 RPC 通信协议规范,它完全兼容 gRPC 协议,支持 Unary、Streaming 流式等通信模型,可同时运行在 HTTP/1 和 HTTP/2 之上。

Triple 包含两个部分:

  1. 构建一套自定义的精简 HTTP RPC 子协议,支持 HTTP/1 和 HTTP/2 为传输协议,仅支持 Unary 通信

  2. 构建基于 gRPC 的扩展子协议(与 gRPC 兼容),仅支持 HTTP/2 实现,支持 Unary 和 Streaming 通信

目标

Triple 协议完全兼容 gRPC 协议,为什么 Dubbo 还要通过 Triple 重新实现一遍?目标有如下两点:

  • 在协议设计上,Triple 是一个基于 HTTP 传输层协议的 RPC 协议,它同时可运行在 HTTP/1、HTTP/2 之上
  • 完全兼容基于 HTTP/2 的 gRPC 协议,因此 Dubbo Triple 协议实现可以 100% 与 gRPC 体系互调互通。
  • 仅依赖标准的、被广泛使用的 HTTP 特性,以便在实现层面可以直接依赖官方的标准 HTTP 网络库

协议规范

Triple 包含两个部分:

  1. 构建一套自定义的精简 HTTP RPC 子协议,支持 HTTP/1 和 HTTP/2 为传输协议,仅支持 Unary 通信

  2. 构建基于 gRPC 的扩展子协议(与 gRPC 兼容),仅支持 HTTP/2 实现,支持 Unary 和 Streaming 通信

HTTP RPC 协议

Triple HTTP RPC 同时支持 HTTP/1、HTTP/2 作为底层传输层协议,在实现上对应支持的 content-type 类型为 application/json、application/proto。

请求 Request

HTTP Header

HTTP Header 说明:

  • tri-service-timeout:为了实现调用超时机制,单位 ms。
  • tri-service-group,tri-service- version:Dubbo 框架支持基于 分组(group)版本(version) 的服务隔离机制,因此 Triple 协议中引入了这两个 Header。
  • tri-protocol-version:用来区分具有相同 Content-Type 的 triple 协议请求和其他协议请求,因为 application/json 格式的 Content-Type 非常普遍。所有的 Dubbo 原生客户端实现都应该在请求中携带 TRI-Protocol-Version,Dubbo 服务端或代理可以选择拒绝没有 TRI-Protocol-Version 的请求并返回 Http-Status 400 错误。

HTTP Body

HTTP Body 说明:payload 作为 HTTP Body 在链路上进行传输,其编码格式取决于 content-type,是否压缩取决于 content-encoding。

  • content-type 为 json:json 的场景下,payload 采用有序的数组编码形式,即将 rpc 方法的参数按顺序组装进 Array 后进行 json 序列化,方法参数的位置与数组下标保持一致,当 Triple server 接收到请求体时,根据每个参数的类型进行反序列化成对应的参数数组。对于使用 Protocol Buffer 的情形,payload 则是只有一个 json 对象的数组。对于使用 protobuf 编码的场景,payload 则是只有一个 json 对象的数组。
  • content-type 为 proto:proto 场景下,Protobuf 生成的 Request 类包含了编码格式,因此将直接使用 Request 对象中的内置编码方式。
  • content- encoding:如果 Content-Encoding 指定了相应值,则 payload 是被压缩过的,应该首先进行解压缩后再解析编码数据。

响应 Response

对于成功 Response 响应状态码是 200,在这种场景下,响应体的 Content-Type 将保持和请求体的 Content-Type 保持一致。以 Content-Type 指定的方式进行编码,并且以 Content-Encoding 来压缩

异常 Response 响应的状态码是 non-200,并且都是标准的 HTTP status code,在这个场景下,Content-Type 必须是 application/json。Payload 可以为,如果有值的话包括 status 和 message 字段,并且以 Content-Encoding 来压缩

gRPC 扩展协议

Triple 协议的 Streaming 请求处理完全遵循 gRPC 协议规范,且仅支持 HTTP/2 作为传输层协议。并且后端服务间的 Unary 请求默认采用扩展版 gPRC 协议。

Triple 支持的 content-type 类型为标准的 gRPC 类型,包括 application/grpc、application/grpc+proto、application/grpc+json,除此之外,Triple 在实现上还扩展了 application/triple+wrapper 编码格式。