溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dubbo怎么實現(xiàn)Spring Cloud服務治理

發(fā)布時間:2022-01-04 15:59:01 來源:億速云 閱讀:147 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Dubbo怎么實現(xiàn)Spring Cloud服務治理 ”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

版本支持

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

同時,Dubbo Spring Cloud 基于 Apache Dubbo Spring Boot 2.7.x 開發(fā)(最低 Java 版本為 1.8),提供完整的 Dubbo 注解驅(qū)動、外部化配置以及 Production-Ready 的特性,點擊查看詳情。

以下表格將說明 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

2.2.1.RELEASE

2.1.x

2.7.1

Edgware

0.1.2.RELEASE

1.5.x

:x: Dubbo Spring Cloud 不支持該版本

功能特性

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

功能組件

Spring Cloud

Dubbo Spring Cloud

分布式配置(Distributed configuration)

Git、Zookeeper、Consul、JDBC

Spring Cloud 分布式配置 + Dubbo 配置中心(Dubbo 2.7 開始支持配置中心,可自定義適配)

服務注冊與發(fā)現(xiàn)(Service registration and discovery)

Eureka、Zookeeper、Consul

Spring Cloud 原生注冊中心(Spring Cloud 原生注冊中心,除 Eureka、Zookeeper、Consul 之外,還包括 Spring Cloud Alibaba 中的 Nacos)+ Dubbo 原生注冊中心

負載均衡(Load balancing)

Ribbon(隨機、輪詢等算法)

Dubbo 內(nèi)建實現(xiàn)(隨機、輪詢等算法 + 權重等特性)

服務熔斷(Circuit Breakers)

Spring Cloud Hystrix

Spring Cloud Hystrix + Alibaba Sentinel 等(Sentinel 已被 Spring Cloud 項目納為 Circuit Breaker 的候選實現(xiàn))

服務調(diào)用(Service-to-service calls)

Open Feign、RestTemplate

Spring Cloud 服務調(diào)用 + Dubbo @Reference

鏈路跟蹤(Tracing)

Spring Cloud Sleuth + Zipkin 

Zipkin、opentracing 等

高亮特性

Dubbo 使用 Spring Cloud 服務注冊與發(fā)現(xiàn)

Dubbo Spring Cloud 基于 Spring Cloud Commons 抽象實現(xiàn) Dubbo 服務注冊與發(fā)現(xiàn),應用只需增添外部化配置屬性 “dubbo.registry.address = spring-cloud://localhost”,就能輕松地橋接到所有原生 Spring Cloud 注冊中心,包括: - Nacos - Eureka - Zookeeper - Consul

注:Dubbo Spring Cloud 將在下個版本支持 Spring Cloud 注冊中心與 Dubbo 注冊中心并存,提供雙注冊機制,實現(xiàn)無縫遷移

Dubbo 作為 Spring Cloud 服務調(diào)用

默認情況,Spring Cloud Open Feign 以及 @LoadBalancedRestTemplate 作為 Spring Cloud 的兩種服務調(diào)用方式。Dubbo Spring Cloud 為其提供了第三種選擇,即 Dubbo 服務將作為 Spring Cloud 服務調(diào)用的同等公民出現(xiàn),應用可通過 Apache Dubbo 注解 @Service和 @Reference 暴露和引用 Dubbo 服務,實現(xiàn)服務間多種協(xié)議的通訊。同時,也可以利用 Dubbo 泛化接口輕松實現(xiàn)服務網(wǎng)關。

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 應用對注冊中心的負載相當于傳統(tǒng) Dubbo 的 N 分之一,在不增加基礎設施投入的前提下,理論上,使其集群規(guī)模擴大 N 倍。當然,未來的 Dubbo 也將提供服務自省的能力。

Dubbo 遷移 Spring Cloud 服務調(diào)用

盡管 Dubbo Spring Cloud 完全地保留了原生 Spring Cloud 服務調(diào)用特性,不過 Dubbo 服務治理的能力是 Spring Cloud Open Feign 所不及的,如高性能、高可用以及負載均衡穩(wěn)定性等方面。因此,建議開發(fā)人員將 Spring Cloud Open Feign 或者 @LoadBalancedRestTemplate 遷移為 Dubbo 服務。

考慮到遷移過程并非一蹴而就,因此,Dubbo Spring Cloud 提供了方案,即 @DubboTransported 注解。該注解能夠幫助服務消費端的 Spring Cloud Open Feign 接口以及 @LoadBalanced RestTemplate Bean 底層走 Dubbo 調(diào)用(可切換 Dubbo 支持的協(xié)議),而服務提供方則只需在原有 @RestController 類上追加 Dubbo @Servce 注解(需要抽取接口)即可,換言之,在不調(diào)整 Feign 接口以及 RestTemplate URL 的前提下,實現(xiàn)無縫遷移。如果遷移時間充分的話,建議使用 Dubbo 服務重構系統(tǒng)中的原生 Spring Cloud 服務的定義。

簡單示例

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

  • Dubbo 服務提供方應用 

  • Dubbo 服務消費方應用 

定義 Dubbo 服務接口

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

public interface EchoService {


    String echo(String message);
}

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

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

實現(xiàn) Dubbo 服務提供方

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

首先,創(chuàng)建 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>


    <!-- Spring Boot dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>


    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>


    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencie

以上依賴 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 服務注冊與發(fā)現(xiàn) artifact

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

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

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

完成以上步驟之后,下一步則是實現(xiàn) Dubbo 服務。

實現(xiàn) Dubbo 服務

EchoService 作為暴露的 Dubbo 服務接口,服務提供方 spring-cloud-dubbo-server-sample 需要將其實現(xiàn):

@org.apache.dubbo.config.annotation.Service
class EchoServiceImpl implements EchoService {


    @Override
    public String echo(String message) {
        return "[echo] Hello, " + message;
    }
}

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

配置 Dubbo 服務提供方

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

注:Dubbo Spring Cloud 繼承了 Dubbo Spring Boot 的外部化配置特性,也可以通過標注 @DubboComponentScan 來實現(xiàn)基準包掃描

同時,Dubbo 遠程服務需要暴露網(wǎng)絡端口,并設定通訊協(xié)議,完整的 YAML 配置如下所示:

dubbo:
  scan:
    # dubbo 服務掃描基準包
    base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap
  protocol:
    # dubbo 協(xié)議
    name: dubbo
    # dubbo 協(xié)議端口( -1 表示自增端口,從 20880 開始)
    port: -1
    
spring:
  application:
    # Dubbo 應用名稱
    name: spring-cloud-alibaba-dubbo-server
  cloud:
    nacos:
      # Nacos 服務發(fā)現(xiàn)與注冊配置
      discovery:
        server-addr: 127.0.0.1:8848

以上 YAML 內(nèi)容,上半部分為 Dubbo 的配置:

  • dubbo.scan.base-packages : 指定 Dubbo 服務實現(xiàn)類的掃描基準包

  • dubbo.protocol : Dubbo 服務暴露的協(xié)議配置,其中子屬性 name 為協(xié)議名稱,port 為協(xié)議端口( -1 表示自增端口,從 20880 開始)

  • dubbo.registry : Dubbo 服務注冊中心配置,其中子屬性 address 的值 "spring-cloud://localhost",說明掛載到 Spring Cloud 注冊中心

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

  • spring.application.name : Spring 應用名稱,用于 Spring Cloud 服務注冊和發(fā)現(xiàn)。 > 該值在 Dubbo Spring Cloud 加持下被視作 dubbo.application.name,因此,無需再顯示地配置 dubbo.application.name

  • spring.cloud.nacos.discovery : Nacos 服務發(fā)現(xiàn)與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口

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

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

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

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

 @EnableDiscoveryClient @EnableAutoConfiguration public class DubboSpringCloudServerBootstrap {
public static void main(String[] args) {
    SpringApplication.run(DubboSpringCloudServerBootstrap.class);
}
}

在引導 DubboSpringCloudServerBootstrap 之前,請?zhí)崆皢?Nacos 服務器。 當 DubboSpringCloudServerBootstrap 啟動后,將應用 spring-cloud-dubbo-server-sample 將出現(xiàn)在 Nacos 控制臺界面。

當 Dubbo 服務提供方啟動后,下一步實現(xiàn)一個 Dubbo 服務消費方。

實現(xiàn) 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>2.2.1.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>


    <!-- Spring Boot dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>


    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>


    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependenc

與應用 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:
  cloud:
    subscribed-services: spring-cloud-alibaba-dubbo-server
    
spring:
  application:
    # Dubbo 應用名稱
    name: spring-cloud-alibaba-dubbo-client
  cloud:
    nacos:
      # Nacos 服務發(fā)現(xiàn)與注冊配置
      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 調(diào)整。

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

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

為了減少實現(xiàn)步驟,以下引導類將 Dubbo 服務消費以及引導功能合二為一:

@EnableDiscoveryClient
@EnableAutoConfiguration
@RestController
public class DubboSpringCloudClientBootstrap {


    @Reference
    private EchoService echoService;


    @GetMapping("/echo")
    public String echo(String message) {
        return echoService.echo(message);
    }


    public static void main(String[] args) {
        SpringApplication.run(DubboSpringCloudClientBootstrap.class);
    }

不僅如此,DubboSpringCloudClientBootstrap 也作為 REST Endpoint,通過暴露 /echo Web 服務,消費 Dubbo EchoService服務。因此, 可通過 curl 命令執(zhí)行 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 運算后的內(nèi)容。

“Dubbo怎么實現(xiàn)Spring Cloud服務治理 ”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI