Dubbo分布式服
推薦大家一個畫圖工具:https://www.processon.com/i/572d51efe4b0c3c74981ec14
1.Dubbo是一個分布式服務框架,致力於提供高性能和透明化的遠程服務調用方案,這容易和負載均衡弄混,負載均衡是對外提供一個公共地址,請求過來時通過輪詢、隨機等,路由到不同server。目的分攤壓力。dubbo在淘寶也是解決他們實際問題的,不一定適合其他。 另外各家公司也都有大同小異的實現,所以沒多少人用、也就沒多少介紹。
原理就是:A系統調用B系統接口服務, 后面就是怎么把這個流程,動態化(zookeeper通知)、權限化、配置化、低耦合化、自動化。
一.dubbo出現的背景
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分布式服務架構以及流動計算架構勢在必行,需一個治理系統確保架構有條不紊的演進。
目前市場一些基本的架構:
- 單一應用架構
- 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
- 此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。
- 垂直應用架構
- 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
- 此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
- 分布式服務架構
- 當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
- 此時,用於提高業務復用及整合的 分布式服務框架(RPC) 是關鍵。
- 流動計算架構
- 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。
- 此時,用於提高機器利用率的 資源調度和治理中心(SOA) 是關鍵。
在大規模服務化之前,一般只是簡單的暴露和引用遠程服務,通過配置url進行調用,用f5或者nginx等進行負載均衡;
二.Dubbo架構
官網架構圖:
節點角色說明:
- Provider: 暴露服務的服務提供方。
- Consumer: 調用遠程服務的服務消費方。
- Registry: 服務注冊與發現的注冊中心。
- Monitor: 統計服務的調用次調和調用時間的監控中心。
- Container: 服務運行容器。
調用關系說明:
- 0. 服務容器負責啟動,加載,運行服務提供者。
- 1. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- 2. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 3. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
- 4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
- 5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
連通性:
- 注冊中心負責服務地址的注冊與查找,相當於目錄服務,服務提供者和消費者只在啟動時與注冊中心交互,注冊中心不轉發請求,壓力較小
- 監控中心負責統計各服務調用次數,調用時間等,統計先在內存匯總后每分鍾一次發送到監控中心服務器,並以報表展示
- 服務提供者向注冊中心注冊其提供的服務,並匯報調用時間到監控中心,此時間不包含網絡開銷
- 服務消費者向注冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時匯報調用時間到監控中心,此時間包含網絡開銷
- 注冊中心,服務提供者,服務消費者三者之間均為長連接,監控中心除外
- 注冊中心通過長連接感知服務提供者的存在,服務提供者宕機,注冊中心將立即推送事件通知消費者
- 注冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
- 注冊中心和監控中心都是可選的,服務消費者可以直連服務提供者
健狀性:
- 監控中心宕掉不影響使用,只是丟失部分采樣數據
- 數據庫宕掉后,注冊中心仍能通過緩存提供服務列表查詢,但不能注冊新服務
- 注冊中心對等集群,任意一台宕掉后,將自動切換到另一台
- 注冊中心全部宕掉后,服務提供者和服務消費者仍能通過本地緩存通訊
- 服務提供者無狀態,任意一台宕掉后,不影響使用
- 服務提供者全部宕掉后,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復
三.用法
本地服務配置文件:local.xml
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
<bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean> |
遠程服務配置
在本地服務的基礎上,只需做簡單配置,即可完成遠程化:
- 將上面的local.xml配置拆分成兩份,將服務定義部分放在服務提供方remote-provider.xml,將服務引用部分放在服務消費方remote-consumer.xml。
- 並在提供方增加暴露服務配置<dubbo:service>,在消費方增加引用服務配置<dubbo:reference>。
服務者配置provider.xml:
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <!-- 和本地服務一樣實現遠程服務 -->
<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” /> <!-- 增加暴露遠程服務配置 -->
Throwbill作為服務者實例:
<bean id="iTSMService" class="com.sitech.throwbill.easyask.service.itsm.impl.ITSMServiceImpl" />
<dubbo:service interface="com.sitech.throwbill.easyask.service.itsm.ITSMService" ref="iTSMService" version="1.0">
<dubbo:method name="putChatMessage" servicecode="33.1013.putChatMessage"/>
<dubbo:method name="queryAllChatMessage" servicecode="33.1013.queryAllChatMessage"/>
</dubbo:service><!--暴露遠程服務的配置接口-->
作為服務者完整配置文件:
<?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="multicast://224.5.6.7:1234" />
<!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" />
<!-- 聲明需要暴露的服務接口 --> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<!-- 和本地bean一樣實現服務 --> <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
</beans> |
消費者配置consumer.xml:
<dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /> <!-- 增加引用遠程服務配置 -->
<bean id=“xxxAction” class=“com.xxx.XxxAction”> <!-- 和本地服務一樣使用遠程服務 -->
<property name=“xxxService” ref=“xxxService” />
</bean>
作為服務者的完整配置:
Throwbill作為消費者實例:
<bean id="easkMessageService" class="com.sitech.service.dubbo.EaskMessageServiceImpl"></bean>
<dubbo:reference id="ymItsmService" interface="com.ffcs.itsm.zj.service.EasyAsk2ItsmService" version="1.0">
<dubbo:method name="launchItsmEventFlow servicecode="33.1404.launchEventFlow"/>
<dubbo:method name="changeItsmEventState" servicecode="33.1404.changeEventFlowState" />
</dubbo:reference>
作為消費者完整配置文件:
<?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="consumer-of-helloworld-app" />
<!-- 使用multicast廣播注冊中心暴露發現服務地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 生成遠程服務代理,可以和本地bean一樣使用demoService --> <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
</beans> |
- <dubbo:service/> 服務配置,用於暴露一個服務,定義服務的元信息,一個服務可以用多個協議暴露,一個服務也可以注冊到多個注冊中心。
- <dubbo:reference/> 引用配置,用於創建一個遠程服務代理,一個引用可以指向多個注冊中心。
- <dubbo:protocol/> 協議配置,用於配置提供服務的協議信息,協議由提供方指定,消費方被動接受。
- <dubbo:application/> 應用配置,用於配置當前應用信息,不管該應用是提供者還是消費者。
- <dubbo:module/> 模塊配置,用於配置當前模塊信息,可選。
- <dubbo:registry/> 注冊中心配置,用於配置連接注冊中心相關信息。
- <dubbo:monitor/> 監控中心配置,用於配置連接監控中心相關信息,可選。
- <dubbo:provider/> 提供方的缺省值,當ProtocolConfig和ServiceConfig某屬性沒有配置時,采用此缺省值,可選。
- <dubbo:consumer/> 消費方缺省配置,當ReferenceConfig某屬性沒有配置時,采用此缺省值,可選。
- <dubbo:method/> 方法配置,用於ServiceConfig和ReferenceConfig指定方法級的配置信息。
- <dubbo:argument/> 用於指定方法參數配置。
四.注冊中心
流程:
1.服務提供者啟動時向/dubbo/com.foo.BarService/providers目錄下寫入URL
2.服務消費者啟動時訂閱/dubbo/com.foo.BarService/providers目錄下的URL向/dubbo/com.foo.BarService/consumers目錄下寫入自己的URL
3.監控中心啟動時訂閱/dubbo/com.foo.BarService目錄下的所有提供者和消費者URL
支持以下功能:
1.當提供者出現斷電等異常停機時,注冊中心能自動刪除提供者信息。
2.當注冊中心重啟時,能自動恢復注冊數據,以及訂閱請求。
3.當會話過期時,能自動恢復注冊數據,以及訂閱請求。
4.當設置<dubbo:registry check="false" />時,記錄失敗注冊和訂閱請求,后台定時重試。
5.可通過<dubbo:registry username="admin" password="1234" />設置zookeeper登錄信息。
6.可通過<dubbo:registry group="dubbo" />設置zookeeper的根節點,不設置將使用無根樹。
7.支持*號通配符<dubbo:reference group="*" version="*" />,可訂閱服務的所有分組和所有版本的提供者。
注:阿里內部並沒有采用Zookeeper做為注冊中心,而是使用自己實現的基於數據庫的注冊中心,即:Zookeeper注冊中心並沒有在阿里內部長時間運行的可靠性保障,此Zookeeper橋接實現只為開源版本提供,其可靠性依賴於Zookeeper本身的可靠性。