1. 程式人生 > >一個最簡單的dubbo例子實現

一個最簡單的dubbo例子實現

Dubbo作為淘寶搞出的框架,居然沒提供相關文件,這樣學習這個框架變得比較困難,尤其是入門這步,看了網上零零種種的關於Dubbo的總結,總感覺說的太羅嗦了,沒有抓住重點,簡單來說dubbo是種非侵入式的RPC(遠端訪問)框架。關鍵是兩個詞非侵入式RPC。

所謂的非侵入性是指dubbo並沒有參雜入實現程式碼中,實現程式碼並不直接依賴dubbo的相關類。而是通過Spring XML的配置檔案的形式進行完成RPC(遠端訪問)操作。

RPC(遠端訪問)框架是指在客戶端這邊呼叫和服務端同名的介面,效果相當於呼叫了遠端服務端實現的同名服務功能,雖然服務功能的實現是在服務端實現執行的,在客戶端並無實現,但是通過RPC框架

內部的網路通訊機制使客戶端能夠透明地使用服務端同名服務而不需要客戶端實現。RPC對客戶端使用者而言是透明的。

先用一個最簡單的dubbo實現例子說說dubbo的非侵入性

服務端:實現一個helloworld的服務功能,功能為列印一行hello world!

客戶端:不知道helloworld服務的具體實現,只知道介面規範,在客戶端上呼叫該功能,通過dubbo的rpc機制使用該服務。

要實現上面的簡單例子,需要幾點:

1.       服務端的Spring XML檔案配置(裡面包含了dubbo的相關配置資訊)

provider-bean-context.xml:

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:p="http://www.springframework.org/schema/p"

xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:util="http://www.springframework.org/schema/util"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/jeehttp://www.springframework.org/schema/jee/spring-jee.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd

http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<dubbo:applicationname="dubboTest-provider" />

<!--zookeeper註冊中心--> 

<dubbo:registry protocol="zookeeper"address="127.0.0.1:2181" client="curator" />

<!--使用multicast廣播註冊中心暴露服務地址 --> 

<dubbo:protocol name="dubbo" port="20880"/> 

<dubbo:serviceinterface="com.tisson.zrftest.DubboTestProvider" 

                  ref="dubboTestProvider"/>       <!-- 和本地bean一樣實現服務--> 

         <beanid="dubboTestProvider"class="com.tisson.zrftest.DubboTestProviderImp" /> 

</beans> 

--重點看粗體字相關內容,裡面配置了註冊中心使用的zookeeper的ip,埠等資訊,另外配置了服務端暴露給外界的埠,服務介面名以及服務的實現類。

2. 客戶端的Spring XML檔案配置(裡面包含了dubbo的相關配置資訊)

consumer-bean-context.xml:

<?xml version="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jee="http://www.springframework.org/schema/jee"

         xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"

         xmlns:context="http://www.springframework.org/schema/context"

         xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:p="http://www.springframework.org/schema/p"

         xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:util="http://www.springframework.org/schema/util"

         xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans.xsd

         http://www.springframework.org/schema/jeehttp://www.springframework.org/schema/jee/spring-jee.xsd

         http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd

         http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd

         http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

         http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">

         <dubbo:applicationname="dubboTest-consumer" />

         <!--zookeeper註冊中心 --> 

         <dubbo:registry  protocol="zookeeper"address="127.0.0.1:2181" client="curator" /> 

         <!--使用multicast廣播註冊中心暴露的服務地址--> 

        <!--<dubbo:registryaddress="multicast://10.57.41.19:1234"/> --> 

          <!-- 生成遠端服務代理,可以和本地bean一樣使用demoService--> 

         <dubbo:referenceid="dubboTestProvider"interface="com.tisson.zrftest.DubboTestProvider" />

</beans>

--重點看粗體字相關內容,裡面配置了註冊中心使用的zookeeper的ip,埠等資訊,客戶端使用到的介面名

3.服務介面的定義:

DubboTestProvider.java:

public interfaceDubboTestProvider{

    public  void helloWorld();

}

4.介面實現類:

public classDubboTestProviderImp implements DubboTestProvider{

    @Override

    public void helloWorld() {

        // TODO Auto-generated method stub

        System.out.println("hello world!");

    }

}

5.服務端啟動類:

LuncherProvider.java:

public classLuncherProvider{

    public static void main(String[] args){

        String[]springConfigLocation=newString[]{"resource/dubboTestProvider/provider-bean-context.xml"};

        ClassPathXmlApplicationContext  springContext = newClassPathXmlApplicationContext(springConfigLocation);

        springContext.start();

        try {

            System.in.read();

        }catch(IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

--簡單來說就是載入Spring的xml配置檔案,呼叫start啟動,並且用System.in.read();阻塞主流程,讓服務端一直處於等待訪問狀態。

6.客戶端啟動類:

LuncherConsumer.java:

public classLuncherConsumer{

    public static void main(String[] args){

        String[]springConfigLocation=newString[]{"resource/dubboTestConsumer/consumer-bean-context.xml"};

        ClassPathXmlApplicationContext  springContext = newClassPathXmlApplicationContext(springConfigLocation);

        DubboTestProviderdubboTestProvider=(DubboTestProvider)springContext.getBean("dubboTestProvider");

        dubboTestProvider.helloWorld();

    }

}

--簡單來說就是載入Spring的xml配置檔案,並通過springContext.getBean("dubboTestProvider")獲取介面引用,並呼叫介面中的方法,通過遠端呼叫,最終使用到了遠端服務端的功能

---------啟動服務端後,再啟動客戶端,可以發現,服務端的後臺輸出了一行字串:

hello world!

如果我們這時候去檢視zookeeper會發現,在zookeeper那邊的根路徑下多了一個dubbo的目錄

[zk: localhost:2181(CONNECTED) 0] ls /

[host, dubbo, conf, zookeeper, zrf]

Dubbo下面有一個子目錄

[zk:localhost:2181(CONNECTED) 1] ls /dubbo

[com.tisson.zrftest.DubboTestProvider]

--這就是服務介面名,是服務端和客戶端聯絡起來的紐帶,再進去一層看有四個子目錄

[zk:localhost:2181(CONNECTED) 2] ls /dubbo/com.tisson.zrftest.DubboTestProvider

[consumers,configurators, routers, providers]

--裡面主要是儲存了服務端的ip和埠資訊,以便客戶端能夠獲取該資訊,使用rpc機制進行遠端呼叫。

總結:以上就是dubbo非侵人特徵的最簡單直觀的介紹,可以看到在具體的java程式碼中絲毫看不到任何與dubbo的一點依賴,通過Spring的XML配置就能很簡單地使用dubbo框架。至於dubbo的RPC機制,表面上理解很容易就是客戶端呼叫遠端服務端功能的同名介面,實際上通過dubbo的rpc中的網路通訊能力透明地呼叫了服務端的程式碼。但是內部詳細實現流程還待探索。