端口协议复用

dubbo3 端口协议复用,单端口多协议支持

功能描述

通过配置协议,dubbo3 可以支持端口协议复用。例如,使用 Triple 协议启用端口复用后,可以添加 Dubbo 协议支持和 Qos 协议支持。这些协议通过统一的端口复用进行识别,可以用于服务协议迁移,由服务器处理,可以节省端口和相关资源,降低运维复杂度。

pu-server-image1

  • 在服务创建阶段,通过从 Config 层获取服务导出的协议配置,为导出创建不同的 Protocol 对象。在导出过程中,如果不是第一次创建支持端口复用的服务器,Exchanger 会将协议层传递给服务器的数据保存起来,以便后续处理该协议类型的消息。

  • 当客户端消息传递时,它将首先通过服务器传递给 ProtocolDetector。如果识别完成,客户端将被标记为相应的协议。并通过 WireProtocol 配置相应的处理逻辑,最后交由 ChannelOperator 完成底层 IO 框架和相应 Dubbo 框架处理逻辑的绑定。

  • 完成上述协议识别后,Channel 已经确定如何处理远程客户端消息,可以通过相应的 ServerPipeline 进行处理(消息的处理线程也将根据处理过程中的配置信息确定)。

参考用例

[https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-port-unification](https://github.com/apache/dubbo-samples/tree/master/3-extensions/ protocol/dubbo-samples-port-unification)

配置方法

有关 Dubbo 支持的配置方法,请参考 配置说明

服务多协议导出

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 操作手册 配置相关配置项。

默认情况下,基于端口复用的 Qos 服务在模块导入后启动。

如何使用

Qos 使用

当 Qos 协议连接到端口复用场景时,建立连接后,客户端需要先向服务器发送消息。与通过单端口提供服务的 Qos 协议相比,端口复用版本的 Qos 协议处理 telnet 连接。在某些情况下,用户需要执行一些操作来完成协议识别(选择其中之一)。

  1. 直接调用命令

    识别也可以通过直接调用 telnet 支持的命令来完成。如果用户不熟悉,可以调用 help 命令来完成识别。

    pu-server-image2

  2. 发送 telnet 命令识别

    通过 telnet 命令建立连接后,执行以下步骤

    1. 使用 crtl + “]” 进入 telnet 交互界面(telnet 默认转义字符)
    2. 调用 “send ayt” 向服务器发送特殊识别字段(telnet 协议的特殊字段)
    3. 按 Enter 键完成消息发送并进入 dubbo 的交互界面

    pu-server-imgs3

服务引用

基于 dubbo-samples-port-unification 中的示例,引用不同协议和非端口复用的服务的配置是一致的。接下来,调用过程中的 URL 信息将通过 Consumer 端的 InvokerListener 输出。

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

pu-server-imgs4


上次修改时间:2023 年 3 月 1 日:移动 sdk 文档 (#2337) (ceab0ea115a)