作者:华钟明

本文咱们将介绍 Apache Dubbo 灵敏的多协议规划准则,依据这一规划,在 Dubbo 结构底层可灵敏的选用 HTTP/2、HTTP/REST、TCP、gRPC、JsonRPC、Hessian2 等任一 RPC 通讯协议,一起享受共同的 API 与对等的服务办理才能。一起,咱们还介绍了 Dubbo 的单端口多协议才能,也就是在单个端口一起监听、处理多个协议,这关于简化多协议一起发布的场景十分有用。

不绑定RPC 协议的规划准则

Dubbo 结构不绑定任何通讯协议,你能够依据事务场景挑选 HTTP/2 通讯协议,也能够选用 HTTP/REST、TCP(Dubbo2)、gRPC、JsonRPC、Hessian2 等官方支撑的通讯协议,假如以上协议都不能满足需求,还能够十分便利的经过定制方式接入自定义协议。假如你想在一个运用内运用多个协议,也能够十分容易的做到,比方一个接口运用 HTTP/2 通讯,另一个接口运用 TCP 通讯,一个运用内发布或调用多个运用不同协议的服务。

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?

经过 Dubbo 结构的多协议支撑,你能够做到:

  • 将恣意通讯协议无缝地接入 Dubbo 服务办理体系。Dubbo 体系下的所有通讯协议,都能够享受到 Dubbo 的编程模型、服务发现、流量管控等优势。比方 gRPC over Dubbo 的形式,服务办理、编程 API 都能够零本钱接入 Dubbo 体系。
  • 兼容不同技能栈,事务体系混合运用不同的服务结构、RPC 结构。比方有些服务运用 gRPC 或许 Spring Cloud 开发,有些服务运用 Dubbo 结构开发,经过 Dubbo 的多协议支撑能够很好的实现互通。
  • 让协议搬迁变的更简略。经过多协议、注册中心的和谐,能够快速满足公司内协议搬迁的需求。比方如从自研协议升级到 Dubbo 协议,Dubbo 协议自身升级,从 Dubbo 协议搬迁到 gRPC,从 HTTP 搬迁到 Dubbo 协议等。

官方接入的干流协议

HTTP/2(Triple)

Triple 协议是 Dubbo3 发布的面向云原生时代的通讯协议,它依据 HTTP/2 而且彻底兼容 gRPC 协议,原生支撑 Streaming 通讯语义,自 Triple 协议开端,Dubbo 还支撑依据 Protobuf 的服务定义与数据传输。Triple 具有更好的网关、代理穿透性,因而十分适合于跨网关、代理通讯的布置架构,如服务网格等。Triple 协议的中心特性如下:

  • 支撑 TLS 加密、Plaintext 明文数据传输
  • 支撑反压与限流
  • 支撑 Streaming 流式通讯

在编程与通讯模型上,Triple 协议支撑如下形式:

  • 消费端异步请求(Client Side Asynchronous Request-Response)
  • 供给端异步履行(Server Side Asynchronous Request-Response)
  • 消费端请求流(Request Streaming)
  • 供给端响应流(Response Streaming)
  • 双向流式通讯(Bidirectional Streaming)

TCP (Dubbo2)

Dubbo2 协议是依据 TCP 传输层协议之上构建的一套 RPC 通讯协议,因为其紧凑、灵敏、高性能的特色,在 Dubbo2 时代取得了十分广泛的运用,是企业构建高性能、大规模微服务集群的关键通讯方案。在云原生时代,咱们更引荐运用通用性、穿透性更好的 Triple 协议。

gRPC

你能够用 Dubbo 开发和办理微服务,然后设置运用 gRPC 协议进行底层通讯。但为什么要这么做那,与直接运用 gRPC 结构比照有什么优势?简略的答案是,这是运用 gRPC 进行微服务开发的常用形式,具体请往下看。

gRPC 是谷歌开源的依据 HTTP/2 的通讯协议,好像咱们在产品比照 [ 1] 文档中提到的,gRPC 的定位是通讯协议与实现,是一款纯粹的 RPC 结构,而 Dubbo 定位是一款微服务结构,为微服务实践供给解决方案。因而,比较于 Dubbo,gRPC 相对短缺了微服务编程模型、服务办理等才能的笼统。

在 Dubbo 体系下运用 gRPC 协议 (gRPC over Dubbo Framework) 是一个十分高效和轻量的挑选,它让你既能运用原生的 gRPC 协议通讯,又避免了依据 gRPC 进行二次定制与开发的复杂度 (二次开发与定制 gRPC,是很多企业规模化实践后证明不行避免的环节,Dubbo 结构替开发者完结了这一步,让开发者能够直接以最简略的方式运用 gRPC)。

REST

微服务领域常用的一种通讯形式是 HTTP + JSON,包括 Spring Cloud、Microprofile 等一些干流的微服务结构都默许运用的这种通讯形式,Dubbo 同样供给了对依据 HTTP 的编程、通讯形式的支撑。

其他通讯协议

除了以上介绍的几种协议之外,你还能够将以下协议运行在 Dubbo 之上。对 Dubbo 而言,只需求修正一行简略的装备,就能够切换底层服务的通讯协议,其他外围 API 和办理才能不受影响。

  • Hessian2
  • Thrift
  • JsonRPC

单端口多协议

自 Dubbo 3.2 版别开端,Dubbo 供给了单个端口上的协议复用才能,经过调整 Protocol 装备即可实现。

比方在敞开 HTTP/2 (Triple) 协议 或 gRPC 协议后,如咱们一起发动端口复用,还能够在相同的端口上为服务增加 TCP (Dubbo2) 协议、Qos 协议的支撑。这些所有流量的进口都在一个共同 port 端口, Dubbo 结构担任在端口之上辨认不同的 RPC 协议,并进行处理器分发,然后实现单个端口上的协议复用。

关于需求处理多个协议的场景,端口复用十分有价值。它能够用于服务的协议搬迁,而且能够节约端口以及相关的资源,减少运维的复杂性等。

实现原理

以下是端口复用实现的原理图

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?

  • 在服务的创立阶段,经过从 Config 层获取到服务导出的协议装备然后创立不同的 Protocol 对象进行导出。在导出的过程中,假如不是第一次创立端口复用的 Server,那么 Exchanger 会将 Protcol 层传递的数据保存到 Server,用于后续处理该协议类型的音讯。
  • 当客户端的音讯传递过来后,首要会经过 Server 传递给 ProtocolDetector,假如完结了辨认,那么就会标记该客户端为对应的协议。并经过 WireProtocol 装备对应的处理逻辑,最终交给 ChannelOperator 完结底层的 IO 结构和对应的 Dubbo 结构的处理逻辑的绑定。
  • 以上的协议辨认完结之后,Channel 已经确认了如何处理长途的客户端音讯,经过对应的 ServerPipeline 进行处理即可(在处理的过程中也会依据装备信息决议音讯的处理线程)。

运用场景

以下是几种常见的运用场景。

  • 最常用的是用于服务发现。这允许运用程序经过网络发现服务,然后运用同一端口与它们通讯,有助于下降网络通讯的复杂性,并使其更易于办理。
  • 能够用于负载平衡。这允许运用程序在多个长途服务或服务集群之间平衡负载,有助于提高服务的可扩展性、可靠性和可用性。
  • 能够用于服务监控。这允许运用程序监督长途服务的运行状况,并在服务呈现毛病或变得不行用时宣布警报,有助于保证服务的可用性并减少停机时间。

参阅用例:
github.com/apache/dubb…

运用方式

在同一主机上布置多个服务或需求经过负载均衡器访问多个服务。

关于 Dubbo 支撑的装备方式 装备阐明 [ 2]

服务多协议导出

ext-protocol 参数支撑装备多个不同的协议,协议之间经过”,”进行分隔。

xml 装备

<dubbo:protocol name="dubbo" port="-1" ext-protocol="tri,"/>
<bean id="greetingService" class="org.apache.dubbo.demo.provider.GreetingServiceImpl"/>
<dubbo:service delay="5000" version="1.0.0" group="greeting" timeout="5000" interface="org.apache.dubbo.demo.GreetingService" ref="greetingService" protocol="dubbo"/>

API 装备

ProtocolConfig config = new ProtocolConfig(CommonConstants.TRIPLE, -1);
config.setExtProtocol(CommonConstants.DUBBO+",");

yaml 装备

dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: tri
    port: -1
    ext-protocol: dubbo,

properties 装备

dubbo.protocol.name=tri
dubbo.protocol.ext-protocol=dubbo,
dubbo.protocol.port=20880

Qos 接入

Qos 模块导入

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-qos</artifactId>
</dependency>

完结 Qos 模块的导入之后,相关的装备项可参阅**Qos 操作手册 [ 3] **进行装备。

默许情况下,依据端口复用的 Qos 服务在模块导入后是发动的。

Qos 运用

将 Qos 协议接入到端口复用的场景下,需求在树立连接之后,客户端先向服务端发送音讯,比照将 Qos 协议经过单个端口供给服务,端口复用版的 Qos 协议在处理 telnet 连接的情况下需求用户履行一些操作,完结协议辨认(二选一)。

1.直接调用指令
直接调用 telnet 支撑的指令也能够完结辨认,在用户不熟悉的情况下能够调用 help 指令完结辨认

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?

  1. 发送 telnet 指令辨认
    经过 telnet 指令树立连接之后,履行以下几个过程:

    1. 运用 crtl + “]” 进入到 telnet 交互界面(telnet 默许的 escape character)
    2. 调用 “send ayt” 向服务端发送特殊辨认字段(为 telnet 协议的一个特殊字段)
    3. 回车完结音讯发送并进入到 dubbo 的交互界面

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?

服务引证

以**dubbo-samples-port-unification [ 4] **中的例子作为基础, 引证不同协议的服务和非端口复用情况下的装备是共同的,下面经过 Consumer 端的 InvokerListener 输出调用过程中的 URL 信息。

ReferenceConfig<GreetingService> reference = new ReferenceConfig<>();
reference.setInterface(GreetingService.class);
reference.setListener("consumer");
reference.setProtocol(this.protocol);
// reference.setProtocol(CommonConstants.DUBBO);
// reference.setProtocol(CommonConstants.TRIPLE);

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?

总结

关于微服务实践中经常会遇到的多协议通讯的场景,Dubbo 不绑定协议的规划让用户能够灵敏的挑选通讯协议,整个协议挑选过程对上层 API 编码与运维办理彻底透明;关于要在一个集群内一起处理多个协议的场景,Dubbo 的多协议支撑也能够从容应对,而单端口的多协议复用支撑进一步简化了这一过程。

在接下来的一篇文章中,咱们将具体介绍如安在 Dubbo 结构中开发 gRPC 协议通讯的服务,极大的简化了 gRPC 微服务开发本钱,避免了二次开发,为原生 gRPC 供给了共同的编程 API 与开箱即用的服务办理才能。

相关链接:

[1]产品比照

cn.dubbo.apache.org/zh-cn/overv…

[2]装备阐明

cn.dubbo.apache.org/zh-cn/overv…

[3]Qos 操作手册

cn.dubbo.apache.org/zh-cn/overv…

[4]dubbo-samples-port-unification

github.com/apache/dubb…