最新----Dubbo Spring Cloud 重塑微服務治理

spring-cloud-alibaba-dubbo-examples代碼示例
在這裏插入圖片描述

摘要

在 Java 微服務生態中,Spring Cloud1 成爲了開發人員的首選技術棧,然而隨着實踐的深入和運用規模的擴大,大家逐漸意識到 Spring Cloud 的侷限性。在服務治理方面,相較於 Dubbo2 而言,Spring Cloud 並不成熟。遺憾的是,Dubbo 往往被部分開發者片面地視作服務治理的 RPC 框架,而非微服務基礎設施。即使是那些有意將 Spring Cloud 遷移至 Dubbo 的小夥伴,當面對其中遷移和改造的成本時,難免望而卻步。慶幸的是,Dubbo 生態體系已發生巨大變化,Dubbo Spring Cloud 作爲 Spring Cloud Alibaba3 的最核心組件,完全地擁抱 Spring Cloud 技術棧,不但無縫地整合 Spring Cloud 註冊中心,包括 Nacos4、Eureka5、Zookeeper6 以及 Consul7,而且完全地兼容 Spring Cloud Open Feign8 以及 @LoadBalanced RestTemplate,本文將討論 Dubbo Spring Cloud 對 Spring Cloud 技術棧所帶來的革命性變化。

注:由於 Spring Cloud 技術棧涵蓋的特性衆多,因此本文討論的範圍僅限於服務治理部分。

簡介

Dubbo Spring Cloud 基於 Dubbo Spring Boot 2.7.19 和 Spring Cloud 2.x 開發,無論開發人員是 Dubbo 用戶還是 Spring Cloud 用戶,都能輕鬆地駕馭,並以接近“零”成本的代價使應用向上遷移。Dubbo Spring Cloud 致力於簡化 Cloud Native 開發成本,提高研發效能以及提升應用性能等目的。

2019年4月19日,Dubbo Spring Cloud 首個 Preview Release,隨同 Spring Cloud Alibaba 0.2.2.RELEASE0.9.0.RELEASE 一同發佈10,分別對應 Spring Cloud Finchley11 與 Greenwich12 (下文分別簡稱爲 “F” 版 和 “G” 版) 。

版本支持

由於 Spring 官方宣佈 Spring Cloud Edgware(下文簡稱爲 “E” 版) 將在 2019 年 8 月 1 號後停止維護13,因此,目前 Dubbo Spring Cloud 發佈版本並未對 “E” 版提供支持,僅爲 “F” 版 和 “G” 版開發,同時也建議和鼓勵 Spring Cloud 用戶更新至 “F” 版 或 “G” 版。

同時,Dubbo Spring Cloud 基於 Apache Dubbo Spring Boot 2.7.1 開發(最低 Java 版本爲 1.8),提供完整的 Dubbo 註解驅動、外部化配置以及 Production-Ready 的特性,詳情請參考:https://github.com/apache/incubator-dubbo-spring-boot-project

以下表格將說明 Dubbo Spring Cloud 版本關係映射關係:

Spring Cloud Spring Cloud Alibaba Spring Boot Dubbo Spring Boot
Finchley 0.2.2.RELEASE 2.0.x 2.7.1
Greenwich 0.9.0.RELEASE 2.1.x 2.7.1
Edgware 0.1.2.RELEASE 1.5.x ❌ Dubo Spring Cloud 不支持該版本

功能特性

由於 Dubbo Spring Cloud 構建在原生的 Spring Cloud 之上,其服務治理方面的能力可認爲是 Spring Cloud Plus,不僅完全覆蓋 Spring Cloud 原生特性13,而且提供更爲穩定和成熟的實現,特性比對如下表所示:

功能組件 Spring Cloud Dubbo Spring Cloud
分佈式配置(Distributed configuration) Git、Zookeeper、Consul、JDBC Spring Cloud 分佈式配置 + Dubbo 配置中心14
服務註冊與發現(Service registration and discovery) Eureka、Zookeeper、Consul Spring Cloud 原生註冊中心15 + Dubbo 原生註冊中心16
負載均衡(Load balancing) Ribbon(隨機、輪詢等算法) Dubbo 內建實現(隨機、輪詢等算法 + 權重等特性)
服務熔斷(Circuit Breakers) Spring Cloud Hystrix Spring Cloud Hystrix + Alibaba Sentinel17
服務調用(Service-to-service calls) Open Feign、RestTemplate Spring Cloud 服務調用 + Dubbo @Reference
鏈路跟蹤(Tracing) Spring Cloud Sleuth18 + Zipkin19 Zipkin、opentracing 等

高亮特性

1. Dubbo 使用 Spring Cloud 服務註冊與發現

Dubbo Spring Cloud 基於 Spring Cloud Commons 抽象實現 Dubbo 服務註冊與發現,應用只需增添外部化配置屬性 “dubbo.registry.address = spring-cloud://localhost”,就能輕鬆地橋接到所有原生 Spring Cloud 註冊中心,包括:

  • Nacos
  • Eureka
  • Zookeeper
  • Consul

Dubbo Spring Cloud 將在下個版本支持 Spring Cloud 註冊中心與 Dubbo 註冊中心並存,提供雙註冊機制,實現無縫遷移。

2. Dubbo 作爲 Spring Cloud 服務調用

默認情況,Spring Cloud Open Feign 以及 @LoadBalanced RestTemplate 作爲 Spring Cloud 的兩種服務調用方式。Dubbo Spring Cloud 爲其提供了第三種選擇,即 Dubbo 服務將作爲 Spring Cloud 服務調用的同等公民出現,應用可通過 Apache Dubbo 註解 @Service@Reference 暴露和引用 Dubbo 服務,實現服務間多種協議的通訊。同時,也可以利用 Dubbo 泛化接口輕鬆實現服務網關。

3. Dubbo 服務自省

Dubbo Spring Cloud 引入了全新的服務治理特性 - 服務自省(Service Introspection),其設計目的在於最大化減輕註冊中心負載,去 Dubbo 註冊元信息中心化。假設一個 Spring Cloud 應用引入 Dubbo Spring Boot Starter,並暴露 N 個 Dubbo 服務,以 Dubbo Nacos 註冊中心 爲例,當前應用將註冊 N+1 個 Nacos 應用,除 Spring Cloud 應用本身之前,其餘 N 個應用均來自於 Dubbo 服務,當 N 越大時,註冊中心負載越重。因此,Dubbo Spring Cloud 應用對註冊中心的負載相當於傳統 Dubbo 的 N 分之一,在不增加基礎設施投入的前提下,理論上,使其集羣規模擴大 N 倍。當然,未來的 Dubbo 也將提供服務自省的能力。

4. Dubbo 遷移 Spring Cloud 服務調用

儘管 Dubbo Spring Cloud 完全地保留了原生 Spring Cloud 服務調用特性,不過 Dubbo 服務治理的能力是 Spring Cloud Open Feign 所不及的,如高性能、高可用以及負載均衡穩定性等方面。因此,建議開發人員將 Spring Cloud Open Feign 或者 @LoadBalanced RestTemplate 遷移爲 Dubbo 服務。考慮到遷移過程並非一蹴而就,因此,Dubbo Spring Cloud 提供了方案,即 @DubboTransported 註解。該註解能夠幫助服務消費端的 Spring Cloud Open Feign 接口以及 @LoadBalanced RestTemplate Bean 底層走 Dubbo 調用(可切換 Dubbo 支持的協議),而服務提供方則只需在原有 @RestController 類上追加 Dubbo @Servce 註解(需要抽取接口)即可,換言之,在不調整 Feign 接口以及 RestTemplate URL 的前提下,實現無縫遷移。如果遷移時間充分的話,建議使用 Dubbo 服務重構系統中的原生 Spring Cloud 服務的定義。

簡單示例

開發 Dubbo Spring Cloud 應用的方法與傳統 Dubbo 或 Spring Cloud 應用類似,按照以下步驟就能完整地實現Dubbo 服務提供方和消費方的應用,完整的示例代碼請訪問一下資源:

定義 Dubbo 服務接口

Dubbo 服務接口是服務提供方與消費方的遠程通訊契約,通常由普通的 Java 接口(interface)來聲明,如 EchoService 接口:

public interface EchoService {
String <span class="token function">echo</span><span class="token punctuation">(</span>String message<span class="token punctuation">)</span><span class="token punctuation">;</span>

}
預覽

爲了確保契約的一致性,推薦的做法是將 Dubbo 服務接口打包在第二方或者第三方的 artifact(jar)中,如以上接口就存放在 artifact spring-cloud-dubbo-sample-api 之中。

對於服務提供方而言,不僅通過依賴 artifact 的形式引入 Dubbo 服務接口,而且需要將其實現。對應的服務消費端,同樣地需要依賴該 artifact,並以接口調用的方式執行遠程方法。接下來進一步討論怎樣實現 Dubbo 服務提供方和消費方。

實現 Dubbo 服務提供方

初始化 spring-cloud-dubbo-server-sample Maven 工程

首先,創建 artifactId 名爲 spring-cloud-dubbo-server-sample 的 Maven 工程,並在其 pom.xml 文件中增添
Dubbo Spring Cloud 必要的依賴:

<dependencies>
    <!-- Sample API -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dubbo-sample-api</artifactId>
        <version>${project.version}</version>
    </dependency>
<span class="token comment">&lt;!-- Spring Boot dependencies --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-actuator<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

<span class="token comment">&lt;!-- Dubbo Spring Cloud Starter --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.cloud<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-cloud-starter-dubbo<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

<span class="token comment">&lt;!-- Spring Cloud Nacos Service Discovery --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.cloud<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-cloud-starter-alibaba-nacos-discovery<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

</dependencies>
預覽

以上依賴 artifact 說明如下:

  • spring-cloud-dubbo-sample-api : 提供 EchoService 接口的 artifact
  • spring-boot-actuator : Spring Boot Production-Ready artifact,間接引入 spring-boot artifact
  • spring-cloud-starter-dubbo : Dubbo Spring Cloud Starter artifact,間接引入 dubbo-spring-boot-starter 等 artifact
  • spring-cloud-starter-alibaba-nacos-discovery : Nacos Spring Cloud 服務註冊與發現 artifact

值得注意的是,以上 artifact 未指定版本(version),因此,還需顯示地聲明 <dependencyManagement> :

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud Alibaba dependencies -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
預覽

以上完整的 Maven 依賴配置,請參考 spring-cloud-dubbo-server-sample pom.xml 文件

完成以上步驟之後,下一步則是實現 Dubbo 服務

實現 Dubbo 服務

EchoService 作爲暴露的 Dubbo 服務接口,服務提供方 spring-cloud-dubbo-server-sample 需要將其實現:

@org.apache.dubbo.config.annotation.Service
class EchoServiceImpl implements EchoService {
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> String <span class="token function">echo</span><span class="token punctuation">(</span>String message<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token string">"[echo] Hello, "</span> <span class="token operator">+</span> message<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}
預覽

其中,@org.apache.dubbo.config.annotation.Service 是 Dubbo 服務註解,僅聲明該 Java 服務(本地)實現爲 Dubbo 服務。
因此,下一步需要將其配置 Dubbo 服務(遠程)。

配置 Dubbo 服務提供方

在暴露 Dubbo 服務方面,推薦開發人員外部化配置的方式,即指定 Java 服務實現類的掃描基準包。

Dubbo Spring Cloud 繼承了 Dubbo Spring Boot 的外部化配置特性,也可以通過標註 @DubboComponentScan 來實現基準包掃描。

同時,Dubbo 遠程服務需要暴露網絡端口,並設定通訊協議,完整的 YAML 配置如下所示:

dubbo:
  scan:
    # dubbo 服務掃描基準包
    base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap
  protocol:
    # dubbo 協議
    name: dubbo
    # dubbo 協議端口( -1 表示自增端口,從 20880 開始)
    port: -1
  registry:
    # 掛載到 Spring Cloud 註冊中心
    address: spring-cloud://localhost

spring:
application:
# Dubbo 應用名稱
name: spring-cloud-alibaba-dubbo-server
main:
# Spring Boot 2.1 需要設定
allow-bean-definition-overriding: true
cloud:
nacos:
# Nacos 服務發現與註冊配置
discovery:
server-addr: 127.0.0.1:8848
預覽

以上 YAML 內容,上半部分爲 Dubbo 的配置:

  • dubbo.scan.base-packages : 指定 Dubbo 服務實現類的掃描基準包
  • dubbo.protocol : Dubbo 服務暴露的協議配置,其中子屬性 name 爲協議名稱,port 爲協議端口( -1 表示自增端口,從 20880 開始)
  • dubbo.registry : Dubbo 服務註冊中心配置,其中子屬性 address 的值 “spring-cloud://localhost”,說明掛載到 Spring Cloud 註冊中心

當前 Dubbo Spring Cloud 實現必須配置 dubbo.registry.address = spring-cloud://localhost,下一個版本將其配置變爲可選
(參考 issue #592),
並且支持傳統 Dubbo 協議的支持(參考 issue #588

下半部分則是 Spring Cloud 相關配置:

  • spring.application.name : Spring 應用名稱,用於 Spring Cloud 服務註冊和發現。

該值在 Dubbo Spring Cloud 加持下被視作 dubbo.application.name,因此,無需再顯示地配置 dubbo.application.name

  • spring.main.allow-bean-definition-overriding : 在 Spring Boot 2.1 以及更高的版本增加該設定,
    因爲 Spring Boot 默認調整了 Bean 定義覆蓋行爲。(推薦一個好的 Dubbo 討論 issue #3193
  • spring.cloud.nacos.discovery : Nacos 服務發現與註冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口

以上完整的 YAML 配置文件,請參考 spring-cloud-dubbo-server-sample bootstrap.yaml 文件

完成以上步驟後,還需編寫一個 Dubbo Spring Cloud 引導類。

引導 Dubbo Spring Cloud 服務提供方應用

Dubbo Spring Cloud 引導類與普通 Spring Cloud 應用並無差別,如下所示:

@EnableDiscoveryClient
@EnableAutoConfiguration
public class DubboSpringCloudServerBootstrap {
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    SpringApplication<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span>DubboSpringCloudServerBootstrap<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}
預覽

在引導 DubboSpringCloudServerBootstrap 之前,請提前啓動 Nacos 服務器。
DubboSpringCloudServerBootstrap 啓動後,將應用 spring-cloud-dubbo-server-sample 將出現在 Nacos 控制檯界面。

當 Dubbo 服務提供方啓動後,下一步實現一個 Dubbo 服務消費方。

實現 Dubbo 服務消費方

由於 Java 服務就 EchoService、服務提供方應用 spring-cloud-dubbo-server-sample 以及 Nacos 服務器均已準備完畢。Dubbo 服務消費方
只需初始化服務消費方 Maven 工程 spring-cloud-dubbo-client-sample 以及消費 Dubbo 服務。

初始化 spring-cloud-dubbo-client-sample Maven 工程

與服務提供方 Maven 工程類,需添加相關 Maven 依賴:

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud Alibaba dependencies -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
<!-- Sample API -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dubbo-sample-api</artifactId>
<version>${project.version}</version>
</dependency>

<span class="token comment">&lt;!-- Spring Boot dependencies --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-web<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-actuator<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

<span class="token comment">&lt;!-- Dubbo Spring Cloud Starter --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.cloud<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-cloud-starter-dubbo<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

<span class="token comment">&lt;!-- Spring Cloud Nacos Service Discovery --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.cloud<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-cloud-starter-alibaba-nacos-discovery<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>

</dependencies>
預覽

與應用 spring-cloud-dubbo-server-sample 不同的是,當前應用依賴 spring-boot-starter-web,表明它屬於 Web Servlet 應用。

以上完整的 Maven 依賴配置,請參考 spring-cloud-dubbo-client-sample pom.xml 文件

配置 Dubbo 服務消費方

Dubbo 服務消費方配置與服務提供方類似,當前應用 spring-cloud-dubbo-client-sample 屬於純服務消費方,因此,所需的外部化配置更精簡:

dubbo:
  registry:
    # 掛載到 Spring Cloud 註冊中心
    address: spring-cloud://localhost
  cloud:
    subscribed-services: spring-cloud-alibaba-dubbo-server

spring:
application:
# Dubbo 應用名稱
name: spring-cloud-alibaba-dubbo-client
main:
# Spring Boot 2.1 需要設定
allow-bean-definition-overriding: true
cloud:
nacos:
# Nacos 服務發現與註冊配置
discovery:
server-addr: 127.0.0.1:8848
預覽

對比應用 spring-cloud-dubbo-server-sample,除應用名稱 spring.application.name 存在差異外,spring-cloud-dubbo-client-sample
新增了屬性 dubbo.cloud.subscribed-services 的設置。並且該值爲服務提供方應用 “spring-cloud-dubbo-server-sample”。

  • dubbo.cloud.subscribed-services : 用於服務消費方訂閱服務提供方的應用名稱的列表,若需訂閱多應用,使用 “,” 分割。
    不推薦使用默認值爲 “*”,它將訂閱所有應用。

當應用使用屬性 dubbo.cloud.subscribed-services 默認值時,日誌中將會輸出一行警告:

Current application will subscribe all services(size:x) in registry, a lot of memory and CPU cycles may be used,
thus it’s strongly recommend you using the externalized property ‘dubbo.cloud.subscribed-services’ to specify the services

由於當前應用屬於 Web 應用,它會默認地使用 8080 作爲 Web 服務端口,如果需要自定義,可通過屬性 server.port 調整。

以上完整的 YAML 配置文件,請參考 spring-cloud-dubbo-client-sample bootstrap.yaml 文件

引導 Dubbo Spring Cloud 服務消費方應用

爲了減少實現步驟,以下引導類將 Dubbo 服務消費以及引導功能合二爲一:

@EnableDiscoveryClient
@EnableAutoConfiguration
@RestController
public class DubboSpringCloudClientBootstrap {
<span class="token annotation punctuation">@Reference</span>
<span class="token keyword">private</span> EchoService echoService<span class="token punctuation">;</span>

<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/echo"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> String <span class="token function">echo</span><span class="token punctuation">(</span>String message<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> echoService<span class="token punctuation">.</span><span class="token function">echo</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    SpringApplication<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span>DubboSpringCloudClientBootstrap<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

不僅如此,DubboSpringCloudClientBootstrap 也作爲 REST Endpoint,通過暴露 /echo Web 服務,消費 Dubbo EchoService 服務。因此,
可通過 curl 命令執行 HTTP GET 方法:

$ curl http://127.0.0.1:8080/echo?message=%E5%B0%8F%E9%A9%AC%E5%93%A5%EF%BC%88mercyblitz%EF%BC%89

HTTP 響應爲:

[echo] Hello, 小馬哥(mercyblitz)

以上結果說明應用 spring-cloud-dubbo-client-sample 通過消費 Dubbo 服務,返回服務提供方 spring-cloud-dubbo-server-sample 運算後的內容。

高階示例

其子模塊說明如下:

  • spring-cloud-dubbo-sample-api:API 模塊,存放 Dubbo 服務接口和模型定義
  • spring-cloud-dubbo-provider-web-sample:Dubbo Spring Cloud 服務提供方示例(Web 應用)
  • spring-cloud-dubbo-provider-sample:Dubbo Spring Cloud 服務提供方示例(非 Web 應用)
  • spring-cloud-dubbo-consumer-sample:Dubbo Spring Cloud 服務消費方示例
  • spring-cloud-dubbo-servlet-gateway-sample:Dubbo Spring Cloud Servlet 網關簡易實現示例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章