您好,登录后才能下订单哦!
本篇内容介绍了“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 基于 Spring Cloud Commons 抽象实现 Dubbo 服务注册与发现,应用只需增添外部化配置属性 “dubbo.registry.address = spring-cloud://localhost
”,就能轻松地桥接到所有原生 Spring Cloud 注册中心,包括: - Nacos - Eureka - Zookeeper - Consul
注:Dubbo Spring Cloud 将在下个版本支持 Spring Cloud 注册中心与 Dubbo 注册中心并存,提供双注册机制,实现无缝迁移
默认情况,Spring Cloud Open Feign 以及 @LoadBalancedRestTemplate
作为 Spring Cloud 的两种服务调用方式。Dubbo Spring Cloud 为其提供了第三种选择,即 Dubbo 服务将作为 Spring Cloud 服务调用的同等公民出现,应用可通过 Apache Dubbo 注解 @Service
和 @Reference
暴露和引用 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 完全地保留了原生 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 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如 EchoService
接口:
public interface EchoService { String echo(String message); }
为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中,如以上接口就存放在 artifact spring-cloud-dubbo-sample-api 之中。
对于服务提供方而言,不仅通过依赖 artifact 的形式引入 Dubbo 服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该 artifact,并以接口调用的方式执行远程方法。接下来进一步讨论怎样实现 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 服务。
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 服务方面,推荐开发人员外部化配置的方式,即指定 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-sample
bootstrap.yaml
文件
完成以上步骤后,还需编写一个 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 服务消费方。
由于 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 服务消费方配置与服务提供方类似,当前应用 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
文件
为了减少实现步骤,以下引导类将 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服务治理 ”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。