Dubbo对Spring Cloud说:来老弟,我要拥抱你
项目地址
https://github.com/yinjihuan/kitty-cloud
前言
Kitty Cloud 开源后有以为朋友在 GitHub 上给我提了一个 issues,问为什么项目中要同时集成 Feign 和 Dubbo 两个框架来调用服务。今天就来聊一聊这个问题,然后讲下在 Kitty Cloud 中如何切换使用两种调用方式。
为什么要支持两种协议?
关于支持两种协议,我这个是一个开源项目,主要还是为了让使用者有更多的选择。当然框架本身不是我开发的,我只是使用者而已。
一种协议更统一化,两种协议混着用也不是不可以,具体还是看实际需求。比如你们内部有个 ID 分发的服务,调用量很高,就是对性能有这极致的要求。那么这个场景你就可以用 Rpc 来代替 Http 了。其他的正常使用 Http 协议就行,特殊场景的就用 Rpc 协议,互补而已。
用 Http 最好的点在于简单,传输内容就是文本,调试什么的都很方便。比如我要单独测试某个服务的接口,直接 PostMan 上调用这个 Http 接口就可以了,或者用 Swagger。
如果是 Dubbo 的 Rpc, 我可能需要用 telnet 来调用。
还有就是网关层的转发,如果是 Http 协议,直接转发过去了。如果是 Rpc 协议,网关内部需要转特殊处理,当然目前也有支持 Rpc 的网关。如果我们是两种协议,网关这边还是直接 Http 转发过去即可,内部服务之前想用什么协议让使用者自己决定。
其实在 Spring Cloud 慢慢进入企业后,有很多人都会遇到一个问题就是老的服务都是用 Dubbo 来通信的,如果转 Spring Cloud 技术栈,那么势必要去掉 Dubbo。
如果规模不大直接重构掉也没关系,但是对于大规模的应用,服务数量众多。不太可能一口吃成个胖子。就算要重构那也是一个一个的方式来,也就意味着在没重构完之前,老的服务还是 Dubbo,但有一些服务已经变成 Spring Cloud 体系了。这个时候兼容就是一个迫切需要解决的问题。
Spring Cloud Alibaba 的出现就为这个问题提供了完美的解决方案,同时支持两种协议,可以慢慢过渡迁移。
举例说明
下面通过一个例子来说明:
下图中有两个服务,最开始都是 Rpc 协议,服务 A 通过 Rpc 方式调用服务 B。

当我们将服务 B 重构成 Http 协议后,服务 A 就需要使用 Http 方式来调用服务 B。

改造方案一
如果从实现需求上来讲,很简单,将服务 A 中调用的代码给出用 Feign 或者 RestTemplate 调用即可。但是这样也就意味着我重构了 B 服务,还需要改动 A 服务的代码,很有可能不止 A 一个服务在调用 B 服务,也许有几十个,那么我是不是得改几十个服务的调用方式。
显然这个方案不可行。你如果这样出方案,你老大一个眼神送给你,自己体会吧。。。。。
改造方案二
方案一既然被否了,那需求很明显嘛,就是你可以重构成 Spring Cloud 技术栈,但是你不能影响使用方。
要想不影响使用方,感觉只能从 Dubbo 的调用这块入手。也就是在Dubbo 底层去扩展,如果目标服务是老的 Rpc 协议,那么调用方式保持不变即可。
如果目标服务变成新的 Http 协议,那么就需要使用新的方式去调用,只有在底层兼容了才不会影响使用方。

改造方案三
第三种方案也就是我们现在目前的方案,让服务 B 支持双协议,支持双协议后,那么所有的调用方都不用改变,因为 Rpc 的方式还支持。如果有新的服务可以使用 Http 来调用 B 服务的接口。

怎么支持两种协议?
支持两种协议的核心在于 Dubbo Spring Cloud ,Dubbo Spring Cloud 作为 Spring Cloud Alibaba 中的最核心组件,基本上适配了 Spring Cloud 技术栈。
接口还是单独抽出来放在 API 模块中,FeignClient 相关定义在接口上。

在实现类中同时暴露两种协议,加上 Dubbo 的@Service 和@RestController 注解。

使用方只需要注入接口即可调用,如果想使用 Feign 调用就用@Autowired 进行注入。
@Autowired
private UserRemoteService userRemoteService;
如果想使用 Dubbo 进行调用就用@Reference 进行注入。
@Reference(version = DubboConstant.VERSION_V100, group = DubboConstant.DEFAULT_GROUP, check = false)
private UserRemoteService userRemoteService;
还有一个很重要的配置在于需要将 Dubbo 的注册中心挂载到 Spring Cloud 注册中心上。
dubbo.registry.address=spring-cloud://localhost
高级玩法
目前虽然支持了双协议,但使用权交到了用户手里。就是你想用什么协议发起调用都可以,是通过硬编码的方式来处理的。
如果想灵活度更高的话,我们可以在 Dubbo 或者 Feign 的底层去扩展。比如基于 Feign 去扩展的话,那就是调用都是采用 Feign 的方式,不需要用@Reference 来注入客户端。我们可以通过集成配置中心,用配置的方式来指定采用哪种协议调用。在 Feign 底层通过配置内容决定是否要走 Rpc 调用。如果要走 Rpc 可以用 Dubbo 的泛化调用。

Dubbo对Spring Cloud说:来老弟,我要拥抱你的更多相关文章
- Dubbo和Spring Cloud微服务架构'
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
- Dubbo和Spring Cloud
1.Dubbo和Spring Cloud区别 1).通信方式不同 Dubbo使用RPC通信,Spring Cloud使用Http RestFul方式 2) 组成部分不同 组件 Dubbo Spring ...
- Dubbo和Spring Cloud微服务架构比较
Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...
- 你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
- 听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构
转自:https://baijiahao.baidu.com/s?id=1600174787011483381&wfr=spider&for=pc 微服务架构是互联网很热门的话题,是互 ...
- Dubbo 和 Spring Cloud微服务架构 比较及相关差异
你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构. 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务, ...
- Dubbo和Spring Cloud开发框架对比
前言 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案 ...
- dubbo 与Spring Cloud 对比
链接:https://www.zhihu.com/question/45413135/answer/242224410 近期也看到一些分享Spring Cloud的相关实施经验,这对于最近正在整理Sp ...
- 【图解】我使用过的 Dubbo 和 Spring Cloud
自从2015年毕业开始从事 Java 开发工作,已经过去3年多了, 在各种不知名的小公司待过,经历过生产力从低到高,技术从落后到先进的过程, Dubbo 和 Spring Cloud 就是我曾经所经历 ...
- 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣
标签: 微服务dubbospring架构 前言 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然 ...
随机推荐
- kubernetes的无状态服务和有状态服务介绍
无状态服务 1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的 2)多个实例可以共享相同的持久化数据.例如: nginx实例和tomcat实例 3 ...
- ISWC 2018概览:知识图谱与机器学习
语义网的愿景活跃且良好,广泛应用于行业 语义网的愿景是「对计算机有意义」的数据网络(正如 Tim Berners Lee.James Hendler 和 Ora Lassila 在<科学美国人& ...
- Java中Character类
Character 类在对象中包装一个基本类型char的值此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等),并将字符从大写转小写,反之亦然. 构造方法: Character(char ...
- TensorFlow-keras fit的callbacks参数,定值保存模型
from tensorflow.python.keras.preprocessing.image import load_img,img_to_array from tensorflow.python ...
- 【vue】nextTick源码解析
1.整体入手 阅读代码和画画是一样的,忌讳一开始就从细节下手(比如一行一行读),我们先将细节代码折叠起来,整体观察nextTick源码的几大块. 折叠后代码如下图 整体观察代码结构 上图中,可以看到: ...
- 算法笔记刷题5(PAT A1025)
第一次上手PAT的甲级题目,瑟瑟发抖(英语不好对着题目愣了半天) 这一题的要点是使用sort函数. 使用sort函数必须使用 #include <algorithm> using name ...
- python学习笔记(五)---函数与类
函数 def为定义函数的一个标志 demo1: def greet_user(username): print("Hello, " + username.title() + &qu ...
- 联想在S规则债券市场完成了里程碑式的新债券发行
腾讯科技讯,香港,2020 年 4 月 24 日-联想集团(HKSE:992)(ADR:LNVGY)今日宣布,在S规则债券市场上成功发行了里程碑式的 6.5 亿美元债券. 这些债券吸引了全球大量固定收 ...
- 被@ResponseBoby注释的方法在拦截器的posthandle方法中设置cookie失效的问题
文章标题可能有点绕口.先来解释下遇到的问题. 我写了一个拦截器,希望能够实现保存特定方法的请求参数到cookie中. public class SaveParamInterceptor extends ...
- 20171016 Python的安装
Linux: wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz.asc tar zxvf Python-2.7.13.tg ...