1. 程式人生 > >Dubbo基本知識與簡單demo

Dubbo基本知識與簡單demo

Dubbo背景和簡介

Dubbo開始於電商系統,因此在這裡先從電商系統的演變講起。 1,單一應用框架(ORM) 當網站流量很小時,只需一個應用,將所有功能如下單支付等都部署在一起,以減少部署節點和成本。 缺點:單一的系統架構,使得在開發過程中,佔用的資源越來越多,而且隨著流量的增加越來越難以維護 這裡寫圖片描述 2.垂直應用框架(MVC)  垂直應用架構解決了單一應用架構所面臨的擴容問題,流量能夠分散到各個子系統當中,且系統的體積可控,一定程度上降低了開發人員之間協同以及維護的成本,提升了開發效率。  缺點:但是在垂直架構中相同邏輯程式碼需要不斷的複製,不能複用。 這裡寫圖片描述 3.分散式應用架構(RPC)  當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心 這裡寫圖片描述
4.流動計算架構(SOA)  隨著服務化的進一步發展,服務越來越多,服務之間的呼叫和依賴關係也越來越複雜,誕生了面向服務的架構體系(SOA),也因此衍生出了一系列相應的技術,如對服務提供、服務呼叫、連線處理、通訊協議、序列化方式、服務發現、服務路由、日誌輸出等行為進行封裝的服務框架

從以上是電商系統的演變可以看出架構演變的過程: 這裡寫圖片描述

  • 單一應用架構

    • 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
    • 此時,用於簡化增刪改查工作量的 資料訪問框架(ORM) 是關鍵。
  • 垂直應用架構

    • 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
    • 此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
  • 分散式服務架構 
    • 當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
    • 此時,用於提高業務複用及整合的 分散式服務框架(RPC) 是關鍵。
  • 流動計算架構 
    • 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率。
    • 此時,用於提高機器利用率的 資源排程和治理中心(SOA) 是關鍵。

在這裡插播一條關於RPC的簡介: RPC(Remote Procedure Call Protocol):遠端過程呼叫

:  兩臺伺服器A、B,分別部署不同的應用a,b。當A伺服器想要呼叫B伺服器上應用b提供的函式或方法的時候,由於不在一個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義傳達呼叫的資料。  說白了,就是你在你的機器上寫了一個程式,我這邊是無法直接呼叫的,這個時候就出現了一個遠端服務呼叫的概念。

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

RPC需要解決的問題:  (可以稍作了解,詳情可檢視別的博文)  * 通訊問題 : 主要是通過在客戶端和伺服器之間建立TCP連線,遠端過程呼叫的所有交換的資料都在這個連線裡傳輸。連線可以是按需連線,呼叫結束後就斷掉,也可以是長連線,多個遠端過程呼叫共享同一個連線。  * 定址問題 : A伺服器上的應用怎麼告訴底層的RPC框架,如何連線到B伺服器(如主機或IP地址)以及特定的埠,方法的名稱名稱是什麼,這樣才能完成呼叫。比如基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI服務上查詢。如果是RMI呼叫的話,還需要一個RMI Registry來註冊服務的地址。  * 序列化 與 反序列化 : 當A伺服器上的應用發起遠端過程呼叫時,方法的引數需要通過底層的網路協議如TCP傳遞到B伺服器,由於網路協議是基於二進位制的,記憶體中的引數的值要序列化成二進位制的形式,也就是序列化(Serialize)或編組(marshal),通過定址和傳輸將序列化的二進位制傳送給B伺服器。  同理,B伺服器接收引數要將引數反序列化。B伺服器應用呼叫自己的方法處理後返回的結果也要序列化給A伺服器,A伺服器接收也要經過反序列化的過程。

Dubbo是什麼

Dubbo是:

  • 一款分散式服務框架
  • 高效能和透明化的RPC遠端服務呼叫方案
  • SOA服務治理方案

每天為2千多個服務提供大於30億次訪問量支援,並被廣泛應用於阿里巴巴集團的各成員站點以及別的公司的業務中。

Dubbo架構

這裡寫圖片描述

Provider: 暴露服務的服務提供方。 Consumer: 呼叫遠端服務的服務消費方。 Registry: 服務註冊與發現的註冊中心。 Monitor: 統計服務的呼叫次數和呼叫時間的監控中心。

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

Dubbo註冊中心

對於服務提供方,它需要釋出服務,而且由於應用系統的複雜性,服務的數量、型別也不斷膨脹;  對於服務消費方,它最關心如何獲取到它所需要的服務,而面對複雜的應用系統,需要管理大量的服務呼叫。  而且,對於服務提供方和服務消費方來說,他們還有可能兼具這兩種角色,即既需要提供服務,有需要消費服務。

通過將服務統一管理起來,可以有效地優化內部應用對服務釋出/使用的流程和管理。服務註冊中心可以通過特定協議來完成服務對外的統一。

Dubbo提供的註冊中心有如下幾種型別可供選擇:  * Multicast註冊中心  * Zookeeper註冊中心  * Redis註冊中心  * Simple註冊中心

Dubbo優缺點

優點:  1. 透明化的遠端方法呼叫  - 像呼叫本地方法一樣呼叫遠端方法;只需簡單配置,沒有任何API侵入。  2. 軟負載均衡及容錯機制  - 可在內網替代nginx lvs等硬體負載均衡器。  3. 服務註冊中心自動註冊 & 配置管理  -不需要寫死服務提供者地址,註冊中心基於介面名自動查詢提供者ip。  使用類似zookeeper等分散式協調服務作為服務註冊中心,可以將絕大部分專案配置移入zookeeper叢集。  4. 服務介面監控與治理  -Dubbo-admin與Dubbo-monitor提供了完善的服務介面管理與監控功能,針對不同應用的不同介面,可以進行 多版本,多協議,多註冊中心管理。

缺點:

  • 只支援JAVA語言

Dubbo入門Demo

瞭解了Dubbo以後,自然要搭建一個簡單的Demo實現。本文采用Dubbo與Zookeeper、Spring框架的整合。

主要是以下幾個步驟:  1. 安裝Zookeeper,啟動;  2. 建立MAVEN專案,構建Dubbo+Zookeeper+Spring實現的簡單Demo;  3. 安裝Dubbo-admin,實現監控。

1 Zookeeper介紹與安裝

本Demo中的Dubbo註冊中心採用的是Zookeeper。為什麼採用Zookeeper呢?

Zookeeper是一個分散式的服務框架,是樹型的目錄服務的資料儲存,能做到叢集管理資料 ,這裡能很好的作為Dubbo服務的註冊中心。

Dubbo能與Zookeeper做到叢集部署,當提供者出現斷電等異常停機時,Zookeeper註冊中心能自動刪除提供者資訊,當提供者重啟時,能自動恢復註冊資料,以及訂閱請求

安裝完成後,進入到bin目錄,並且啟動zkServer.cmd,這個指令碼中會啟動一個java程序:  (注:需要先啟動zookeeper後,後續dubbo demo程式碼執行才能使用zookeeper註冊中心的功能) 這裡寫圖片描述

2 建立MAVEN專案

專案結構:  主要分三大模組:  dubbo-api : 存放公共介面;  dubbo-consumer : 呼叫遠端服務;  dubbo-provider : 提供遠端服務。 這裡寫圖片描述

下面將詳細敘述程式碼構建過程。  1) 首先構建MAVEN專案,匯入所需要的jar包依賴。  需要匯入的有spring, dubbo, zookeeper等jar包。  (詳情參看後面提供的專案程式碼)

2)建立dubbo-api的MAVEN專案(有獨立的pom.xml,用來打包供提供者消費者使用)。  在專案中定義服務介面:該介面需單獨打包,在服務提供方和消費方共享。 這裡寫圖片描述

  1. package com.alibaba.dubbo.demo;
  2. import java.util.List;
  3. public interfaceDemoService{
  4. List<String> getPermissions(Long id);
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3)建立dubbo-provider的MAVEN專案(有獨立的pom.xml,用來打包供消費者使用)。  實現公共介面,此實現對消費者隱藏:

  1. package com.alibaba.dubbo.demo.impl;
  2. import com.alibaba.dubbo.demo.DemoService;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public classDemoServiceImplimplementsDemoService{
  6. public List<String> getPermissions(Long id) {
  7. List<String> demo = new ArrayList<String>();
  8. demo.add(String.format("Permission_%d", id - 1));
  9. demo.add(String.format("Permission_%d", id));
  10. demo.add(String.format("Permission_%d", id + 1));
  11. return demo;
  12. }
  13. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

需加入公共介面所在的依賴 這裡寫圖片描述

用Spring配置宣告暴露服務

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://code.alibabatech.com/schema/dubbo
  8. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  9. <!--定義了提供方應用資訊,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識-->
  10. <dubbo:applicationname="demotest-provider"owner="programmer"organization="dubbox"/>
  11. <!--使用 zookeeper 註冊中心暴露服務,注意要先開啟 zookeeper-->
  12. <dubbo:registryaddress="zookeeper://localhost:2181"/>
  13. <!-- 用dubbo協議在20880埠暴露服務 -->
  14. <dubbo:protocolname="dubbo"port="20880" />
  15. <!--使用 dubbo 協議實現定義好的 api.PermissionService 介面-->
  16. <dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService"ref="demoService"protocol="dubbo" />
  17. <!--具體實現該介面的 bean-->
  18. <beanid="demoService"class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/>
  19. </beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

啟動遠端服務:

  1. package com.alibaba.dubbo.demo.impl;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. import java.io.IOException;
  4. public class Provider {
  5. public static void main(String[] args) throws IOException {
  6. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
  7. System.out.println(context.getDisplayName() + ": here");
  8. context.start();
  9. System.out.println("服務已經啟動...");
  10. System.in.read();
  11. }
  12. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4)建立dubbo-consumer的MAVEN專案(可以有多個consumer,但是需要配置好)。  呼叫所需要的遠端服務:

通過Spring配置引用遠端服務:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  7. <dubbo:applicationname="demotest-consumer"owner="programmer"organization="dubbox"/>
  8. <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送-->
  9. <dubbo:registryaddress="zookeeper://localhost:2181"/>
  10. <!--使用 dubbo 協議呼叫定義好的 api.PermissionService 介面-->
  11. <dubbo:referenceid="permissionService"interface="com.alibaba.dubbo.demo.DemoService"/>
  12. </beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

啟動Consumer,呼叫遠端服務:

  1. package com.alibaba.dubbo.consumer;
  2. import com.alibaba.dubbo.demo.DemoService;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Consumer {
  5. public static void main(String[] args) {
  6. //測試常規服務
  7. ClassPathXmlApplicationContext context =
  8. new ClassPathXmlApplicationContext("consumer.xml");
  9. context.start();
  10. System.out.println("consumer start");
  11. DemoService demoService = context.getBean(DemoService.class);
  12. System.out.println("consumer");
  13. System.out.println(demoService.getPermissions(1L));
  14. }
  15. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

5)執行專案,先確保provider已被執行後再啟動consumer模組:  執行提供者: 這裡寫圖片描述  消費者成功呼叫提供者所提供的遠端服務: 這裡寫圖片描述

當然,這只是一個模擬的專案,實際中有多提供者多消費者情況,比這要複雜的多,當然只有這樣才能體現dubbo的特性。

Dubbo管理控制檯介紹

管理控制檯功能

路由規則,動態配置,服務降級  訪問控制,權重調整  負載均衡 這裡寫圖片描述

下載dubbo-admin,可自行根據網上介紹安裝。大致做法就是將dubbo-admin中 的某個資料夾內容替換到tomcat的conf中,再執行tomcat即可。但我在實際操作中發現JDK8無法執行,後來找到一個JDK8可以實現的dubbo-admin版本,如有需要可留下郵箱索要。

成功開啟輸入使用者名稱密碼root後,即可進入控制檯首頁檢視消費者提供者情況:  檢視提供者: 這裡寫圖片描述  檢視消費者: 這裡寫圖片描述

很遺憾,官方Dubbo網址早已不維護了,也出現了很多更新的Dubbo,比如噹噹網的Dubbox,可以自行了解。