当前开源的微服务框架有Dubbo, Spring Cloud, Dubbox, Motan, Thrift, GRPC 等;以Dubbo和Spring Cloud使用最广,本文仅对这两个框架结合自己项目的情况进行比较。
Dubbo 架构
从Dubbo的架构图中我们可以看出Dubbo重点是RPC框架,对应微服务相关的其它组件,如服务发现,配置管理等需要用户自己适配;
Spring Cloud架构
Spring Cloud架构中包括了微服务生态中的大部分组件,包括但不限于服务发现,配置管理,路由网关,限流熔断等
详细比较
我们结合自己项目的情况从10个方面对两个框架比较
迁移成本
现有的系统正在线上运行,所以迁移过程中不能影响现有的系统而且尽量不耽误新功能的开发;
- Dubbo迁移过程
- 分离服务接口到独立的jar包
- 在服务端xml文件中配置服务接口将服务暴露出去
- 在客户端引入接口jar包,在xml文件中引入服务端暴露的接口
- Spring Cloud迁移过程
- 为接口定义HTTP协议
- 服务端在controller里面以rest API的方式暴露接口
- 客户端根据定义的http协议用FeignClient注解的形式定义访问接口
- 客户端代码引入FeignClient定义的协议接口
由此可见,dubbo迁移不需要修改java 代码,spring cloud 需要为每个接口定义一套http协议,而且客户端需要定义访问接口
社区支持
社区支持我们参考github的数据
Dubbo | Spring Cloud | |
---|---|---|
Star | 18k+ | 2.1k+ |
Fork | 12k+ | 1.1k+ |
Contribute | 70+ | 130+ |
Open Issues | 430+ | 380+ |
Close Issues | 740+ | 1.9k+ |
Latest Updated | 几个小时前,但是2014-10-30到2017-09-07断更 | 几个小时前 |
服务治理
- Dubbo服务治理不太完善
- Spring Cloud有比较完善的服务治理组件,Zuul, Ribbon, Hystrix等
生态建设
- Dubbo生态包括: RPC框架,服务治理, 服务降级,其它相关组件可以集成第三方成熟的开源组件;
- Spring Cloud生态包括: RPC框架,服务发现,配置服务,服务治理,服务降级,日志收集,任务管理,几乎包括了服务化相关的所有组件;
分布式事务
Dubbo和Spring Cloud 都没有实现分布式事务
运维成本
运维需要关注以下组件
- 服务发现
- Dubbo采用Zookeeper公司有Zookeeper的使用经验
- Spring Cloud采用Eureka,需要搭建新的eureka服务
- 配置管理
- Dubbo采用Apollo,公司已经投入生产环境
- Spring Cloud 需要重新部署spring cloud config
- 服务治理
- Dubbo 需要独立部署Dubbo-OPS, Zipkin/hydp/cat
- Spring Cloud 需要独立部署 Zuul, Zipkin
综上,Dubbo新部署2个组件,Sping Cloud新部署4个组件
开发流程
- Dubbo开发流程
- 确保服务发现组件已启动
- 定义接口,生成接口jar包发布到maven仓库
- 服务端实现接口逻辑;同时客户端引入接口jar包,实现客户端逻辑, 完成自测
- 客户端服务端联调
- Spring Cloud开发流程
- 确保服务发现组件已启动
- 定义http接口,形成文档
- 服务端实现接口逻辑而且以rest API的形式发布出去;同时客户端根据http接口约定实现客户端逻辑,完成自测
- 客户端服务端联调
所以,Dubbo的接口具有强依赖性,Spring Cloud主要依赖约定
集成测试
Dubbo和Spring Cloud集成测试的时候都需要服务的和客户端配合完成
学习成本
- Dubbo主要提供Spring Xml配置的方式,同时社区也提供SpringBoot的注解方式Dubbo Spring Boot Project ,而且Dubbo官方提供了最佳实践;目前我们的项目中两种方式都存在,所以学习成本基本可以忽略;
- Spring Clould是建立在SpringBoot基础上的,采用大量的注解方式,目前我们也大量使用SpringBoot, 所以学习成本基本可以忽略;
性能
- Dubbo默认采用Dubbo协议,Dubbo协议工作在TCP层,同等条件下性能优于HTTP协议
- Spring Clould采用HTTP协议, 性能略逊与Dubbo
最后将以上比较项目给出数值的形式
对比项目 | 权重 | Dubbo | Spring Cloud |
---|---|---|---|
迁移成本 | 10 | 8 | 4 |
社区支持 | 9 | 7 | 8 |
服务治理 | 8 | 5 | 7 |
生态建设 | 7 | 7 | 8 |
分布式事务 | 6 | 0 | 0 |
运维成本 | 5 | 4 | 3 |
开发流程 | 4 | 3 | 2 |
集成测试 | 3 | 2 | 2 |
学习成本 | 2 | 2 | 1 |
性能 | 1 | 1 | 0 |
总计 | 37 | 33 |
结论:
Dubbo优势在于从迁移成本低,能在尽可能不改动现有代码的基础上完成服务化的迁移,而且我们团队成员使用Dubbo的经验比使用Spring Cloud的经验丰富;Spring Cloud的优势在于生态比较完善,社区支持良好;最终根据我们项目当前实际情况,我们认为Dubbo是最好的选择,可以在业务开发的同时平滑地完成服务化;