【Dubbo】Dubbo入門
一、Dubbo是什麼
-
分散式服務框架
-
高效能和透明化的RPC遠端服務呼叫方案
-
SOA服務治理方案
二、如何使用Dubbo
本地服務
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean>
遠端服務
<!-- 和本地服務一樣實現遠端服務 --> <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <!-- 增加暴露遠端服務配置 --> <dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />
<!-- 增加引用遠端服務配置 --> <dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /> <!-- 和本地服務一樣使用遠端服務 --> <bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean>
三、Dubbo能做什麼
-
透明化的遠端方法呼叫
-
就像呼叫本地方法一樣呼叫遠端方法
-
只需簡單配置,沒有任何API侵入
-
-
軟負載均衡及容錯機制
-
可在內網替代F5等硬體負載均衡器
-
-
服務自動註冊與發現
-
不再需要寫死服務提供方地址,註冊中心基於介面名查詢服務提 供者的IP地址,並且能夠平滑新增或刪除服務提供者
-
四、Dubbo基本原理
節點角色說明
節點 | 角色說明 |
---|---|
Provider |
暴露服務的服務提供方 |
Consumer |
呼叫遠端服務的服務消費方 |
Registry |
服務註冊與發現的註冊中心 |
Monitor |
統計服務的呼叫次數和呼叫時間的監控中心 |
Container |
服務執行容器 |
呼叫關係說明
-
服務容器負責啟動,載入,執行服務提供者。
-
服務提供者在啟動時,向註冊中心註冊自己提供的服務。
-
服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
-
註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
-
服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
-
服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。
特點
-
連通性
-
健壯性
-
伸縮性
-
升級性
五、Dubbo-RPC功能
1、配置
-
方法級優先,介面級次之,全域性配置再次之。
-
如果級別一樣,則消費方優先,提供方次之。
-
服務提供方配置,通過 URL 經由註冊中心傳遞給消費方。
2、服務匹配
-
服務分組、多版本
當一個介面有多種實現時,可以用group區分。
//服務提供者 <dubbo:service group="feedback" interface="com.xxx.IndexService" /> <dubbo:service group="member" interface="com.xxx.IndexService" /> //服務消費者 <dubbo:reference id=“fservice" group="feedback" interface="com.xxx.IndexService" /> <dubbo:reference id=“mservice" group="member" interface="com.xxx.IndexService" />
當一個介面實現,出現不相容升級時,可以用版本號過渡, 版本號不同的服務相互間不引用。
//服務提供者 <dubbo:service interface="com.foo.BarService" version="1.0.0" /> <dubbo:service interface="com.foo.BarService" version="2.0.0" /> //服務消費者 <dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" /> <dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
-
只訂閱
共用註冊中心, 開發人員機器上的服務提供者被誤 調, 影響其他開發人員(開發、 測試環境)
<dubbo:registry register="false" />
-
只註冊
如果有兩個註冊中心A,B,a服務只在其中A註冊中心有部署,B註冊中心沒有a服務,其它應用都需要依賴a服務。此時,可以讓服務提供者方只註冊服務到A註冊中心。
<dubbo:registry id="aRegistry" address="10.20.153.10:9090" /> <dubbo:registry id="bRegistry" address="10.20.141.150:9090" subscribe="false" />
3、叢集容錯
-
叢集原理
在叢集呼叫失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試。
各節點關係:
-
這裡的
Invoker
是Provider
的一個可呼叫Service
的抽象,Invoker
封裝了Provider
地址及Service
介面資訊 -
Directory
代表多個Invoker
,可以把它看成List<Invoker>
,但與List
不同的是,它的值可能是動態變化的,比如註冊中心推送變更 -
Cluster
將Directory
中的多個Invoker
偽裝成一個Invoker
,對上層透明,偽裝過程包含了容錯邏輯,呼叫失敗後,重試另一個 -
Router
負責從多個Invoker
中按路由規則選出子集,比如讀寫分離,應用隔離等 -
LoadBalance
負責從多個Invoker
中選出具體的一個用於本次呼叫,選的過程包含了負載均衡演算法,呼叫失敗後,需要重選
模式 | 說明 |
---|---|
Failfast Cluster | 快速失敗,只發起一次呼叫,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。 |
Failsafe Cluster | 失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作。 |
Failback Cluster | 失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於訊息通知操作。 |
Forking Cluster | 並行呼叫多個伺服器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設定最大並行數。 |
Broadcast Cluster | 廣播呼叫所有提供者,逐個呼叫,任意一臺報錯則報錯 [2]。通常用於通知所有提供者更新快取或日誌等本地資源資訊。 |
4、協議
dubbo://
Dubbo 預設協議,採用單一長連線和 NIO 非同步通訊
適用場景
-
適合:常規遠端服務方法呼叫,小資料量(< 100K)大併發的服務呼叫,以及服務消費者機器數遠大於服務提供者機器數的情況
-
不適合:傳送大資料量的服務,比如傳檔案,傳視訊等,除非請求量很低。
特性
-
單連線 、長連線 、TCP協議
-
NIO非同步傳輸 、 Hessian二進位制序列化
rmi://
RMI 協議,採用 JDK 標準的 java.rmi.* 實現,採用阻塞式短連線和 JDK 標準序列化方式
適用場景
-
常規遠端服務方法呼叫,與原生RMI服務互操作
-
傳入傳出引數資料包大小混合,消費者與提供者個數差不多,可傳檔案
特性
-
多連線 、 短連線 、TCP協議
-
同步傳輸 、 Java標準二進位制序列化
hessian://
Hessian協議,用於整合 Hessian 的服務,Hessian 底層採用 Http 通訊,採用 Servlet 暴露服務,Dubbo 預設內嵌 Jetty 作為伺服器實現。
適用場景
-
傳入傳出引數資料包較大,提供者比消費者個數多,提供者壓力較大,可傳檔案
-
頁面傳輸,檔案傳輸,或與原生hessian服務互操作
特性
-
多連線 、 短連線 、 HTTP協議
-
同步傳輸 、 Hessian二進位制序列化
http://
基於 HTTP 表單的遠端呼叫協議,採用 Spring 的 HttpInvoker 實現
適用場景
-
傳入傳出引數資料包大小混合,提供者比消費者個數多,可用瀏覽器檢視,可用表單或URL傳入引數,暫不支援傳檔案
-
需同時給應用程式和瀏覽器 JS 使用的服務
特性
-
多連線 、 短連線 、HTTP協議
-
同步傳輸 、 表單序列化
webservice://
基於 WebService 的遠端呼叫協議,基於 Apache CXF 的 frontend-simple 和 transports-http 實現
適用場景
-
系統整合,跨語言呼叫
特性
-
多連線 、 短連線 、 HTTP協議
-
同步傳輸 、 SOAP文字序列化
thrift://
當前 dubbo 支援的thrift 協議是對 thrift 原生協議的擴充套件,在原生協議的基礎上添加了一些額外的頭資訊
memcached://
基於 memcached 實現的 RPC 協議
redis://
基於 Redis [1] 實現的 RPC 協議
rest://
基於標準的Java REST API——JAX-RS 2.0 實現的REST呼叫支援
Dubbo預設通訊協議是dubbo,是單一長連線NIO非同步傳輸的,解決了大併發小資料量的常規服務呼叫,防止C10K問題。
如果需要傳檔案,可以用Hessian;需要頁面也呼叫的,用http;需要跨語言呼叫的,用webservice;這幾個都是多連線短連線形式的。
5、多協議
-
不同服務不同協議
不同服務在效能上適用不同協議進行傳輸,比如大資料用短連線協議,小資料大併發用長連線協議。
<?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://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/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="rmi" port="1099" /> <!-- 使用dubbo協議暴露服務 --> <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" /> <!-- 使用rmi協議暴露服務 --> <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /> </beans>
-
同一服務多協議暴露
比如:需要與http客戶端互操作
<?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://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/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>
六、 註冊中心
zookeeper註冊中心
Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境。
流程說明:
-
服務提供者啟動時: 向
/dubbo/com.foo.BarService/providers
目錄下寫入自己的 URL 地址 -
服務消費者啟動時: 訂閱
/dubbo/com.foo.BarService/providers
目錄下的提供者 URL 地址。並向/dubbo/com.foo.BarService/consumers
目錄下寫入自己的 URL 地址 -
監控中心啟動時: 訂閱
/dubbo/com.foo.BarService
目錄下的所有提供者和消費者 URL 地址。
支援以下功能:
-
當提供者出現斷電等異常停機時,註冊中心能自動刪除提供者資訊
-
當註冊中心重啟時,能自動恢復註冊資料,以及訂閱請求
-
當會話過期時,能自動恢復註冊資料,以及訂閱請求
-
當設定
<dubbo:registry check="false" />
時,記錄失敗註冊和訂閱請求,後臺定時重試 -
可通過
<dubbo:registry username="admin" password="1234" />
設定 zookeeper 登入資訊 -
可通過
<dubbo:registry group="dubbo" />
設定 zookeeper 的根節點,不設定將使用無根樹 -
支援
*
號萬用字元<dubbo:reference group="*" version="*" />
,可訂閱服務的所有分組和所有版本的提供者
其他註冊中心 | 說明 |
---|---|
Multicast 註冊中心 | Multicast 註冊中心不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現。 <dubbo:registry address="multicast://224.5.6.7:1234" /> |
Redis 註冊中心 | 使用 Redis 的 Key/Map 結構儲存資料結構, Publish/Subscribe 事件通知資料變更。 <dubbo:registry address="redis://10.20.153.10:6379" /> |
Simple 註冊中心 | Simple 註冊中心本身就是一個普通的 Dubbo 服務,可以減少第三方依賴,使整體通訊方式一致。簡單實現,不支援叢集。 |