Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。而 Spring Cloud 诞生于微服务架构时代,考虑的是微服务治理的方方面面,另外由于依托了 Spirng、Spirng Boot 的优势之上,两个框架在开始目标就不一致, Dubbo 定位服务治理、 Spirng Cloud 是一个生态。

微服务主要的优势如下:

1、降低复杂度

将原来偶合在⼀起的复杂业务拆分为单个服务,规避了原本复杂度⽆⽌境的积累。每⼀个微服务专注于单⼀功能,并通过定义良好的接⼝清晰表述服务边界。每个服务开发者只专注服务本身,通过使⽤缓存、DAL等各种技术⼿段来提升系统的性能,⽽对于消费⽅来说完全透明。

2、可独⽴部署

由于微服务具备独⽴的运⾏进程,所以每个微服务可以独⽴部署。当业务迭代时只需要发布相关服务的迭代即可,降低了测试的⼯作量同时也降低了服务发布的⻛险。

3、容错

在微服务架构下,当某⼀组件发⽣故障时,故障会被隔离在单个服务中。 通过限流、熔断等⽅式降低错误导致的危害,保障核⼼业务正常运⾏。

4、扩展

单块架构应⽤也可以实现横向扩展,就是将整个应⽤完整的复制到不同的节点。当应⽤的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独⽴进⾏扩展。
本⽂主要围绕微服务的技术选型、通讯协议、服务依赖模式、开始模式、运⾏模式等⼏⽅⾯来综合⽐较Dubbo和Spring Cloud 这2种开发框架。架构师可以根据公司的技术实⼒并结合项⽬的特点来选择某个合适的微服务架构平台,以此稳妥地实施项⽬的微服务化改造或开发进程。

微服务架构核⼼要素

Dubbo只是实现了服务治理,⽽Spring Cloud⼦项⽬分别覆盖了微服务架构下的众多部件,⽽服务治理
只是其中的⼀个⽅⾯。Dubbo提供了各种Filter,对于上述中“⽆”的要素,可以通过扩展Filter来完善。
例如
1.分布式配置:可以使⽤淘宝的diamond、百度的disconf来实现分布式配置管理
2.服务跟踪:可以使⽤京东开源的Hydra,或者扩展Filter⽤Zippin来做服务跟踪
3.批量任务:可以使⽤当当开源的Elastic-Job、tbschedule
点评:从核⼼要素来看,Spring Cloud 更胜⼀筹,在开发过程中只要整合Spring Cloud的⼦项⽬就可以顺利的完成各种组件的融合,⽽Dubbo缺需要通过实现各种Filter来做定制,开发成本以及技术难度略⾼。

通讯协议

⽀持协议

1、Dubbo:dubbo使⽤RPC通讯协议,提供序列化⽅式如下:
dubbo:Dubbo缺省协议采⽤单⼀⻓连接和NIO异步通讯,适合于⼩数据量⼤并发的服务调⽤,以及服
务消费者机器数远⼤于服务提供者机器数的情况
rmi:RMI协议采⽤JDK标准的java.rmi.*实现,采⽤阻塞式短连接和JDK标准序列化⽅式
Hessian:Hessian协议⽤于集成Hessian的服务,Hessian底层采⽤Http通讯,采⽤Servlet暴露服务,
Dubbo缺省内嵌Jetty作为服务器实现
http:采⽤Spring的HttpInvoker实现
Webservice:基于CXF的frontend-simple和transports-http实现
2、Spring Cloud:Spring Cloud 使⽤HTTP协议的REST API

性能⽐较

使⽤⼀个Pojo对象包含10个属性,请求10万次,Dubbo和Spring Cloud在不同的线程数量下,每次请求
耗时(ms)如下:
image.png

说明:客户端和服务端配置均采⽤阿⾥云的ECS服务器,4核8G配置,dubbo采⽤默认的dubbo协议
点评:dubbo⽀持各种通信协议,⽽且消费⽅和服务⽅使⽤⻓链接⽅式交互,通信速度上略胜SpringCloud,如果对于系统的响应时间有严格要求,⻓链接更合适。

服务依赖⽅式

Dubbo:服务提供⽅与消费⽅通过接⼝的⽅式依赖,服务调⽤设计如下:

  • interface层:服务接⼝层,定义了服务对外提供的所有接⼝
  • Molel层:服务的DTO对象层,
  • business层:业务实现层,实现interface接⼝并且和DB交互

因此需要为每个微服务定义了各⾃的interface接⼝,并通过持续集成发布到私有仓库中,调⽤⽅应⽤对
微服务提供的抽象接⼝存在强依赖关系,开发、测试、集成环境都需要严格的管理版本依赖。

通过maven的install & deploy命令把interface和Model层发布到仓库中,服务调⽤⽅只需要依赖
interface和model层即可。在开发调试阶段只发布Snapshot版本。等到服务调试完成再发布Release版
本,通过版本号来区分每次迭代的版本。通过xml配置⽅式即可⽅⾯接⼊dubbo,对程序⽆⼊侵。

Dubbo接⼝依赖⽅式
image.png

Spring Cloud:服务提供⽅和服务消费⽅通过json⽅式交互,因此只需要定义好相关json字段即可,消
费⽅和提供⽅⽆接⼝依赖。通过注解⽅式来实现服务配置,对于程序有⼀定⼊侵。
image.png

点评:Dubbo服务依赖略重,需要有完善的版本管理机制,但是程序⼊侵少。⽽Spring Cloud通过Json
交互,省略了版本管理的问题,但是具体字段含义需要统⼀管理,⾃身Rest API⽅式交互,为跨平台调
⽤奠定了基础。