端口协议复用
功能描述
通过配置协议,dubbo3 可以支持端口协议复用。例如,使用 Triple 协议启用端口复用后,可以添加 Dubbo 协议支持和 Qos 协议支持。这些协议通过统一的端口复用进行识别,可以用于服务协议迁移,由服务器处理,可以节省端口和相关资源,降低运维复杂度。
在服务创建阶段,通过从 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 连接。在某些情况下,用户需要执行一些操作来完成协议识别(选择其中之一)。
直接调用命令
识别也可以通过直接调用 telnet 支持的命令来完成。如果用户不熟悉,可以调用 help 命令来完成识别。
发送 telnet 命令识别
通过 telnet 命令建立连接后,执行以下步骤
- 使用 crtl + “]” 进入 telnet 交互界面(telnet 默认转义字符)
- 调用 “send ayt” 向服务器发送特殊识别字段(telnet 协议的特殊字段)
- 按 Enter 键完成消息发送并进入 dubbo 的交互界面
服务引用
基于 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);