基於Dubbo+ZooKeeper的分佈式服務的實現

Dubbo是什麼

  1. 一款分佈式服務框架
  2. 高性能和透明化的RPC遠程服務調用方案。這裏簡單介紹一下RPC,所謂RPC就是遠程過程調用,全稱爲Romate Procedure Protocol Call,顧名思義其實就是一種協議。

RPC是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。java

  1. SOA服務治理方案
    SOA是一種面向服務的框架或者說是架構

Dubbo架構:

圖片描述
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務註冊與發現的註冊中心。
Monitor: 統計服務的調用次數和調用時間的監控中心。算法

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

Dubbo註冊中心

經過將服務統一管理起來,能夠有效地優化內部應用對服務發佈/使用的流程和管理。服務註冊中心能夠經過特定協議來完成服務對外的統一。這就是分佈式服務註冊中心的由來。api

Dubbo提供的註冊中心有以下幾種類型可供選擇

  • Multicast註冊中心
  • Zookeeper註冊中心
  • Redis註冊中心
  • Simple註冊中心

接下來咱們就是基於Dubbo+Zookeeper+Spring的方式來作一個關於分佈式部署的練習,相信經過這個例子你們就能夠大體理解Dubbo+Zookeeper的執行流程。服務器

安裝Zookeeper

具體安裝過程能夠進入如下網址,一步一步跟着提示操做就能夠完成Zookeeper的安裝:
http://blog.csdn.net/tlk20071...
安裝完成後,進入到bin目錄,而且啓動zkServer.cmd,這個腳本中會啓動一個java進程:成功之後會啓動一個DOS界面,以下圖所示:
圖片描述網絡

程序實現階段

  1. 建立父工程
    建立一個名爲DubboDemo的maven工程
  2. 建立服務接口以及服務提供者和服務消費者模塊
    在父工程下分別建立三個名爲dubbo-api,dubbo-provider,dubbo-consumer的maven module
  3. 編寫代碼實現功能
    【1】在模塊dubbo-api中建立一個名爲com.alibaba.dubbo.demo的包,在包下建立一個名爲DemoService的接口,該接口下的代碼以下:架構

    package com.alibaba.dubbo.demo;
    import java.util.List;app

    public interface DemoService {負載均衡

    List<String> getPermissions(Long id);

    }框架

    【2】在模塊dubbo-provider中建立一個名爲com.alibaba.dubbo.demo.impl的包,在該包下新建一個名爲DemoServiceImpl並實現DemoService接口,該類代碼以下:
    package com.alibaba.dubbo.demo.impl;
    import com.alibaba.dubbo.demo.DemoService;
    import java.util.ArrayList;
    import java.util.List;
    public class DemoServiceImpl implements DemoService {

    public List<String> getPermissions(Long id) {
           List<String> demo = new ArrayList<String>();
           demo.add(String.format("Permission_%d", id - 1));
           demo.add(String.format("Permission_%d", id));
           demo.add(String.format("Permission_%d", id + 1));
           return demo;
       }

    }

    【3】添加spring配置文件名爲provider.xml(位於src目錄下),配置文件具體內容以下:

    <?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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識-->
       <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/>
       <!--使用 zookeeper 註冊中心暴露服務,注意要先開啓 zookeeper-->
       <dubbo:registry address="zookeeper://localhost:2181"/>
       <!-- 用dubbo協議在20880端口暴露服務 -->
       <dubbo:protocol name="dubbo" port="20880" />
       <!--使用 dubbo 協議實現定義好的 api.PermissionService 接口-->
       <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" />
       <!--具體實現該接口的 bean-->
       <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/>

    </beans>

    【4】編寫服務提供方啓動類,具體代碼以下:

    package com.alibaba.dubbo.demo.impl;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import java.io.IOException;
    public class Provider {

    public static void main(String[] args) throws IOException {

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");

    System.out.println(context.getDisplayName() + ": here");
               context.start();
               System.out.println("服務已經啓動...");
               System.in.read();
           }
       }

【5】完成服務消費者所需功能

在demo-consumer模塊中建立名爲com.alibaba.dubbo.consumer的包並在該包下建立一個名爲Consumer,器具體代碼以下:
package com.alibaba.dubbo.consumer;
import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
    public static void main(String[] args) {
        //測試常規服務

ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("consumer.xml");

context.start();
        System.out.println("consumer start");
        DemoService demoService = context.getBean(DemoService.class);
        System.out.println("consumer");
        System.out.println(demoService.getPermissions(1L));
    }
}

【6】配置服務消費者的配置文件

在demo-consumer模塊中建立一個名爲consumer.xml的文件,該文件的具體內容以下:
    <?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="demotest-consumer" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--使用 dubbo 協議調用定義好的 api.PermissionService 接口-->
    <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>

如何啓動

【1】首先啓動Zookeeper安裝目錄中bin文件夾下的名爲zkServer的Windows腳本文件
【2】啓動服務端,即啓動服務端啓動類的main方法
【3】啓動客戶端,即啓動服務消費者端的main方法

注意事項:

  • 注意各個模塊之間的依賴
    dubbo-provider和dubbo-consumer模塊都須要依賴dubbo-api模塊,還有就是這三個maven module最好都加入對於spring依賴。具體依賴可參考我發佈的源碼及資料。

項目資料下載連接(注:附Zookeeper的安裝文件):
連接:https://pan.baidu.com/s/120eC... 密碼:wllg

相關文章
相關標籤/搜索