連接埠協定多工
功能說明
透過配置協定,dubbo3 可以支援連接埠協定多工。例如,使用 Triple 協定啟用連接埠多工後,可以新增 Dubbo 協定支援和 Qos 協定支援。這些協定透過統一的連接埠多工進行識別,可用於服務協定遷移,由伺服器端處理,可以節省連接埠和相關資源,並降低維運的複雜度。
在服務建立階段,透過從 Config 層獲取服務匯出的協定配置,建立不同的 Protocol 物件以進行匯出。在匯出過程中,如果不是第一次建立具有連接埠多工的伺服器,Exchanger 會儲存協定層傳遞給伺服器的資料,以便後續處理此協定類型的訊息。
當用戶端訊息傳遞時,它會先透過伺服器傳遞到 ProtocolDetector。如果識別完成,用戶端將被標記為對應的協定。並透過 WireProtocol 配置對應的處理邏輯,最後交給 ChannelOperator 完成底層 IO 架構與對應 Dubbo 架構處理邏輯的綁定。
完成上述協定識別後,Channel 已確定如何處理遠端用戶端訊息,可以透過對應的 ServerPipeline 進行處理(訊息的處理執行緒也將根據處理過程中的配置資訊確定)。
參考使用案例
[https://github.com/apache/dubbo-samples/tree/master/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,
屬性配置
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中的範例,引用不同協議和非端口多路復用服務的配置是一致的。接下來,將通過消費者端的 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);