{"id":24917159,"url":"https://github.com/itmuch/spring-cloud-dubbo-together","last_synced_at":"2025-07-05T01:33:51.077Z","repository":{"id":112796372,"uuid":"87644947","full_name":"itmuch/spring-cloud-dubbo-together","owner":"itmuch","description":"Spring Cloud与Dubbo共存方案","archived":false,"fork":false,"pushed_at":"2017-05-28T14:49:49.000Z","size":25955,"stargazers_count":159,"open_issues_count":0,"forks_count":82,"subscribers_count":18,"default_branch":"master","last_synced_at":"2023-10-20T20:29:34.046Z","etag":null,"topics":["dubbo","microservices","spring-boot","spring-cloud"],"latest_commit_sha":null,"homepage":"http://www.itmuch.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/itmuch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-04-08T15:45:38.000Z","updated_at":"2023-03-09T11:51:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"93e8f6f9-ff5a-4c31-a6c7-5e8d929639e4","html_url":"https://github.com/itmuch/spring-cloud-dubbo-together","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmuch%2Fspring-cloud-dubbo-together","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmuch%2Fspring-cloud-dubbo-together/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmuch%2Fspring-cloud-dubbo-together/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmuch%2Fspring-cloud-dubbo-together/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/itmuch","download_url":"https://codeload.github.com/itmuch/spring-cloud-dubbo-together/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236772487,"owners_count":19202279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dubbo","microservices","spring-boot","spring-cloud"],"created_at":"2025-02-02T08:31:20.930Z","updated_at":"2025-02-02T08:31:39.359Z","avatar_url":"https://github.com/itmuch.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## README\n\n## 一、背景\n\n假设有一个遗留的Dubbo系统，现在想改用Spring Cloud。\n\n由于遗留Dubbo系统比较庞大，短期之内无法完成技术栈的迁移。因此需要“分步走”，即：初期实现两者共存，后期逐步绞杀Dubbo应用，最终实现技术栈的统一。\n\np.s. 这里并没有贬低Dubbo的意思，仅是按照该场景讨论。\n\n\n\n\n\n## 二、头脑风暴\n\n架构迁移、技术栈更换、项目重构时的第一步往往不是“改造”，而是“停止修改”。基于这个原则，个人不太倾向于去立即大幅重构Dubbo应用原先的代码。原因有二：首先是原则问题，更重要的是时间成本、技术风险很难得到控制。\n\n而，假如新编写的Spring Cloud应用去进行迁就，例如：\n\n* 完全不动Dubbo遗留系统，使用RestTemplate或Feign编写Dubbo（DubboX）的RESTful API客户端代理 —\u003e 有一定的实现复杂度、Dubbo接口改造成RESTful API后，消费方都需要再次修改（开始是代理，后来不用代理，因此有二次修改的问题）。\n* 索性将Spring Cloud应用也整合Dubbo—\u003e存在改造不完整、技术栈不统一、无法约束开发人员用哪种方式API、额外的复杂度的问题（越多的组件、越多的环节意味着越多的坑）。\n\n考虑到一般来讲，遗留系统的改造过程中一般都是新系统调用老系统，很少出现老系统大规模调用新系统的场景（至少我这边目前是这样^_^）。因此，笔者列出几种仅需少量的代码编写成本即可实现Spring Cloud与Dubbo短期/长期共存，并且侵入性较小，同时还允许我们改造遗留Dubbo系统的几种方案，算是**抛砖引玉。期待朋友们提出更优雅、成本更小的方案。**\n\n\n\n\n\n## 三、亮代码\n\n### Sample1：借助Ribbon调用Dubbo应用。\n\n优点：架构不依赖Eureka或其他服务注册组件，借助Ribbon去调用Dubbo微服务暴露的RESTful API；\n\n缺点：如果Dubbo微服务较多时，均需手动配置，不适合新式的部署环境（例如Docker，因为每次部署IP/端口可能都不同）\n\n\n\n\n\n###  Sample2：借助Sidecar\n\n使用Sidecar，Dubbo微服务必须实现健康检查（对于Spring Boot程序即：添加spring-boot-starter-actuator依赖）。\n\n优点：\n\n* 这种方式下，Dubbo应用也可通过Sidecar调用Spring Cloud微服务的接口，Sidecar是连接Spring Cloud应用于Dubbo应用的桥梁。\n* 可以通过Sidecar传播Dubbo微服务的健康状态到Eureka Server。\n\n缺点：\n\n* 在于每个Dubbo微服务节点必须额外部署一个Sidecar应用。\n* 在Dubbo微服务调用Spring Cloud微服务时，增加了调用链的长度。（需使用Sidecar转发）\n\n\n\n\n\n### Sample3：借助Eureka实现整合\n\n将Dubbo应用也注册到Eureka上。\n\n优点：\n\n* 没有多余的组件（除了Dubbo的注册中心ZK）\n* 没有什么局限\n\n缺点：\n\n* 对于非Spring Boot的应用，改造有一定的成本。\n\n\n\n\n\n\n## GOING FAR\n\n本项目中几个Demo中，都是手动编码为Dubbo应用开放RESTful API的，实际迁移过程可以借助cglib或者lombok之类的工具，实现从Dubbo接口道RESTful API的转换。本仓库主要还是为大家提供思路，不做具体讨论。\n\n\n\n\n\n## 四、广告\n\n* Spring Cloud QQ交流群：**564840207**、157525002（已满）\n\n\n* 实体书《Spring Cloud与Docker微服务架构实战》上线啦！\n\n  * **京东购书链接**\n\n  ![京东购书链接](jd-购书链接.png)\n\n* 实体书配套代码：\u003chttp://www.itmuch.com/advertisment/my-spring-book-code/\u003e\n\n* 个人博客：\u003chttp://www.itmuch.com\u003e\n\n* 个人公众号：\n\n  ![](个人公众号.jpg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitmuch%2Fspring-cloud-dubbo-together","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fitmuch%2Fspring-cloud-dubbo-together","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitmuch%2Fspring-cloud-dubbo-together/lists"}