天天看點

分布式--Dubbo 分布式服務

1. Dubbo官網

Dubbo下載下傳位址

1). 發展曆史

随着網際網路的不斷發展,網站的應用規模越來越大,正常的垂直架構已經無法應對,尤其是類似電商的項目,是以分布式架構和流動計算架構已經勢在必行。Dubbo就是資源排程和服務治理中心的管理工具。

① 單一應用架構(ORM)

當網站流量很小時,隻需一個應用,将所有功能如下單支付等都部署在一起,以減少部署節點和成本。 缺點:單一的系統架構,使得在開發過程中,占用的資源越來越多,而且随着流量的增加越來越難以維護

分布式--Dubbo 分布式服務

圖1.png

② 垂直應用架構(MVC)

垂直應用架構解決了單一應用架構所面臨的擴容問題,流量能夠分散到各個子系統當中,且系統的體積可控,一定程度上降低了開發人員之間協同以及維護的成本,提升了開發效率。 缺點:但是在垂直架構中相同邏輯代碼需要不斷的複制,不能複用。

分布式--Dubbo 分布式服務

圖2.png

③ 分布式服務架構(RPC)

當垂直應用越來越多,有很多相同的業務邏輯,這樣應用直接的互動不可避免,此時将核心業務抽取出來,作為獨立的服務,逐 漸形成穩定的服務中心,以應對快速變化的外部市場環境。

分布式--Dubbo 分布式服務

圖3.png

④ 流動計算架構(SOA)

當服務越來越多,容量的評估,小服務資源浪費等問題逐漸暴露,此時需要一個服務治理工具來管理叢集容量,提高使用率。

分布式--Dubbo 分布式服務

圖4.png

2). 為什麼使用dubbo?

1.webservice:效率不高基于soap協定,項目中不建議使用,但它的優點在于跨語言通信,适用于不同公司互相調用接口。

2.使用restful形式服務:http+json。很多項目中的應用,如果服務太多,系統之間調用關系混亂,需要治療服務。

3.使用dubbo。使用rpc協定進行遠端調用,之間使用socket通信,傳輸效率高,并且可以統計出系統之間的調用關系、調用次數。

說白了dubbo就是一個服務治理工具,是一個服務的中間件,由于dubbo是通過java編寫的,dubbo最大的缺點就出現了,它隻适用于java系統間的通信。

3). Dubbo架構

角色說明:

  • Provider:暴露服務的服務提供方
  • Container:服務運作容器
  • Consumer:調用服務的消費方
  • Registry:注冊服務與發現服務中心
  • Monitor:統計服務調用的監控中心(可有可無)
    分布式--Dubbo 分布式服務
    圖5.png

調用關系說明:

0:服務運作容器啟動,加載服務提供者

1:在啟動時告訴注冊中心服務方有什麼服務

2:消費者調用服務時,先到注冊中心訂閱所需要服務

3:注冊中心傳回結果即該服務的位址

4:消費者通過位址調用服務(此時注冊中心沒用了)

5:服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次到監控中心

4). RPC(Remote Procedure Call Protocol)

遠端過程調用: 兩台伺服器A、B,分别部署不同的應用a,b。當A伺服器想要調用B伺服器上應用b提供的函數或方法的時候,由于不在一個記憶體空間,不能直接調用,需要通過網絡來表達調用的語義傳達調用的資料。

分布式--Dubbo 分布式服務

圖6.png

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

5). Dubbo的注冊中心

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

6). Dubbo優缺點

  • 優點:
  1. 透明化的遠端方法調用:像調用本地方法一樣調用遠端方法;隻需簡單配置,沒有任何API侵入。
  2. 軟負載均衡及容錯機制:可在内網替代nginx lvs等硬體負載均衡器。
  3. 服務注冊中心自動注冊 & 配置管理:不需要寫死服務提供者位址,注冊中心基于接口名自動查詢提供者ip。使用類似zookeeper等分布式協調服務作為服務注冊中心,可以将絕大部分項目配置移入zookeeper叢集。
  4. 服務接口監控與治理 :Dubbo-admin與Dubbo-monitor提供了完善的服務接口管理與監控功能,針對不同應用的不同接口,可以進行 多版本,多協定,多注冊中心管理。
  • 缺點:隻支援JAVA語言

2. Spring+Dubbo+ZooKeeper執行個體

1). 準備jar包(共16個)

2). 建立Dubbo-api Java項目

I. 引入jar包

右鍵項目 -> Build Path -> Configure Build Path... -> Libraries -> Add External JARs... 找到自己剛剛存放jar包的檔案夾,我的是在

E:\eclipse\libs\

檔案夾中,全選(Ctrl+A)jar包,點選打開—> OK. 導包成功.

分布式--Dubbo 分布式服務

圖8.png

II. 将解壓ZooKeeper後的檔案夾中/conf/檔案夾下的log4j.properties拷貝到工程的src目錄下

分布式--Dubbo 分布式服務

圖9.png

III. 在src下建立ItemService接口

public interface ItemService {
    List<String> getList(Long id);
}
           

IV. Dubbo-api 工程目錄結構

分布式--Dubbo 分布式服務

圖10.png

3). 建立Dubbo-provider Java工程

I. 導包--方法同上

II. 依賴上一步完成的Dubbo-api Java工程

工程上右鍵 -> Build Path -> Configure Build Path... -> Project -> Add... ->選擇Dubbo-api 點選OK -> OK

III. 建立ItemService的實作類ItemServiceImpl

public class ItemServiceImpl implements ItemService{

    @Override
    public List<String> getList(Long id) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list.add("item" + i);
        }
        return list;
    }

}
           

IV. 在src目錄下建立provider.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-admin 或 dubbo-monitor 會顯示這個名字,友善辨識 -->
    <dubbo:application name="Dubbo-provider" owner="programmer" organization="mazaiting"/>
    <!-- 使用ZooKeeper 注冊中心暴露服務,注意要先開啟ZooKeeper -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!-- 使用Dubbo協定在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!-- 使用dubbo 協定實作定義好的服務接口 -->
    <dubbo:service protocol="dubbo" ref="itemService" interface="com.mazaiting.service.ItemService"/>
    <!-- 具體實作該接口的bean -->
    <bean id="itemService" class="com.mazaiting.service.impl.ItemServiceImpl"/>
    
</beans>
           

如果遇到無法快捷提示dubbo标簽的情況, 請

參考此文--Dubbo 無法加載dubbo.xsd

V. 建立Provider類,此類中啟動此工程

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();
    }
}
           

VI. Dubbo-provider 工程目錄結構

分布式--Dubbo 分布式服務

圖11.png

4). 建立Dubbo-consumer Java工程

I. 導包 -- 方法同上

II. 在src下建立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-admin 或 dubbo-monitor 會顯示這個名字,友善辨識 -->
        <dubbo:application name="Dubbo-consumer" owner="programmer" organization="mazaiting"/>
        <!-- 向ZooKeeper 訂閱provider的位址, 由ZooKeeper定時推送 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <!-- 使用協定調用定義好的接口 -->
        <dubbo:reference id="itemService" interface="com.mazaiting.service.ItemService"/>
</beans>
           

III. 建立Consumer類來啟動目前工程

public class Consumer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = 
                new ClassPathXmlApplicationContext("consumer.xml");
        context.start();
        System.out.println("consumer start");
        ItemService demoService = context.getBean(ItemService.class);
        System.out.println("consumer");
        List<String> list = demoService.getList(1L);
        for (String string : list) {
            System.out.println(string); 
        }
    }
}
           

IV. Dubbo-consumer 工程目錄結構

分布式--Dubbo 分布式服務

圖12.png

5). 測試

I. 開啟ZooKeeper --

ZooKeeper安裝及使用

II. 執行Dubbo-provider工程中的Provider類

分布式--Dubbo 分布式服務

圖13.png

III. 再啟動Dubbo-consumer工程中的Consumer類

分布式--Dubbo 分布式服務

圖15.png

3. Dubbo 控制台安裝

1).

Dubbo-admin下載下傳

2). 編譯項目

編譯項目需要使用到Maven指令,

Linux 安裝Maven

Windows 安裝Maven

下載下傳之後解壓,并進入incubator-dubbo-ops-master檔案夾,在指令提示符視窗中輸入

mvn clean package
           

編譯成功如下圖:

分布式--Dubbo 分布式服務

圖16.png

3). 安裝

Tomcat容器
分布式--Dubbo 分布式服務

圖17.png

這裡我下載下傳的是zip包,下載下傳後并解壓

分布式--Dubbo 分布式服務

圖18.png

4). 複制檔案

将incubator-dubbo-ops-master\dubbo-admin\target\下的dubbo-admin-2.0.0.war複制到apache-tomcat-8.5.31\webapps\目錄下

分布式--Dubbo 分布式服務

圖19.png

5). 解壓

将dubbo-admin-2.0.0.war解壓

分布式--Dubbo 分布式服務

圖20.png

在WEB-INF/dubbo.properties檔案中可以配置ZooKeeper位址,管理者密碼

4. 使用Dubbo-admin

1). 開啟ZooKeeper

分布式--Dubbo 分布式服務

圖21.png

2). 開啟Tomcat

  • 輕按兩下startup.bat批處理開發
    分布式--Dubbo 分布式服務
    圖22.png
  • 浏覽器打開

    http://localhost:8080/dubbo-admin-2.0.0

    頁面
    分布式--Dubbo 分布式服務

    圖23.png

    使用者名和密碼預設的均為root,此時登入後資料為空。

    分布式--Dubbo 分布式服務
    圖24.png

3). 在Eclipse中運作Dubbo-provider項目

程式啟動後重新整理

http://localhost:8080/dubbo-admin-2.0.0/governance/providers

分布式--Dubbo 分布式服務

圖25.png

此時提供者已有資料,再進入消費者頁面

分布式--Dubbo 分布式服務

圖26.png

4). 在Eclipse中運作Dubbo-consumer項目

程式啟動後,Eclipse控制台列印出資料,重新整理

http://localhost:8080/dubbo-admin-2.0.0/governance/consumers

分布式--Dubbo 分布式服務

圖27.png

此時消費者頁面也有資料了。

代碼下載下傳

繼續閱讀