Dubbo總結

Dubbo

1. 什麼是Dubbo

Dubbo是一個分佈式服務架構,致力於提供高性能和透明化的PRC遠程服務調用方案,以及SOA(程序不一樣單元和功能經過約定的接口聯繫起來)服務治理方案。git

1.1系統間通訊

soa架構:
面向服務的架構,它將應用程序的不一樣功能單元(稱爲服務)經過這些服務之間定義良好的接口和契約聯繫起來。接口是採用中立的方式進行定義的,它應該獨立於實現服務的硬件平臺、操做系統和編程語言。這使得構建在各類這樣的系統中的服務能夠以一種統一和通用的方式進行交互。
如何實現遠程通訊:github

  1. Webservice:效率不高基於soap協議。項目中不推薦使用。
  2. 使用restful形式的服務:http+json。不少項目中應用。若是服務太多,服務之間調用關係混亂,須要治療服務。
  3. 使用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就是資源調度和治理中心的管理工具
dubboweb

  • Provider: 暴露服務的服務提供方。
  • Consumer: 調用遠程服務的服務消費方。
  • Registry: 服務註冊與發現的註冊中心。
  • Monitor: 統計服務的調用次調和調用時間的監控中心。
  • Container: 服務運行容器。
    註冊中心
    註冊中心負責服務地址的註冊與查找,至關於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小。使用dubbo-2.3.3以上版本,建議使用zookeeper註冊中心。
    Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變動推送,適合做爲Dubbo服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用
    Zookeeper的安裝:
    第一步:安裝jdk
    第二步:解壓縮zookeeper壓縮包
    第三步:將conf文件夾下zoo_sample.cfg複製一份,更名爲zoo.cfg
    第四步:修改配置dataDir屬性,指定一個真實目錄spring

    Dubbo原理(使用zookeeper作註冊中心)

    zookeeper

    Dubbo經常使用配置介紹

  1. <dubbo:service/> 服務配置,用於暴露服務。
  2. <dubbo:reference/> 引用配置,用於建立一個遠程服務代理
  3. <dubbo:protocol/> 協議配置,用於配置提供服務的協議信息,協議由提供方指定,消費方被動接受。
  4. <dubbo:application/> 應用配置,用於配置當前應用信息,無論該應用是提供者仍是消費者。
  5. <dubbo:module/> 模塊配置,用於配置當前模塊信息,可選。
  6. <dubbo:registry/> 註冊中心配置,用於配置鏈接註冊中心相關信息。
  7. <dubbo:monitor/> 監控中心配置,用於配置鏈接監控中心相關信息,可選。
  8. <dubbo:provider/> 提供方的缺省值,當ProtocolConfig和ServiceConfig某屬性沒有配置時,採用此缺省值,可選。
  9. <dubbo:consumer/> 消費方缺省配置,當ReferenceConfig某屬性沒有配置時,採用此缺省值,可選。
  10. <dubbo:method/> 方法配置,用於ServiceConfig和ReferenceConfig指定方法級的配置信息。
  11. <dubbo:argument/> 用於指定方法參數配置。

Dubbo的spring配置

Dubbo基於spring的schema擴展進行加載
單一工程中的spring配置apache

<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。
而後提供方暴露服務: 編程

<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>

消費方引用服務: json

<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>
相關文章
相關標籤/搜索