主頁 > 後端開發 > Dubbo 入門系列之快速部署一個微服務應用

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

2023-02-02 06:56:29 後端開發

本文將基于 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.main

Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.main

注:需要開一個獨立的 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.main

Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.main

在執行完上述命令以后,等待一會出現如下圖所示的日志(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.main

Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.main

啟動后可以看到類似以下的日志,消費端會隨機呼叫到不同的服務提供者,回傳的結果也是遠端的服務提供者覺得其結果,

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 技能

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542764.html

標籤:其他

上一篇:分享會上狂吹MySQL的4大索引結構,沒想到大家的鑒賞能力如此的~~~~

下一篇:Java 多型

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more