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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...