Dubbo 入門系列之快速部署一個微服務應用

来源:https://www.cnblogs.com/apache-dubbo/archive/2023/02/01/17082426.html
-Advertisement-
Play Games

索引(index)是幫助MySQL高效獲取數據的數據結構(有序)。在數據之外,資料庫系統還維護著滿足 特定查找演算法的數據結構,這些數據結構以某種方式引用(指向)數據, 這樣就可以在這些數據結構 上實現高級查找演算法,這種數據結構就是索引。 優缺點: 優點: 提高數據檢索效率,降低資料庫的IO成本 通過 ...


本文將基於 Dubbo Samples 示例演示如何快速搭建並部署一個微服務應用。

背景

arch-service-discovery

Dubbo 作為一款微服務框架,最重要的是向用戶提供跨進程的 RPC 遠程調用能力。如上圖所示,Dubbo 的服務消費者(Consumer)通過一系列的工作將請求發送給服務提供者(Provider)。

為了實現這樣一個目標,Dubbo 引入了註冊中心(Registry)組件,通過註冊中心,服務消費者可以感知到服務提供者的連接方式,從而將請求發送給正確的服務提供者。

目標

瞭解微服務調用的方式以及 Dubbo 的能力

難度

環境要求

  • 系統:Windows、Linux、MacOS

  • JDK 8 及以上(推薦使用 JDK17)

  • Git

  • Docker (可選)

動手實踐

本章將通過幾個簡單的命令,一步一步教你如何部署並運行一個最簡單的 Dubbo 用例。

1. 獲取測試工程

在開始整個教程之前,我們需要先獲取測試工程的代碼。Dubbo 的所有測試用例代碼都存儲在 apache/dubbo-samples 這個倉庫中,以下這個命令可以幫你獲取 Samples 倉庫的所有代碼。

git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git

2. 認識 Dubbo Samples 項目結構

在將 apache/dubbo-samples 這個倉庫 clone 到本地以後,本小節將就倉庫的具體組織方式做說明。

.
├── codestyle        // 開發使用的 style 配置文件

├── 1-basic          // 基礎的入門用例
├── 2-advanced       // 高級用法
├── 3-extensions     // 擴展使用示例
├── 4-governance     // 服務治理用例
├── 10-task          // Dubbo 學習系列示例

├── 99-integration   // 集成測試使用
├── test             // 集成測試使用
└── tools            // 三方組件快速啟動工具

如上表所示,apache/dubbo-samples 主要由三個部分組成:代碼風格文件、測試代碼、集成測試。

  1. 代碼風格文件是開發 Dubbo 代碼的時候可以使用,其中包括了 IntelliJ IDEA 的配置文件。

  2. 測試代碼即本教材所需要的核心內容。目前包括了 5 個部分的內容:面向初學者的 basic 入門用例、面向開發人員的 advanced 高級用法、面向中間件維護者的 extensions Dubbo 周邊擴展使用示例、面向生產的 governance 服務治理用例以及 Dubbo 學習系列。本文將基於 basic 入門用例中最簡單的 Dubbo API 使用方式進行講解。

  3. 集成測試是 Dubbo 的質量保證體系中重要的一環,Dubbo 的每個版本都會對所有的 samples 進行回歸驗證,保證 Dubbo 的所有變更都不會影響 samples 的使用。

3. 啟動一個簡易的註冊中心

從這一小節開始,將正式通過三個命令部署一個微服務應用。

背景 一節中可知,運行起 Dubbo 應用的一個大前提是部署一個註冊中心,為了讓本教程更易於上手,我們提供了一個基於 Apache Zookeeper 註冊中心的簡易啟動器,如果您需要在生產環境部署註冊中心,請參考生產環境初始化一文部署高可用的註冊中心。

Windows:
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper

Linux / MacOS:
./mvnw clean compile exec:java -pl tools/embedded-zookeeper

註:需要開一個獨立的 terminal 運行,命令將會保持一直執行的狀態。

Docker:
docker run --name some-zookeeper --restart always -d zookeeper

在執行完上述命令以後,等待一會出現如下圖所示的日誌即代表註冊中心啟動完畢,可以繼續執行後續任務。

registry

4. 啟動服務提供者

在啟動了註冊中心之後,下一步是啟動一個對外提供服務的服務提供者。在 dubbo-samples 中也提供了對應的示例,可以通過以下命令快速拉起。

Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.provider.Application"

Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.provider.Application"

註:需要開一個獨立的 terminal 運行,命令將會保持一直執行的狀態。

在執行完上述命令以後,等待一會出現如下圖所示的日誌(DubboBootstrap awaiting)即代表服務提供者啟動完畢,標志著該服務提供者可以對外提供服務了。

provider

[19/01/23 03:55:49:049 CST] org.apache.dubbo.samples.provider.Application.main()  INFO bootstrap.DubboBootstrap:  [DUBBO] DubboBootstrap awaiting ..., dubbo version: 3.2.0-beta.3, current host: 169.254.44.42

5. 啟動服務消費者

最後一步是啟動一個服務消費者來調用服務提供者,也即是 RPC 調用的核心,為服務消費者提供調用服務提供者的橋梁。

Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.Application"

Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.Application"

在執行完上述命令以後,等待一會出現如下圖所示的日誌(hi, dubbo),列印出的數據就是服務提供者處理之後返回的,標志著一次服務調用的成功。

consumer

Receive result ======> hi, dubbo

延伸閱讀

1. 消費端是怎麼找到服務端的?

在本用例中的步驟 3 啟動了一個 Zookeeper 的註冊中心,服務提供者會向註冊中心中寫入自己的地址,供服務消費者獲取。

Dubbo 會在 Zookeeper 的 /dubbo/interfaceName/services/appName 下寫入服務提供者的連接信息。

如下所示是 Zookeeper 上的數據示例:

[zk: localhost:2181(CONNECTED) 5] ls /dubbo/org.apache.dubbo.samples.api.GreetingsService/providers
[dubbo%3A%2F%2F30.221.146.35%3A20880%2Forg.apache.dubbo.samples.api.GreetingsService%3Fanyhost%3Dtrue%26application%3Dfirst-dubbo-provider%26background%3Dfalse%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26environment%3Dproduct%26generic%3Dfalse%26interface%3Dorg.apache.dubbo.samples.api.GreetingsService%26ipv6%3Dfd00%3A1%3A5%3A5200%3A3218%3A774a%3A4f67%3A2341%26methods%3DsayHi%26pid%3D85639%26release%3D3.1.4%26service-name-mapping%3Dtrue%26side%3Dprovider%26timestamp%3D1674960780647]

[zk: localhost:2181(CONNECTED) 2] ls /services/first-dubbo-provider
[30.221.146.35:20880]
[zk: localhost:2181(CONNECTED) 3] get /services/first-dubbo-provider/30.221.146.35:20880
{"name":"first-dubbo-provider","id":"30.221.146.35:20880","address":"30.221.146.35","port":20880,"sslPort":null,"payload":{"@class":"org.apache.dubbo.registry.zookeeper.ZookeeperInstance","id":"30.221.146.35:20880","name":"first-dubbo-provider","metadata":{"dubbo.endpoints":"[{\"port\":20880,\"protocol\":\"dubbo\"}]","dubbo.metadata-service.url-params":"{\"connections\":\"1\",\"version\":\"1.0.0\",\"dubbo\":\"2.0.2\",\"release\":\"3.1.4\",\"side\":\"provider\",\"ipv6\":\"fd00:1:5:5200:3218:774a:4f67:2341\",\"port\":\"20880\",\"protocol\":\"dubbo\"}","dubbo.metadata.revision":"871fbc9cb2730caea9b0d858852d5ede","dubbo.metadata.storage-type":"local","ipv6":"fd00:1:5:5200:3218:774a:4f67:2341","timestamp":"1674960780647"}},"registrationTimeUTC":1674960781893,"serviceType":"DYNAMIC","uriSpec":null}

更多關於 Dubbo 服務發現模型的細節,可以參考服務發現一文。

2. 消費端是如何發起請求的?

在 Dubbo 的調用模型中,起到連接服務消費者和服務提供者的橋梁是介面。

服務提供者通過對指定介面進行實現,服務消費者通過 Dubbo 去訂閱這個介面。服務消費者調用介面的過程中 Dubbo 會將請求封裝成網路請求,然後發送到服務提供者進行實際的調用。

在本用例中,定義了一個 GreetingsService 的介面,這個介面有一個名為 sayHi 的方法。

// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/api/GreetingsService.java

package org.apache.dubbo.samples.api;

public interface GreetingsService {

    String sayHi(String name);

}

服務消費者通過 Dubbo 的 API 可以獲取這個 GreetingsService 介面的代理,然後就可以按照普通的介面調用方式進行調用。得益於 Dubbo 的動態代理機制,這一切都像本地調用一樣。

// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java

// 獲取訂閱到的 Stub
GreetingsService service = reference.get();
// 像普通的 java 介面一樣調用
String message = service.sayHi("dubbo");

3. 服務端可以部署多個嗎?

可以,本小節將演示如何啟動一個服務端集群

1)啟動一個註冊中心,可以參考動手實踐中第 3 小節的教程

2)修改服務提供者返回的數據,讓第一個啟動的服務提供者返回 hi, dubbo. I am provider 1.

修改 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java 文件的第 25 行如下所示。

// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java

package org.apache.dubbo.samples.provider;

import org.apache.dubbo.samples.api.GreetingsService;

public class GreetingsServiceImpl implements GreetingsService {
    @Override
    public String sayHi(String name) {
        return "hi, " + name + ". I am provider 1.";
    }
}

3)啟動第一個服務提供者,可以參考動手實踐中第 4 小節的教程

4)修改服務提供者返回的數據,讓第二個啟動的服務提供者返回 hi, dubbo. I am provider 2.

修改 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java 文件的第 25 行如下所示。

// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java

package org.apache.dubbo.samples.provider;

import org.apache.dubbo.samples.api.GreetingsService;

public class GreetingsServiceImpl implements GreetingsService {
    @Override
    public String sayHi(String name) {
        return "hi, " + name + ". I am provider 2.";
    }
}

4)啟動第二個服務提供者,可以參考動手實踐中第 4 小節的教程

5)啟動服務消費者,可以參考動手實踐中第 5 小節的教程。多次啟動消費者可以看到返回的結果是不一樣的。

在 dubbo-samples 中也提供了一個會定時發起調用的消費端應用org.apache.dubbo.samples.client.AlwaysApplication,可以通過以下命令啟動。

Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.AlwaysApplication"

Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.AlwaysApplication"

啟動後可以看到類似以下的日誌,消費端會隨機調用到不同的服務提供者,返回的結果也是遠端的服務提供者覺得其結果。

Sun Jan 29 11:23:37 CST 2023 Receive result ======> hi, dubbo. I am provider 1.
Sun Jan 29 11:23:38 CST 2023 Receive result ======> hi, dubbo. I am provider 2.
Sun Jan 29 11:23:39 CST 2023 Receive result ======> hi, dubbo. I am provider 2.
Sun Jan 29 11:23:40 CST 2023 Receive result ======> hi, dubbo. I am provider 1.
Sun Jan 29 11:23:41 CST 2023 Receive result ======> hi, dubbo. I am provider 1.

4. 這個用例複雜嗎?

不,Dubbo 只需要簡單的配置就可以實現穩定、高效的遠程調用。

以下是一個服務提供者的簡單示例,通過定義若幹個配置就可以啟動。

// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/Application.java

// 定義所有的服務
ServiceConfig<GreetingsService> service = new ServiceConfig<>();
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());

// 啟動 Dubbo
DubboBootstrap.getInstance()
        .application("first-dubbo-provider")
        .registry(new RegistryConfig(ZOOKEEPER_ADDRESS))
        .protocol(new ProtocolConfig("dubbo", -1))
        .service(service)
        .start();

以下是一個服務消費者的簡單示例,通過定義若幹個配置啟動後就可以獲取到對應的代理對象,之後用戶完全不需要感知這個對象背後的複雜實現,一切只需要和本地調用一樣就行了

// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java

// 定義所有的訂閱
ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
reference.setInterface(GreetingsService.class);

// 啟動 Dubbo
DubboBootstrap.getInstance()
        .application("first-dubbo-consumer")
        .registry(new RegistryConfig(ZOOKEEPER_ADDRESS))
        .reference(reference)
        .start();

// 獲取訂閱到的 Stub
GreetingsService service = reference.get();
// 像普通的 java 介面一樣調用
String message = service.sayHi("dubbo");

更多

本用例介紹了一個 RPC 遠程調用的基礎流程,通過啟動註冊中心、服務提供者、服務消費者三個節點來模擬一個微服務的部署架構。

下一個教程中,將就服務提供者和服務消費者分別都做了什麼配置進行講解,從零告訴你如何搭建一個微服務應用。

歡迎在 https://github.com/apache/dubbo 給 Dubbo Star。
搜索關註官方微信公眾號:Apache Dubbo,瞭解更多業界最新動態,掌握大廠面試必備 Dubbo 技能


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹基於Python語言,實現對多個不同Excel文件進行數據讀取與平均值計算的方法。 首先,讓我們來看一下具體需求:目前有一個文件夾,其中存放了大量Excel文件;文件名稱是每一位同學的名字,即文件名稱沒有任何規律。 而每一個文件都是一位同學對全班除了自己之外的其他同學的各項打分,我們以其中一 ...
  • 本文描述的是查找字典的某一個元素(字典遍歷元素請點擊->這裡) 上下文代碼 smart_girl = {"name":"yuan wai", "age": 25,"sex":"女"} 第一種方式:[] 註意:這種方式,如果找不到對應的key,會報一個KeyError錯誤 smart_girl["na ...
  • 日期類 一、第一代日期類 Date Date:第一代日期類,精確到毫秒,代表特定的瞬間。 SimpleDateFormat:格式化和解析日期的具體類。它允許進行格式化(日期 -> 文本)、解析(文本 -> 日期)和規範化。 SimpleDateFormat日期-時間格式模式參數: | Letter ...
  • 1. 前言 WebMvcConfigurer配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置文件形式進行針對框架個性化定製,可以自定義一些Handler,Interceptor,ViewResolver,MessageConverter。基於java-ba ...
  • 使用apidoc包生成apidoc的json格式數據,然後使用python讀取出介面地址、名字、組名、輸入參數格式和例子、輸出參數格式和例子等,然後根據swagger格式填入對應的數據即可生成swagger的json格式 ...
  • 前言 用於實現通過牌子逆向查主播信息這個功能。 插件基於Nonebot2開發,鏈接:https://github.com/Ikaros-521/nonebot_plugin_searchBiliInfo 工程下載 github:https://github.com/Ikaros-521/get_bi ...
  • 首先要瞭解的是,1、功能變數名稱註冊 2、功能變數名稱解析,是兩個獨立的產品。一般情況下,功能變數名稱服務商(萬網、新網等)會提供一站式服務,既提供“功能變數名稱購買註冊”,又提供“功能變數名稱解析服務”。 但實際上,功能變數名稱和功能變數名稱解析是可以分開部署的,功能變數名稱服務商也支持相關的分離設置。比如:功能變數名稱在萬網進行管理,功能變數名稱解析可以指向其他功能變數名稱服務商... ...
  • 多態就是指程式中定義的引用變數所指向的具體類型和通過該引用變數發出的方法調用在編譯時並不確定,而是在程式運行期間才確定。 即一個引用變數倒底會指向哪個類的實例對象,該引用變數發出的方法調用到底是哪個類中實現的方法,必須在由程式運行期間才能決定。 因為在程式運行時才確定具體的類,這樣,不用修改源程式代 ...
一周排行
    -Advertisement-
    Play Games
  • 人臉識別技術在現代社會中扮演著越來越重要的角色,比如人臉識別門禁、人臉識別支付、甚至人臉識別網站登錄等。 最近有群友問.NET有沒有人臉識別的組件,小編查閱相關資料介紹下麵幾種.NET人臉識別組件供大家參考。 **1、Microsoft Azure Face API** 簡介:Microsoft A ...
  • # 1. 與 .NET Core 緩存的關係和差異 ABP 框架中的緩存系統核心包是 [Volo.Abp.Caching](https://www.nuget.org/packages/Volo.Abp.Caching) ,而對於分散式緩存的支持,abp 官方提供了基於 Redis 的方案,需要安裝 ...
  • 最近ET做熱更重載dll的時候,返回登陸會重新檢測新的dll,首次登錄之前已經Assembly.Load()過一次dll,第二次返回登陸再次load dll到記憶體中,Invoke執行方法的時候,異常了,有些方法執行了,有些未執行,於是查資料,看到些老資料說Assembly.Load重覆載入同名dll ...
  • 1. 擴展方法 擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C#、F# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中定義的方法沒有明顯區別 ...
  • 以前在隨筆《Winform開發框架之客戶關係管理系統(CRM)的開發總結系列1-界面功能展示 》的幾篇隨筆中介紹過基於WInform開發框架開發的CRM系統,系統的功能主要也是圍繞著客戶相關信息來進行管理的。本篇隨筆介紹在最新的《SqlSugar開發框架》中整合CRM系統模塊的功能。 ...
  • 隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章... ...
  • [toc] 這篇文章是我之前總結的一篇文章,因為整理博客的原因,原有博客已經註銷,但這篇文章對一些讀者很有用,所以現在新瓶裝舊酒重新整理回來分享給大家。 最近一段時間生產環境頻繁出問題,每次都會生成一個hs_err_pid*.log文件,因為工作內容的原因,在此之前並沒有瞭解過相關內容,趁此機會學習 ...
  • # 前言 在上一篇文章中,給大家講解了泛型的概念、作用、使用場景,以及泛型集合、泛型介面和泛型類的用法,但受限於篇幅,並沒有把泛型的內容講解完畢。所以今天我們會繼續學習泛型方法、泛型擦除,以及通配符等的內容,希望大家繼續做好學習的準備哦。 *** 全文大約【**4600】** 字,不說廢話,只講可以 ...
  • 昨天遇到參數key大小寫不一致導致校驗簽名失敗的問題,查了很長時間才找到原因。看了一下FastJson源碼,發現JSON.toObject中轉換成對象的時候會忽略大小寫。 所以,當使用了JSON.toObject將json轉成Java對象後,再用JSON.toObject轉成json,key值就變了 ...
  • 基於java的線上商城設計與實現,線上購物平臺,校園購物商城,商品銷售平臺,基於Java的電商平臺;電商平臺,買家和賣家可以在此平臺上進行銷售和交易,節約了大量的線下時間成本,購物車的功能,校園交易平臺等等; ...