Dubbo
1. 什么是Dubbo
Dubbo是一個分布式服務架構,致力於提供高性能和透明化的PRC遠程服務調用方案,以及SOA(程序不同單元和功能通過約定的接口聯系起來)服務治理方案。
1.1系統間通信
soa架構:
面向服務的架構,它將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯系起來。接口是采用中立的方式進行定義的,它應該獨立於實現服務的硬件平台、操作系統和編程語言。這使得構建在各種這樣的系統中的服務可以以一種統一和通用的方式進行交互。
如何實現遠程通信:
- Webservice:效率不高基於soap協議。項目中不推薦使用。
- 使用restful形式的服務:http+json。很多項目中應用。如果服務太多,服務之間調用關系混亂,需要治療服務。
- 使用dubbo。使用rpc協議進行遠程調用,直接使用socket通信。傳輸效率高,並且可以統計出系統之間的調用關系、調用次數。
涉及概念:
- soap:SOAP 最初代表“簡單對象訪問協議” SOAP 利用 XML 技術定義一種可擴展的消息處理框架,它提供了一種可通過多種底層協議進行交換的消息結構。 使用http協議傳輸xml文本的技術
- restful:一種軟件架構風格,設計風格而不是標准,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。
- rpc:(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
三種方式的區別比較
底層傳輸協議 | 傳輸速度 | 特點 | 共同點 | 適用場景 | |
socket | UDP或TCP | 最快 | 開發步驟繁瑣 | 被多種操作系統/開發語言支持 | socket適用於對傳輸速度和執行效率要求高的場合。如高並發、大流量的Client - Server通信。 |
Rest WebService | HTTP | 一般 | 非標准 | (同上) | Rest WebService適用於開發專用的系統或功能,或者移動客戶端(手機/平板等)與服務器的通信。 Rest WebService的數據傳輸量比傳統WebService要小,有利於節約流量。 |
傳統WebService | SOAP | 最慢 | 標准,通用 | 標准,通用 | 傳統WebService適用於開發傳統的web項目或者通用功能(如天氣預報、手機號歸屬地查詢等便民服務)。 它是四種遠程調用技術中在互聯網上應用最為廣泛的。 |
Dubbo架構
當服務增多,需要管理服務,提高機器利用率,資源調度和治理中心(SOA)是關鍵
Dubbo就是資源調度和治理中心的管理工具
- Provider: 暴露服務的服務提供方。
- Consumer: 調用遠程服務的服務消費方。
- Registry: 服務注冊與發現的注冊中心。
- Monitor: 統計服務的調用次調和調用時間的監控中心。
- Container: 服務運行容器。
注冊中心
注冊中心負責服務地址的注冊與查找,相當於目錄服務,服務提供者和消費者只在啟動時與注冊中心交互,注冊中心不轉發請求,壓力較小。使用dubbo-2.3.3以上版本,建議使用zookeeper注冊中心。
Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變更推送,適合作為Dubbo服務的注冊中心,工業強度較高,可用於生產環境,並推薦使用
Zookeeper的安裝:
第一步:安裝jdk
第二步:解壓縮zookeeper壓縮包
第三步:將conf文件夾下zoo_sample.cfg復制一份,改名為zoo.cfg
第四步:修改配置dataDir屬性,指定一個真實目錄
Dubbo原理(使用zookeeper做注冊中心)
Dubbo常用配置介紹
- <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/> 用於指定方法參數配置。
Dubbo的spring配置
Dubbo基於spring的schema擴展進行加載
單一工程中的spring配置
<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
<beans xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation=
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd>
<!-- 和本地服務一樣實現遠程服務 -->
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<!-- 使用dubbo發布服務 -->
<!-- 提供方應用信息,用於計算依賴關系 -->
<dubbo:application name="hello-world-app" />
<dubbo:registry protocol="zookeeper"
address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183" />
<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
<beans>
消費方引用服務:dubbo:reference
<dubbo:application name="hello-world-app"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"/>
<!-- 增加引用遠程服務配置 -->
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
<!-- 和本地服務一樣使用遠程服務 -->
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
框架整合
maven添加Dubbo依賴:
<!-- dubbo相關 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<!-- 排除依賴 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>