1. 程式人生 > >Dubbo體驗(一)

Dubbo體驗(一)

    最近新加入一個專案組,所使用的是Dubbo,採用的架構是分散式架構,資料庫採用MySQL分片。之前也接觸過一下,但為了能更好融入團隊,所以找Dubbo官網看文件。

才發現Dubbo的官網已搬去github。好吧,最近太關注於SpringCloud。

附上現在Dubbo地址 :http://dubbo.apache.org/zh-cn/docs/user/quick-start.html 。

Dubbo由於之前沒咋更新,被人詬病。但無可爭議,這是一個很強大的服務治理框架,歷經雙十一考驗,有著非常完整的中文文件。

 十月底,看到一則訊息,Spring Cloud Alibaba正式入駐Spring Cloud官方孵化器!附上阿里的spring-cloud地址:

https://github.com/spring-cloud-incubator/spring-cloud-alibaba 。

 

  什麼鬼, 似乎跑題了耶,廢話不說,先來Dubbo試一波。

Dubbo 是什麼

  一款分散式服務框架

  高效能和透明化的RPC遠端服務呼叫方案

  SOA服務治理方案

順便一提RPC:

來自百度百科:

RPC(Remote Procedure Call)—遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI

網路通訊模型中,RPC跨越了傳輸層應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。

大概意思可以這麼理解:現在有兩臺伺服器A、B,分別部署不同的應用a,b。當A伺服器想要呼叫B伺服器上應用b提供的函式或方法的時候,由於不在一個記憶體空間,不能直接呼叫,需要通過網路傳輸呼叫。 A可以通過使用引數將資訊傳送給B,而後可以通過傳回的結果得到資訊。而這一過程,對於開發人員來說是透明的。

官網Dubbo 架構圖

節點角色說明

 

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 呼叫遠端服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的呼叫次數和呼叫時間的監控中心
Container 服務執行容器


呼叫關係說明
呼叫關係說明
  1. 服務容器負責啟動,載入,執行服務提供者。
  2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
  6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

 Dubbo使用

       Dubbo是基於Spring的Schema進行擴充套件,對應用沒有任何API侵入,就是說開發者採用只需要採用Spring即可開發。

本次Demo 採用maven+idea 進行開發,使用zookeeper作為服務註冊中心。

Server 端開發

工程結構如下所示

 

 maven工程一般第一步就是配置pom.xml,匯入jar包。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>
    </dependencies>

</project>

 

 接下來是provider介面

package com.dubbotest;

public interface Provider{
    String send(String name) throws Exception;

}

 

provider實現類

package com.dubbotest.impl;

import com.dubbotest.Provider;

public class DemoServiceImpl implements Provider {
    public String send(String name) throws Exception {
        System.out.println(" got a argument: " + name);
        return "message from provider: " + name;
    }
}

 

配置application.xml,使用Spring暴露服務

<?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
        ">
    <!-- 具體的實現bean -->
    <bean id="demoService"
          class="com.dubbotest.impl.DemoServiceImpl" />
    <!-- 提供方應用資訊,用於計算依賴關係 -->
    <dubbo:application name="anyname_provider" />
    <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 宣告需要暴露的服務介面 -->
    <dubbo:service interface="com.dubbotest.Provider"
                   ref="demoService" />

</beans>

 

啟動類

package com.dubbo.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
        context.start();
        System.out.println(" provider run ");
        System.in.read(); // 按任意鍵退出
    }
}

 

Client端開發

接下來,client差不多 ,工程結構如下所示

也需配置介面,正常來說,可以將server的介面打成jar包,然後client端匯入即可。

配置application.xml,此處是consumer,用於遠端服務呼叫。

<?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
        ">
    <!-- 具體的實現bean -->
    <bean id="demoService"
          class="com.dubbotest.impl.DemoServiceImpl" />
    <!-- 提供方應用資訊,用於計算依賴關係 -->
    <dubbo:application name="anyname_provider" />
    <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 宣告需要暴露的服務介面 -->
    <dubbo:service interface="com.dubbotest.Provider"
                   ref="demoService" />

</beans>

 

配置consumer 啟動類

package com.dubbo.test;

import com.dubbotest.Provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Consumer {
    public static void main(String[] args)throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
        context.start();
        Provider demoService = (Provider) context.getBean("demoService"); // 獲取遠端服務代理
        Format sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String  mgs = demoService.send(sdf.format(new Date()));// 執行遠端方法
        System.out.println( mgs);// 顯示結果

    }
}

 

 OK,接下來,就是測試是否傳送成功。先啟動ZK,再啟動Test類,在控制檯棵看到  provider run ,說明啟動成功。

再啟動consumer 類。可看到控制檯,

說明呼叫成功。

總結

通過這個Demo,我們可以看到,使用Dubbo,我們只需使用Spring配置即可開發,對應用無入侵性。

其次我們無需關注底層的執行緒IO模型,網路通訊問題。

還有就是服務自動註冊與發現: 基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。