扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“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 必要的依赖:
org.springframework.cloud spring-cloud-dubbo-sample-api ${project.version} org.springframework.boot spring-boot-actuator org.springframework.cloud spring-cloud-starter-dubbo org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 以上依赖 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 Starterartifact
,间接引入dubbo-spring-boot-starter
等 artifact
spring-cloud-starter-alibaba-nacos-discovery
: Nacos Spring Cloud 服务注册与发现artifact
值得注意的是,以上 artifact 未指定版本(version),因此,还需显示地声明
:
org.springframework.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import 注:以上完整的 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-sample
bootstrap.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 依赖:
org.springframework.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import org.springframework.cloud spring-cloud-dubbo-sample-api ${project.version} org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-actuator org.springframework.cloud spring-cloud-starter-dubbo org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 与应用
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-sample
bootstrap.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 服务,消费 DubboEchoService
服务。因此, 可通过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%89HTTP 响应为:
[echo] Hello, 小马哥(mercyblitz)以上结果说明应用
spring-cloud-dubbo-client-sample
通过消费 Dubbo 服务,返回服务提供方spring-cloud-dubbo-server-sample
运算后的内容。“Dubbo怎么实现Spring Cloud服务治理 ”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
新闻标题:Dubbo怎么实现SpringCloud服务治理
分享网址:http://kswjz.com/article/jjocho.html
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流