Dubbo+Zookeeper入門 — 實現工程間的遠程服務調用

什麼是Dubbo

       百科釋義:Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。

        隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。


  • 單一應用架構

        • 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。

        此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。

  • 垂直應用架構

        • 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率

        • 此時,用於加速前端頁面開發的 Web框架(MVC)是關鍵

  • 分佈式服務架構

        • 當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求

        • 此時,用於提高業務複用及整合的分佈式服務框架(RPC)是關鍵

  • 流動計算架構

        • 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集羣容量,提高集羣利用率

        • 此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵

而 Dubbo 就是資源調度和治理中心的管理工具

Dubbo的架構


圖片來源:Dubbo官網

節點角色說明:

  • Provider:暴露服務的服務提供方。
  • Consumer:調用遠程服務的服務消費方。
  • Registry:服務註冊與發現的註冊中心。(Dubbo推薦使用zookeeper
  • Monitor:統計服務的調用次調和調用時間的監控中心。
  • Container:服務運行容器。

調用關係說明:

  • 0. 服務容器負責啓動,加載,運行服務提供者。
  • 1. 服務提供者在啓動時,向註冊中心註冊自己提供的服務。
  • 2. 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
  • 3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
  • 4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
  • 5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

使用方法

        Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。

單一工程中spring的配置

<bean id="xxxService" class="com.xxx.XxxServiceImpl" />

<bean id="xxxAction" class="com.xxx.XxxAction">

       <property name="xxxService" ref="xxxService" />

</bean>

遠程服務:

        在本地服務的基礎上,只需做簡單配置,即可完成遠程化:

        加入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><!-- zookeeper 作爲服務的註冊與發現中心 -->
    <artifactId>zookeeper</artifactId>
</dependency>
<dependency>
    <groupId>com.github.sgroschupf</groupId><!-- zookeeper客戶端 -->
    <artifactId>zkclient</artifactId>
</dependency>

        然後將上面的local.xml配置拆分成兩份,將服務定義部分放在服務提供方remote-provider.xml,將服務引用部分放在服務消費方remote-consumer.xml。並在提供方增加暴露服務配置<dubbo:service>,在消費方增加引用服務配置<dubbo:reference>。

發佈服務

<!-- 使用dubbo發佈服務 -->


<!-- 提供發送方應用信息,用於計算依賴關係 -->
<dubbo:application name="e3-manager" /><!-- 工程名,指定是哪個工程發佈的服務 -->
<dubbo:registry protocol="zookeeper" address="192.168.80.134:2181" /><!-- 指定註冊中心->zookeeper的IP以及端口號 -->

<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="cn.e3mall.service.ItemService" ref="itemServiceImpl" timeout="600000"/>

調用服務

<!-- 引用dubbo服務 -->
<dubbo:application name="e3-manager-web"/><!-- 工程名,指定是哪個工程調用的服務 -->

<dubbo:registry protocol="zookeeper" address="192.168.80.134:2181"/><!-- 指定註冊中心-> zookeeper的IP以及端口號 -->


<!-- 創建指定接口的代理對象,放在當前的Spring容器中,相當於一個普通的bean -->
<dubbo:reference interface="cn.e3mall.service.ItemService" id="itemService" />

        之後便可以在處理器方法中自動注入Service,調用遠程的Service服務。

        當然,只是上面這樣還是不行的,我們還缺少一個服務的註冊與發現中心,既然Dubbo推薦使用ZooKeeper,那我們就使用ZooKeeper了:

ZooKeeper

簡介:

        1.  官方推薦使用zookeeper註冊中心。
        2.  註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小。使用dubbo-2.3.3以上版本,建議使用zookeeper註冊中心。

        3.  Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變更推送,適合作爲Dubbo服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用

用途:

1.  可以作爲Dubbo的服務註冊中心。        

2.  可以作爲集羣的管理工具使用。

3.  可以集中管理配置文件

安裝:

  • 安裝環境:

    Linux:CentOS 7 

    Jdk: 1.8.0(Zookeeper是java開發的可以運行在windows、linux環境。需要先安裝jdk)

  • 安裝步驟:
        第一步:安裝jdk
        第二步:把zookeeper的壓縮包上傳到linux系統。
        第三步:解壓縮壓縮包 tar -zxvf zookeeper-3.4.6.tar.gz
        第四步:進入zookeeper-3.4.6目錄,創建data文件夾。
        第五步:把zoo_sample.cfg改名爲zoo.cfg  —>  mv zoo_sample.cfg zoo.cfg
        第六步:編輯zoo.cfg,修改data屬性:  —>  dataDir=/root/zookeeper-3.4.6/data
        第七步:啓動zookeeper  —>  ./zkServer.sh start
        關閉:  —>   ./zkServer.sh stop

        查看狀態:  —>   ./zkServer.sh status

  • 注意事項

        1.  需要關閉防火牆。

        2.  如果不能成功啓動zookeeper,需要刪除data目錄下的zookeeper_server.pid文件

此時,啓動ZooKeeper,就能夠實現遠程服務調用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章