乐趣区

关于云原生-cloud-native:Dubbo-30-前瞻重塑-Spring-Cloud-服务治理

作者 | 小马哥

导读:Dubbo 社区策动了【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的倒退,并展望未来倒退。系列文章次要涵盖 Dubbo 技术解读、社区经营、利用案例解析三大部分。本文为系列第 3 篇。

前言

在 Java 微服务生态中,Spring Cloud 成为了开发人员的首选技术栈,然而随着实际的深刻和使用规模的扩充,大家逐步意识到 Spring Cloud 的局限性。

在服务治理方面,相较于 Dubbo 而言,Spring Cloud 并不成熟。遗憾的是,Dubbo 往往被局部开发者全面地视作服务治理的 RPC 框架,而非微服务基础设施。即便是那些无意将 Spring Cloud 迁徙至 Dubbo 的小伙伴,当面对其中迁徙和革新的老本时,不免望而生畏。

庆幸的是,Dubbo 3.0 的到来将给这一场面带来重要改革,将来 Dubbo Spring Cloud 将无缝对接 Dubbo 3.0,作为 Spring Cloud Alibaba 的最外围组件,齐全地拥抱 Spring Cloud 技术栈,岂但无缝地整合 Spring Cloud 注册核心,包含 Nacos、Eureka、Zookeeper 以及 Consul,而且齐全地兼容 Spring Cloud Open Feign 以及 @LoadBalanced RestTemplate,本文将探讨 Dubbo Spring Cloud 对 Spring Cloud 技术栈所带来的革命性变动,因为 Spring Cloud 技术栈涵盖的个性泛滥,因而本文探讨的范畴仅限于服务治理局部。

本文作为 Dubbo 3.0 的前瞻,将着重解说以后版本的 Dubbo Spring Cloud 实现,Dubbo Spring Cloud 得以实现的一个重要根底即是咱们前瞻之一提到的利用级服务发现。

利用级服务发现是 Dubbo 3.0 布局中的重要一环,是 Dubbo 与云原生基础设施买通、实现大规模微服务集群的基石。其实 Dubbo 社区早在 2.7.5 版本开始便摸索了利用级服务发现,尝试去优化 Dubbo 的服务发现模型,因而 Dubbo Spring Cloud 是基于 Dubbo Spring Boot 2.7.x(从 2.7.0 开始,Dubbo Spring Boot 与 Dubbo 在版本上保持一致)和 Spring Cloud 2.x 开发,而本文也将基于 2.7.x 的这个先期版本开展解说。

无论开发人员是 Dubbo 用户还是 Spring Cloud 用户,都能轻松地驾驭 Dubbo Spring Cloud,并以靠近“零”老本的代价使利用向上迁徙。Dubbo Spring Cloud 致力于简化 Cloud Native 开发成本,进步研发效力以及晋升利用性能等目标。

版本反对

因为 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.x 开发(最低 Java 版本为 1.8),提供残缺的 Dubbo 注解驱动、内部化配置以及 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 Dubbo Spring Cloud 不反对该版本

性能个性

因为 Dubbo Spring Cloud 构建在原生的 Spring Cloud 之上,其服务治理方面的能力可认为是 Spring Cloud Plus,不仅齐全笼罩 Spring Cloud 原生个性,而且提供更为稳固和成熟的实现,个性比对如下表所示:

性能组件 Spring Cloud Dubbo Spring Cloud
分布式配置(Distributed configuration) Git、Zookeeper、Consul、JDBC Spring Cloud 分布式配置 + Dubbo 配置核心(Dubbo 2.7 开始反对配置核心,可自定义适配)
服务注册与发现(Service registration and discovery) Eureka、Zookeeper、Consul Spring Cloud 原生注册核心(Spring Cloud 原生注册核心,除 Eureka、Zookeeper、Consul 之外,还包含 Spring Cloud Alibaba 中的 Nacos)+Dubbo 原生注册核心
负载平衡(Load balancing) Ribbon(随机、轮询等算法) Dubbo 内建实现(随机、轮询等算法 + 权重等个性)
服务熔断(Circuit Breakers) Spring Cloud Hystrix Spring Cloud Hystrix +Alibaba Sentinel 等(Sentinel 已被 Spring Cloud 我的项目纳为 Circuit Breaker 的候选实现)
服务调用(Service-to-service calls) Open Feign、RestTemplate Spring Cloud 服务调用 + Dubbo @Reference
链路跟踪(Tracing) Spring Cloud Sleuth +Zipkin  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 以及 @LoadBalancedRestTemplate 作为 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 或者 @LoadBalancedRestTemplate 迁徙为 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 服务生产方利用

1. 定义 Dubbo 服务接口

Dubbo 服务接口是服务提供方与生产方的近程通信契约,通常由一般的 Java 接口(interface)来申明,如 EchoService 接口:

public interface EchoService {String echo(String message);
}

为了确保契约的一致性,举荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中,如以上接口就寄存在 artifact spring-cloud-dubbo-sample-api 之中。

对于服务提供方而言,不仅通过依赖 artifact 的模式引入 Dubbo 服务接口,而且须要将其实现。对应的服务生产端,同样地须要依赖该 artifact,并以接口调用的形式执行近程办法。接下来进一步探讨怎么实现 Dubbo 服务提供方和生产方。

2. 实现 Dubbo 服务提供方

1)初始化 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>


    <!-- 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 服务注册与发现 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_ 文件。

实现以上步骤之后,下一步则是实现 Dubbo 服务。

2)实现 Dubbo 服务

EchoService 作为裸露的 Dubbo 服务接口,服务提供方 spring-cloud-dubbo-server-sample 须要将其实现:

@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 服务(本地)实现为 Dubbo 服务。因而,下一步须要将其配置 Dubbo 服务(近程)。

3)配置 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

spring:
  application:
    # Dubbo 利用名称
    name: spring-cloud-alibaba-dubbo-server
  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 注册核心。

下半局部则是 Spring Cloud 相干配置:

  • spring.application.name: Spring 利用名称,用于 Spring Cloud 服务注册和发现。> 该值在 Dubbo Spring Cloud 加持下被视作 dubbo.application.name,因而,无需再显示地配置 dubbo.application.name
  • spring.cloud.nacos.discovery: Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。

以上残缺的 YAML 配置文件,请参考 spring-cloud-dubbo-server-samplebootstrap.yaml 文件。

实现以上步骤后,还需编写一个 Dubbo Spring Cloud 疏导类。

4)疏导 Dubbo Spring Cloud 服务提供方利用

Dubbo Spring Cloud 疏导类与一般 Spring Cloud 利用并无差别,如下所示:

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

在疏导 DubboSpringCloudServerBootstrap 之前,请提前启动 Nacos 服务器。当 DubboSpringCloudServerBootstrap 启动后,将利用 spring-cloud-dubbo-server-sample 将呈现在 Nacos 控制台界面。

当 Dubbo 服务提供方启动后,下一步实现一个 Dubbo 服务生产方。

3. 实现 Dubbo 服务生产方

因为 Java 服务就 EchoService、服务提供方利用 spring-cloud-dubbo-server-sample 以及 Nacos 服务器均已筹备结束。Dubbo 服务生产方只需初始化服务生产方 Maven 工程 spring-cloud-dubbo-client-sample 以及生产 Dubbo 服务。

1)初始化 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_ 文件。

2)配置 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 服务发现与注册配置
      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` 文件。

3)疏导 Dubbo Spring Cloud 服务生产方利用

为了缩小实现步骤,以下疏导类将 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 命令执行 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 运算后的内容。

高阶示例

如果您须要进一步理解 Dubbo Spring Cloud 应用细节,可参考 参考官网 Samples。

其子模块阐明如下:

  • 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 网关繁难实现示例。

问题反馈

如果您在应用 Dubbo Spring Cloud 的过程中遇到任何问题,请在此反馈内容。

反馈链接:https://github.com/alibaba/spring-cloud-alibaba/issues

进阶浏览

对于更多的 Dubbo Spring Cloud 个性以及设计细节,请关注:

  • Spring Cloud Alibaba wiki:https://github.com/alibaba/spring-cloud-alibaba/wiki
  • Dubbo 的博客 :http://dubbo.apache.org/zh-cn/blog/index.html

系列文章:

  • Dubbo 云原生之路:ASF 毕业一周年、3.0 可期
  • Dubbo 迈出云原生重要一步 – 利用级服务发现解析

作者简介

小马哥 (mercyblitz),Java 劝退师,Apache Dubbo PMC、Spring Cloud Alibaba 我的项目架构师。目前次要负责阿里团体中间件开源我的项目、微服务技术施行、架构衍进、基础设施构建等。

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术畛域、聚焦云原生风行技术趋势、云原生大规模的落地实际,做最懂云原生开发者的公众号。”

退出移动版