全站資源開放下載,感謝廣大網友的支持
鏈接失效請移步職業司平臺
非盈利平臺

非盈利平臺

只為分享一些優質內容

Java幫幫-微信公眾號

Java幫幫-微信公眾號

將分享做到極致

微信小程序

微信小程序

更方便的閱讀

職業司微信公眾號

職業司微信公眾號

實時動態通知

安卓APP

安卓APP

我們從此不分開

程序員生活志-公眾號

程序員生活志-公眾號

程序員生活學習圈,互聯網八卦黑料

支付寶贊助-Java幫幫社區
微信贊助-Java幫幫社區

Dubbo入門-協議&注冊中心(1)

60
發表時間:2018-05-15 11:53

Dubbo入門-協議&注冊中心

一、配置dubbo多協議模式


1、默認協議

Dubbo缺省協議采用單一長連接和NIO異步通訊,適合于小數據量大并發的服務調用,以及服務消費者機器數遠大于服務提供者機器數的情況。Dubbo缺省協議不適合傳送大數據量的服務,比如傳文件,傳視頻等,除非請求量很低。

  • <dubbo:service connections=”0”>或<dubbo:reference connections=”0”>表示該服務使用JVM共享長連接。(缺省)

  • <dubbo:service connections=”1”>或<dubbo:reference connections=”1”>表示該服務使用獨立長連接。

  • <dubbo:service connections=”2”>或<dubbo:reference connections=”2”>表示該服務使用獨立兩條長連接。

 為防止被大量連接撐掛,可在服務提供方限制大接收連接數,以實現服務提供方自我保護。


缺省協議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。

  • 連接個數:單連接

  • 連接方式:長連接

  • 傳輸協議:TCP

  • 傳輸方式:NIO異步傳輸

  • 序列化:Hessian二進制序列化

  • 適用范圍:傳入傳出參數數據包較小(建議小于100K),消費者比提供者個數多,單一消費者無法壓滿提供者,盡量不要用dubbo協議傳輸大文件或超大字符串。

  • 適用場景:常規遠程服務方法調用

為什么要消費者比提供者個數多:
因dubbo協議采用單一長連接,
假設網絡為千兆網卡(1024Mbit=128MByte),
根據測試經驗數據每條連接最多只能壓滿7MByte(不同的環境可能不一樣,供參考),
理論上1個服務提供者需要20個服務消費者才能壓滿網卡。

為什么不能傳大包:
因dubbo協議采用單一長連接,
如果每次請求的數據包大小為500KByte,假設網絡為千兆網卡(1024Mbit=128MByte),每條連接最大7MByte(不同的環境可能不一樣,供參考),
單個服務提供者的TPS(每秒處理事務數)最大為:128MByte / 500KByte = 262。
單個消費者調用單個服務提供者的TPS(每秒處理事務數)最大為:7MByte / 500KByte = 14。
如果能接受,可以考慮使用,否則網絡將成為瓶頸。

為什么采用異步單一長連接:
因為服務的現狀大都是服務提供者少,通常只有幾臺機器,
而服務的消費者多,可能整個網站都在訪問該服務,
比如Morgan的提供者只有6臺提供者,卻有上百臺消費者,每天有1.5億次調用,
如果采用常規的hessian服務,服務提供者很容易就被壓跨,
通過單一連接,保證單一消費者不會壓死提供者,
長連接,減少連接握手驗證等,
并使用異步IO,復用線程池,防止C10K問題。

(1) 約束:

  • 參數及返回值需實現Serializable接口

  • 參數及返回值不能自定義實現List, Map, Number, Date, Calendar等接口,只能用JDK自帶的實現,因為hessian會做特殊處理,自定義實現類中的屬性值都會丟失。()

  • Hessian序列化,只傳成員屬性值和值的類型,不傳方法或靜態變量,兼容情況:


  • 總結:會拋異常的情況:枚 舉值一邊多一種,一邊少一種,正好使用了差別的那種,或者屬性名相同,類型不同

接口增加方法,對客戶端無影響,如果該方法不是客戶端需要的,客戶端不需要重新部署;
輸入參數和結果集中增加屬性,對客戶端無影響,如果客戶端并不需要新屬性,不用重新
部署;
輸入參數和結果集屬性名變化,對客戶端序列化無影響,但是如果客戶端不重新部署,不管輸入還是輸出,屬性名變化的屬性值是獲取不到的。
總結:服務器端和客戶端對領域對象并不需要完全一致,而是按照最大匹配原則。

(2) 配置:
dubbo.properties:

dubbo.service.protocol=dubbo


2、 rmi協議



RMI協議采用JDK標準的java.rmi.*實現,采用阻塞式短連接和JDK標準序列化方式。


  • 如果服務接口繼承了java.rmi.Remote接口,可以和原生RMI互操作,即:

    • 提供者用Dubbo的RMI協議暴露服務,消費者直接用標準RMI接口調用,

    • 或者提供方用標準RMI暴露服務,消費方用Dubbo的RMI協議調用。

  • 如果服務接口沒有繼承java.rmi.Remote接口,

    • 缺省Dubbo將自動生成一個com.xxx.XxxService$Remote的接口,并繼承java.rmi.Remote接口,并以此接口暴露服務,

    • 但如果設置了<dubbo:protocol name="rmi" codec="spring" />,將不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服務,和Spring兼容。



Java標準的遠程調用協議。

  • 連接個數:多連接

  • 連接方式:短連接

  • 傳輸協議:TCP

  • 傳輸方式:同步傳輸

  • 序列化:Java標準二進制序列化

  • 適用范圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。

  • 適用場景:常規遠程服務方法調用,與原生RMI服務互操作

(1) 約束:

  • 參數及返回值需實現Serializable接口

  • dubbo配置中的超時時間對rmi無效,需使用java啟動參數設置:-Dsun.rmi.transport.tcp.responseTimeout=3000,參見下面的RMI配置。


3、 hessian協議

Hessian協議用于集成Hessian的服務,Hessian底層采用Http通訊,采用Servlet暴露服務,Dubbo缺省內嵌Jetty作為服務器實現。


Hessian是Caucho開源的一個RPC框架:http://hessian.caucho.com,其通訊效率高于WebService和Java自帶的序列化。

可以和原生Hessian服務互操作,即:

  • 提供者用Dubbo的Hessian協議暴露服務,消費者直接用標準Hessian接口調用,

  • 或者提供方用標準Hessian暴露服務,消費方用Dubbo的Hessian協議調用。

基于Hessian的遠程調用協議。

  • 連接個數:多連接

  • 連接方式:短連接

  • 傳輸協議:HTTP

  • 傳輸方式:同步傳輸

  • 序列化:Hessian二進制序列化

  • 適用范圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。

  • 適用場景:頁面傳輸,文件傳輸,或與原生hessian服務互操作

(1) 約束:

  • 參數及返回值需實現Serializable接口

  • 參數及返回值不能自定義實現List, Map, Number, Date, Calendar等接口,只能用JDK自帶的實現,因為hessian會做特殊處理,自定義實現類中的屬性值都會丟失。

注意,如果使用servlet派發請求:

  • 協議的端口<dubbo:protocol port="8080" />必須與servlet容器的端口相同,

  • 協議的上下文路徑<dubbo:protocol contextpath="foo" />必須與servlet應用的上下文路徑相同。

4、http協議

  此協議采用spring 的HttpInvoker的功能實現,

 連接個數:多個

 連接方式:長連接

 連接協議:http

 傳輸方式:同步傳輸

 序列化:表單序列化

 適用范圍:傳入傳出參數數據包大小混合,提供者比消費者個數多,可用瀏覽器查看,可用表單或URL傳入參數,暫不支持傳文件。

 適用場景:需同時給應用程序和瀏覽器js使用的服務。

5、Rest協議

 當當網開發的Dubbox提供了Rest協議,支持REST風格遠程調用(HTTP + JSON/XML):基于非常成熟的JBoss RestEasy框架,在dubbo中實現了REST風格(HTTP + JSON/XML)的遠程調用,以顯著簡化企業內部的跨語言交互,同時顯著簡化企業對外的Open API、無線API甚至AJAX服務端等等的開發。事實上,這個REST調用也使得Dubbo可以對當今特別流行的“微服務”架構提供基礎性支持。


6、thrift協議

當前 dubbo 支持的 thrift 協議是對 thrift 原生協議的擴展,在原生協議的基礎上添加了一些額外的頭信息,比如service name,magic number等。使用dubbo thrift協議同樣需要使用thrift的idl compiler編譯生成相應的java代碼,后續版本中會在這方面做一些增強


Thrift不支持數據類型:

  • null值 (不能在協議中傳遞null值)

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

   xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

   xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

 

   <!-- 提供方應用信息,用于計算依賴關系 -->  

   <dubbo:application name="hello-world-app"  />  

 

   <!-- 使用multicast廣播注冊中心暴露服務地址 -->  

   <dubbo:registry address="zookeeper://127.0.0.1:2181" />    

 

   <!-- 用dubbo協議在20880端口暴露服務 -->  

   <dubbo:protocol name="dubbo" port="20880" />  

    <dubbo:protocol name="rmi" port="1099" />  

  <dubbo:protocol name="http" port="1199" />  

   <dubbo:protocol name="hessian" port="8080" />  

<!-- 聲明需要暴露的服務接口 ,若選擇hessian協議,需要加入hessian包-->    

     <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"   protocol="hessian"/>    

   

   <!-- 和本地bean一樣實現服務 -->    

   <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />    

     

<!-- 掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 -->  

<dubbo:annotation package="com.alibaba.dubbo.annotation.service" />  

</beans>

同服務使用多協議

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

   xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

   xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

 

   <dubbo:application name="world"  />  

   <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />  

 

   <!-- 多協議配置 -->  

   <dubbo:protocol name="dubbo" port="20880" />  

   <dubbo:protocol name="hessian" port="8080" />  

 

   <!-- 使用多個協議暴露服務 -->  

   <dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />  

</beans>  


二、多注冊中心


同時向2個注冊中心,注冊服務,這樣,2個注冊中心都擁有此服務

同樣,不同的服務可以注冊到不同的注冊中心,比如:CRM有些服務是專門為國際站設計的,有些服務是專門為中文站設計的(官方文檔舉得例子)。

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

   xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

   xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

 

   <!-- 提供方應用信息,用于計算依賴關系 -->  

   <dubbo:application name="hello-world-app"  />  

 

   <!-- 使用multicast廣播注冊中心暴露服務地址 -->  

   <dubbo:registry  id="localhost"  address="zookeeper://127.0.0.1:2181" />    

  <dubbo:registry id="localcomputer"  address="192.168.0.12:9010" default="false" />  

   <!-- 用dubbo協議在20880端口暴露服務 -->  

   <dubbo:protocol name="dubbo" port="20880" />  

    <dubbo:protocol name="rmi" port="1099" />  

 <!-- 聲明需要暴露的服務接口 -->    

   <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"   protocol="rmi" registry="localhost,localcomputer" />    

   

   <!-- 和本地bean一樣實現服務 -->    

   <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />    

     

<!-- 掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 -->  

<dubbo:annotation package="com.alibaba.dubbo.annotation.service"  />  

</beans>

掃一掃 關注我們吧~

更多教程“閱讀原文


Java幫幫學習群生態

Java幫幫學習群生態

總有一款能幫到你

Java學習群

Java學習群

與大牛一起交流

大數據學習群

大數據學習群

在數據中成長

九點編程學習群

九點編程學習群

深夜九點學編程

python學習群

python學習群

人工智能,爬蟲

測試學習群

測試學習群

感受測試的魅力

Java幫幫生態承諾

Java幫幫生態承諾

一直堅守,不負重望

初心
勤儉
誠信
正義
分享
友鏈交換:加幫主QQ2524138991 留言即可 24小時內答復  
業司
教育資訊
會員登錄
獲取驗證碼
登錄
登錄
我的資料
留言
回到頂部