微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dubbo怎么实现Spring Cloud服务治理

本篇内容介绍了“dubbo怎么实现Spring Cloud服务治理 ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

版本支持

由于 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

: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 等

高亮特性

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 注册中心并存,提供双注册机制,实现无缝迁移

dubbo 作为 Spring Cloud 服务调用

认情况,Spring Cloud Open Feign 以及 @LoadBalancedRestTemplate 作为 Spring Cloud 的两种服务调用方式。dubbo Spring Cloud 为其提供了第三种选择,即 dubbo 服务将作为 Spring Cloud 服务调用的同等公民出现,应用可通过 Apache dubbo 注解 @Service和 @Reference 暴露和引用 dubbo 服务,实现服务间多种协议的通讯。同时,也可以利用 dubbo 泛化接口轻松实现服务网关。

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 也将提供服务自省的能力。

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 服务消费方应用 

定义 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 服务提供方和消费方。

实现 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>


    <!-- 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 服务。

实现 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 服务(远程)。

配置 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 引导类。

引导 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 服务消费方。

实现 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 服务发现与注册配置
      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-samplebootstrap.yaml 文件

引导 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服务治理 ”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程之家网站,小编将为大家输出更多高质量的实用文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐