Java技术分享系列:Dubbo 与 Spring Cloud 完美结合
1. 概述
可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时间,中间只发过一个小版本修了一个小bug,甚至大家都以为这个项目已经死掉了,竟然又在2017年9月份恢复了更新,不可谓不神奇。
网络上很多人都拿Dubbo和Spring Cloud做对比,可能在大家的心目中,这两个框架是可以画上等号的吧,后来在网络上有一个非常流行的表格,比较详细的对比了 Spring Cloud 和 Dubbo ,表格如下:
以上列举了一些核心部件,当然这里需要申明一点,Dubbo对于上表中总结为“无”的组件不代表不能实现,而只是Dubbo框架自身不提供,需要另外整合以实现对应的功能,这样看起来确实Dubbo更像是Spring Cloud的一个子集。
Dubbo 在国内拥有着巨大的用户群,大家希望在使用 Dubbo 的同时享受 Spring Cloud 的生态,出现各种各样的整合方案,但是因为服务中心的不同,各种整合方案并不是那么自然,直到 Spring Cloud Alibaba 这个项目出现,由官方提供了 Nacos 服务注册中心后,才将这个问题完美的解决。并且提供了 Dubbo 和 Spring Cloud 整合的方案,命名为: Dubbo Spring Cloud 。
1.2 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 配置中心 |
服务注册与发现(Service registration and discovery) |
Eureka、Zookeeper、Consul |
Spring Cloud 原生注册中心 + Dubbo 原生注册中心 |
负载均衡(Load balancing) |
Ribbon(随机、轮询等算法) |
Dubbo 内建实现(随机、轮询等算法 + 权重等特性) |
服务熔断(Circuit Breakers) |
Spring Cloud Hystrix |
Spring Cloud Hystrix + Alibaba Sentinel 等 |
服务调用(Service-to-service calls) |
Open Feign、RestTemplate |
Spring Cloud 服务调用 + Dubbo @Reference |
链路跟踪(Tracing) |
Spring Cloud Sleuth + Zipkin |
Zipkin、opentracing 等 |
以上对比表格摘自Dubbo Spring Cloud官方文档。
而且Dubbo Spring Cloud 基于 Dubbo Spring Boot 2.7.1 和 Spring Cloud 2.x 开发,无论开发人员是 Dubbo 用户还是 Spring Cloud 用户, 都能轻松地驾驭,并以接近“零”成本的代价使应用向上迁移。Dubbo Spring Cloud 致力于简化云原生开发成本,以达成提高研发效能以及提升应用性能等目的。
1.3 Dubbo Spring Cloud 主要特性
·面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,屏蔽了远程调用底层细节。
·智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
·服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
·高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
·运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
·可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
1.4 Spring Cloud 为什么需要RPC
在Spring Cloud构建的微服务系统中,大多数的开发者使用都是官方提供的Feign组件来进行内部服务通信,这种声明式的HTTP客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用Feign消费服务的时候,相比较Dubbo这种RPC框架而言,性能堪忧。
虽说在微服务架构中,会讲按照业务划分的微服务独立部署,并且运行在各自的进程中。微服务之间的通信更加倾向于使用HTTP这种简答的通信机制,大多数情况都会使用REST API。这种通信方式非常的简洁高效,并且和开发平台、语言无关,但是通常情况下,HTTP并不会开启KeepAlive功能,即当前连接为短连接,短连接的缺点是每次请求都需要建立TCP连接,这使得其效率变的相当低下。
对外部提供REST API服务是一件非常好的事情,但是如果内部调用也是使用HTTP调用方式,就会显得显得性能低下,Spring Cloud默认使用的Feign组件进行内部服务调用就是使用的HTTP协议进行调用,这时,我们如果内部服务使用RPC调用,对外使用REST API,将会是一个非常不错的选择,恰巧,Dubbo Spring Cloud给了我们这种选择的实现方式。
2. 实战
本小结将会以一个简单的入门案例,介绍一下在使用Nacos作为服务中心,使用Dubbo来实现服务提供方和服务消费方的案例。
2.1 创建父工程 dubbo-spring-cloud-demo
父工程依赖pom.xml如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/pom.xml
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Dubbo Spring Cloud Starter --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <!-- Spring Cloud Nacos Service Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> |
注意:
必须包含
spring-boot-starter-actuator包,不然启动会报错。
spring-cloud-starter-dubbo包需要注意groupId,根据具体使用的spring cloud alibaba版本依赖来确定。
如果使用孵化版本,使用的groupId为:org.springframework.cloud
如果使用毕业版本,使用的groupId为:com.alibaba.cloud
以上引用未指定版本,需显示的声明<dependencyManagement>
2.2 创建子工程 dubbo_api
API模块,存放Dubbo服务接口和模型定义,非必要,这里创建仅为更好的代码重用以及接口、模型规格控制管理。
定义抽象接口HelloService.java:
代码清单:
Alibaba/dubbo-spring-cloud-demo/dubbo_api/src/main/java/com/springcloud/dubbo_api/service/HelloService.java
public interface HelloService{ String hello(String name); } |
2.3 创建子工程 dubbo_provider ,Dubbo服务提供方
工程依赖pom.xml如下:
代码清单:
Alibaba/dubbo-spring-cloud-demo/dubbo_provider/pom.xml
<!-- API --> <dependency> <groupId>com.springcloud.book</groupId> <artifactId>ch13_1_dubbo_api</artifactId> <version>${project.version}</version> </dependency> |
引入公共API模块
实现Dubbo接口,HelloServiceI.java如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/springcloud/dubbo_provider/service/HelloServiceI.java
@Service public class HelloServiceI implements HelloService { @Override public String hello(String name) { return "Hello " + name; } } |
配置文件 application.yml 需要将Java服务(本地)配置为 Dubbo 服务(远程)如下:
代码清单:
Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/resources/application.yml
server: port: 8000 dubbo: scan: base-packages: com.springcloud.book.ch13_1_dubbo_provider.service protocol: name: dubbo port: -1 registry: address: spring-cloud://192.168.44.129 spring: application: name: dubbo-spring-cloud-provider cloud: nacos: discovery: server-addr: 192.168.44.129:8848 main: allow-bean-definition-overriding: true |
测试接口HelloController.java如下:
代码清单:
Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/controller/HelloController.java
@RestController public class HelloController { @Reference private HelloService helloService; @GetMapping("/hello") public String hello() { return helloService.hello("Dubbo!"); } } |
启动主类
Ch131DubboConsumerApplication.java如下:
代码清单:
Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/DubboConsumerApplication.java
@SpringBootApplication @EnableDiscoveryClient public class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); } } |
测试如图所示
} }
Java技术分享系列:Dubbo 与 Spring Cloud 完美结合相关推荐
- Spring Cloud Alibaba | Dubbo 与 Spring Cloud 完美结合
https://www.cnblogs.com/babycomeon/p/11546737.html Spring Cloud Alibaba | Dubbo 与 Spring Cloud 完美结合 ...
- Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...
- Java 微服务框架选型(Dubbo 和 Spring Cloud)
微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任 ...
- Java 微服务框架选型(Dubbo 和 Spring Cloud?)
|来源:博客园 |链接:https://www.cnblogs.com/xishuai/archive/2018/04/13/dubbo-and-spring-cloud.html 微服务(Micro ...
- Java 微服务框架对比:Dubbo 和 Spring Cloud
微服务特点: 微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成. 独立部署 松耦合 单一职责,每个服务仅关注一件任务 微服务框架 相关概念: rpc 1. ...
- 深入理解分布式技术 - Dubbo vs Spring Cloud
文章目录 概 Dubbo 总体架构 应用特性 Spring Cloud 总体架构 应用特性 Dubbo vs Spring Cloud 功能对比 调用方式 服务发现 开发成本 概 提到微服务开源框架, ...
- 【Java学习路线之JavaWeb】Spring Cloud教程(非常详细)
文章目录 读者 阅读条件 微服务是什么 微服务,我们可以从字面上去理解,即"微小的服务",下面我们从"服务"和"微小"两个方面进行介绍. 微 ...
- Dubbo和Spring Cloud微服务架构的对比
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
- Dubbo和Spring Cloud微服务架构
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
最新文章
- Equifax再陷风波:一门户网站管理员密码是admin/admin
- 终端下载文件(windows和linux)
- android 4大组件相互启动,Android四大组件之Activity
- 【指标统计】标记存量遥控(成功/失败)遥信(正确/错误)
- 重庆邮电大学发布2021年最新小样本目标检测综述
- Xcode没有pch文件
- 自己也遇到了-db_recovery_file_dest_size 修改大一点
- 云计算未来趋势预测:AIaaS、无服务器、云端一体化等将成重点?
- 财物机器人英文ppt演讲课件_“如何恰当使用课件动画”
- PLSQL 查询结果只显示年月日不显示时分秒的解决方法
- Android Device Monitor 的 File Explorer 打开一片空白,不显示文件
- The Child and Toy
- 1808福师计算机基础第二次作业,1808福师计算机基础第一次作业.pdf
- 2014年中国B2B行业十大预测
- 图片复印如何去除黑底_如何去除扫描件的底色? 扫描的图片去除背面的阴影的方法...
- 按需使用vue-cli-plugin-element插件
- Weakly Supervised Semantic Segmentation with Boundary Exploration
- GNU/Linux智能Makefile模板(多目录,多文件)
- 计算机被老师关闭网络了,电脑被老师控制如何解控
- 英勇的战士——斯巴达
热门文章
- 使用Python编写CFD程序-模拟二维空间气流气压+绘制风场气压场动画(详细教程)
- 入驻京东直播间、成功借壳上市,交个朋友和时间“交朋友”
- vue制作点击切换图片效果
- HTML模板布局页面教程,css网页布局教程 标签 HTML Nav CSS布局教程
- 什么情况下铝电解电容可以替换钽电容
- mysql 没有 advisor_MySQL之安装美团点评的SQLAdvisor
- linux中配置环境变量的文件
- 【Grasshopper基础6】输入/输出参数可变的电池 / 如何让电池支持参数增加和减少
- 宏碁TravelMate tx50g2配置tensorflow-gpu
- HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库