《Apache Dubbo微服务开发从入门到精通》——通信协议——二、 HTTP/2(Triple)协议(2) https://developer.aliyun.com/article/1224947
a) Triple 协议内容介绍
基于 grpc 协议进行进一步扩展:
• Service-Version → "tri-service-version" {Dubbo service version}
• Service-Group → "tri-service-group" {Dubbo service group}
• Tracing-ID → "tri-trace-traceid" {tracing id}
• Tracing-RPC-ID → "tri-trace-rpcid" {_span id _}
• Cluster-Info → "tri-unit-info" {cluster infomation}
其中Service-Version跟Service-Group分别标识了Dubbo服务的version跟group信息,因为 grpc 的 path 申明了 service name 跟 method name,相比于 Dubbo协议,缺少了 version 跟 group 信息;Tracing-ID、Tracing-RPC-ID 用于全链路追踪能力,分别表示 tracing id 跟 span id 信息;Cluster-Info 表示集群信息,可以使用其构建一些如集群划分等路由相关的灵活的服务治理能力。
b) Triple Streaming
Triple 协议相比传统的 unary 方式,多了目前提供的 Streaming RPC 的能力。
Streaming 用于什么场景呢?
在一些大文件传输、直播等应用场景中,consumer 或 provider 需要跟对端进行大量数据的传输,由于这些情况下的数据量是非常大的,因此是没有办法可以在一个RPC 的数据包中进行传输,因此对于这些数据包我们需要对数据包进行分片之后,通过多次 RPC 调用进行传输,如果我们对这些已经拆分了的 RPC 数据包进行并行传输,那么到对端后相关的数据包是无序的,需要对接收到的数据进行排序拼接,相关的逻辑会非常复杂。但如果我们对拆分了的 RPC 数据包进行串行传输,那么对应的网络传输 RTT 与数据处理的时延会是非常大的。
为了解决以上的问题,并且为了大量数据的传输以流水线方式在 consumer 与
provider 之间传输,因此 Streaming RPC 的模型应运而生。
通过 Triple 协议的 Streaming RPC 方式,会在 consumer 跟 provider 之间建立多条用户态的长连接,Stream。同一个 TCP 连接之上能同时存在多个 Stream,其中每条 Stream 都有 StreamId 进行标识,对于一条 Stream 上的数据包会以顺序方式读写。
3) Triple 协议设计目标
根据 Triple 设计的目标,Triple 协议有以下优势:
• 具备跨语言交互的能力,传统的多语言多 SDK 模式和 Mesh 化跨语言模式都需要一种更通用易扩展的数据传输协议。
• 提供更完善的请求模型,除了支持传统的 Request/Response 模型(Unary 单向通信),还支持 Stream(流式通信)和 Bidirectional(双向通信)。
• 易扩展、穿透性高,包括但不限于 Tracing/Monitoring 等支持,也应该能被各层设备识别,网关设施等可以识别数据报文,对 Service Mesh 部署友好,降低用户理解难度。
• 完全兼容 grpc,客户端/服务端可以与原生 grpc 客户端打通。
• 可以复用现有 grpc 生态下的组件, 满足云原生场景下的跨语言、跨环境、跨平台的互通需求。当前使用其他协议的 Dubbo 用户,框架提供了兼容现有序列化方式的迁移能力,在不影响线上已有业务的前提下,迁移协议的成本几乎为零。
a) 完全兼容 GRPC
需要新增对接 grpc 服务的 Dubbo 用户,可以直接使用 Triple 协议来实现打通,不需要单独引入 grpc client 来完成,不仅能保留已有的 Dubbo 易用性,也能降低程序的复杂度和开发运维成本,不需要额外进行适配和开发即可接入现有生态。
b) 方便网关接入
对于需要网关接入的 Dubbo 用户,Triple 协议提供了更加原生的方式,让网关开发或者使用开源的 grpc 网关组件更加简单。网关可以选择不解析 payload,在性能上也有很大提高。在使用 Dubbo 协议时,语言相关的序列化方式是网关的一个很大痛点,而传统的 HTTP 转 Dubbo 的方式对于跨语言序列化几乎是无能为力的。同时,由于 Triple 的协议元数据都存储在请求头中,网关可以轻松的实现定制需求,如路由和限流等功能。
《Apache Dubbo微服务开发从入门到精通》——通信协议——二、 HTTP/2(Triple)协议(4) https://developer.aliyun.com/article/1224945