Spring Cloud与Dubbo共存方案总结

一、背景

假设有一个遗留的Dubbo系统,现在想改用Spring Cloud。

由于遗留Dubbo系统比较庞大,短期之内无法完成技术栈的迁移。因此需要“分步走”,即:初期实现两者共存,后期逐步绞杀Dubbo应用,最终实现技术栈的统一。

p.s. 这里并没有贬低Dubbo的意思,仅是按照该场景讨论。

二、头脑风暴

架构迁移、技术栈更换、项目重构时的第一步往往不是“改造”,而是“停止修改”。基于这个原则,个人不太倾向于去立即大幅重构Dubbo应用原先的代码。原因有二:首先是原则问题,更重要的是时间成本、技术风险很难得到控制。

而,假如新编写的Spring Cloud应用去进行迁就,例如:

完全不动Dubbo遗留系统,使用RestTemplate或Feign编写Dubbo(DubboX)的RESTful API客户端代理 —> 有一定的实现复杂度、Dubbo接口改造成RESTful API后,消费方都需要再次修改(开始是代理,后来不用代理,因此有二次修改的问题)。

索性将Spring Cloud应用也整合Dubbo—>存在改造不完整、技术栈不统一、无法约束开发人员用哪种方式API、额外的复杂度的问题(越多的组件、越多的环节意味着越多的坑)。

考虑到一般来讲,遗留系统的改造过程中一般都是新系统调用老系统,很少出现老系统大规模调用新系统的场景(至少我这边目前是这样^_^)。因此,笔者列出几种仅需少量的代码编写成本即可实现Spring Cloud与Dubbo短期/长期共存,并且侵入性较小,同时还允许我们改造遗留Dubbo系统的几种方案,算是抛砖引玉。期待朋友们提出更优雅、成本更小的方案。

三、亮代码

Sample1:借助Ribbon调用Dubbo应用。

优点:

架构不依赖Eureka或其他服务注册组件,借助Ribbon去调用Dubbo微服务暴露的RESTful API;

缺点:

如果Dubbo微服务较多时,均需手动配置,不适合新式的部署环境(例如Docker,因为每次部署IP/端口可能都不同)

Sample2:借助Sidecar

使用Sidecar,Dubbo微服务必须实现健康检查(对于Spring Boot程序即:添加spring-boot-starter-actuator依赖)。

优点:

这种方式下,Dubbo应用也可通过Sidecar调用Spring Cloud微服务的接口,Sidecar是连接Spring Cloud应用于Dubbo应用的桥梁。

可以通过Sidecar传播Dubbo微服务的健康状态到Eureka Server。

缺点:

在于每个Dubbo微服务节点必须额外部署一个Sidecar应用。

在Dubbo微服务调用Spring Cloud微服务时,增加了调用链的长度。(需使用Sidecar转发)

Sample3:借助Eureka实现整合

将Dubbo应用也注册到Eureka上。

优点:

没有多余的组件(除了Dubbo的注册中心ZK)

没有什么局限

缺点:

对于非Spring Boot的应用,改造有一定的成本。

GOING FAR

本项目中几个Demo中,都是手动编码为Dubbo应用开放RESTful API的,实际迁移过程可以借助cglib或者lombok之类的工具,实现从Dubbo接口道RESTful API的转换。本仓库主要还是为大家提供思路,不做具体讨论。

代码下载地址

https://github.com/itmuch/spring-cloud-dubbo-together

原文发布于微信公众号 - A周立SpringCloud(gh_e6849e368b5f)

原文发表时间:2017-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

一些免费的学习资源 原

HTML5 Canvas编程:http://blog.csdn.net/column/details/canvas-programming.html GTK编...

51430
来自专栏非著名程序员

Android程序员必备精品资源

平时写程序中不断收集到的一些比较常用的东西,实用工具等,分享给大家。 实用工具集锦 Android Lifecycle https://github.com/x...

21770
来自专栏IT进修之路

原 Dubbo与Spring Cloud共

74360
来自专栏用户2442861的专栏

轻松理解AOP(面向切面编程)

本文主要介绍AOP思想,而不是Spring,Spring在本文只做为理解AOP的工具和例子,所以也不打算介绍Spring的Aspect、Join point、...

11310
来自专栏从流域到海域

《笨办法学Python》 第26课手记

《笨办法学Python》 第26课手记 本节课的任务是找出代码中的错误,所以就不贴结果了。大家认真找,尝试完全靠自己来修正代码中的错误,如果实在找不到,就休息一...

22380
来自专栏三丰SanFeng

Linux进程间通信(五) - 信号灯(史上最全)及其经典应用案例

信号灯概述 什么是信号灯 信号灯用来实现同步,用于多线程,多进程之间同步共享资源(临界资源)。 PV原语:信号灯使用PV原语 P原语操作的动作是: u sem减...

68270
来自专栏Java架构

京东Java架构师讲解购物车的原理及Java实现

1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗? 

56250
来自专栏程序你好

Java程序员从Spring框架中学习到的三种最佳实践

15320
来自专栏繁花云

[评测]腾讯云成都区域性能测评

最近腾讯云推出了成都节点,听说性能很好(当然国内云都是套路),博主已经入了两年的成都一区服务器,所以出个测评。

81600
来自专栏CSDN技术头条

嵌入式开发中静态代码分析器的七种用途

当前标准的C语言编译器存在普遍只能找出代码中潜在的缺陷,而对程序方案设计并没有效。使用静态代码分析器有助于提升固件和捕获编译器难以察觉的问题。以下是每一位嵌入式...

23870

扫码关注云+社区

领取腾讯云代金券