除了 Dubbo 服務暴露協議 Dubbo 協議外,Dubbo 框架還支持另外 8 種服務暴露協議:
RMI 協議、Hessian 協議、HTTP 協議、WebService 協議、Thrift 協議、Memcached 協議、Redis
協議、Rest 協議。但在實際生產中,使用最多的就是 Dubbo 服務暴露協議。
1.各個協議的特點
小數據大併發使用 Dubbo,大數據小併發使用其它。
(1 ) dubbo 協議
- Dubbo 默認傳輸協議
- 連接個數:單連接
- 連接方式:長連接
- 傳輸協議:TCP
- 傳輸方式:NIO 異步傳輸
- 適用範圍:傳入傳出參數數據包較小(建議小於 100K),消費者比提供者個數多,單一
- 消費者無法壓滿提供者,儘量不要用 dubbo 協議傳輸大文件或超大字符串。
(2 ) rmi 協議
- 採用 JDK 標準的 java.rmi.* 實現
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:TCP
- 傳輸方式:BIO 同步傳輸
- 適用範圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。
(3 ) hession 協議
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:HTTP
- 傳輸方式:BIO 同步傳輸
- 適用範圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者抗壓能力較大,
可傳文件
(4 ) http 協議
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:HTTP
- 傳輸方式:BIO 同步傳輸
- 適用範圍:傳入傳出參數數據包大小混合,提供者比消費者個數多,可用瀏覽器查看,可用表單或 URL 傳入參數,暫不支持傳文件。
(5 ) webService 協議
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:HTTP
- 傳輸方式:BIO 同步傳輸
- 適用場景:系統集成,跨語言調用
(6 ) thrift 協議
Thrift 是 Facebook 捐給 Apache 的一個 RPC 框架,其消息傳遞採用的協議即爲 thrift
協議。當前 dubbo 支持的 thrift 協議是對 thrift 原生協議的擴展。Thrift 協議不支持 null
值的傳遞。
(7 ) memcached 協議與 redis 協議
它們都是高效的 KV 緩存服務器。它們會對傳輸的數據使用相應的技術進行緩存。
(8 ) rest 協議
若需要開發具有 RESTful 風格的服務,則需要使用該協議。
2.同一服務支持多種協議
2.1 應用場景
系統在使用過程中其使用場景逐漸發生了變化,
例如,由原來的消費者數量多於提供者數量,變爲了消費者數量與提供者數量差不多了,並且原來系統不用傳輸文件,現在的系統需要傳輸文件了。此時就將將原來默認的 dubbo協議更換爲 rmi協議。
目的是爲了兼容老工程,擴展新功能。
2.2 修改提供者配置文件
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:protocol name="rim" port="1099"/>
<bean id="someService" class="com.abc.provider.SomeServiceImpl"/>
<dubbo:service interface="com.abc.service.SomeService" ref="someService" protocol="dubbo,rim"/>
消費者若要連接當前的服務,就需要通過這裏指定的協議及端口號進行訪問。這裏的端口號可以是任意的,不一定非要使用默認的端口號(Dubbo默認爲20880,rmi默認爲1099)。這裏指定的協議名稱及端口號,在當前服務註冊到註冊中心時會一併寫入到服務映射表中。
當消費者根據服務名稱查找到相應主機時,其同時會查詢出消費此服務的協議、端口號等信息。其底層就是一個 Socket 編程,通過主機名與端口號進行連接。
2.3 修改消費者配置文件
<!--指定消費0.0.1版本,即oldService提供者-->
<dubbo:reference id="someService" version="0.0.1" protocol="dubbo"
interface="com.abc.service.SomeService" />
<!--指定消費0.0.2版本,即newService提供者-->
<dubbo:reference id="someService" version="0.0.2" protocol="rim"
interface="com.abc.service.SomeService"/>
3.不同服務使用不同協議
3.1應用場景
同一個系統中不同的業務具有不同的特點,所以它們的傳輸協議就應該根據它們的特點
選擇不同的協議。
例如對於前面使用服務分組實現的“微信支付”與“支付寶支付”,就可以針對不同的支付方式,使用不同的協議。
3.2 修改提供者配置文件
<dubbo:protocol name="dubbo" port="1111"/>
<dubbo:protocol name="rim" port="2222"/>
<!--註冊Service實現類-->
<bean id="weixinService" class="com.abc.provider.WeixinServiceImpl"/>
<bean id="zhifubaoService" class="com.abc.provider.ZhifubaoServiceImpl"/>
<!--暴露服務-->
<dubbo:service interface="com.abc.service.SomeService"
ref="weixinService" protocol="dubbo"/>
<dubbo:service interface="com.abc.service.SomeService"
ref="zhifubaoService" protocol="rim"/>
3.3 修改消費者配置文件
<!--指定調用微信服務-->
<dubbo:reference id="weixin" protocol="dubbo"
interface="com.abc.service.SomeService"/>
<!--指定調用支付寶服務-->
<dubbo:reference id="zhifubao" protocol="rim"
interface="com.abc.service.SomeService"/>