在微服务架构中,分布式通信、分布式事务、分布式锁等问题是亟待解决的几个重要问题。

Spring Cloud是一套完整的微服务解决方案,基于 Spring Boot 框架。确切的说,Spring Cloud是一个大容器(而不是一个框架),它可以将通过集成一些好的微服务框架,从而简化开发者的代码量。


Dubbo 是阿里开源的分布式通信框架,专注于通信服务治理,类似于Spring Cloud中 Ribbon、 Hystrix、 Feign等核心组件的功能。

下面,我们着重来聊下这两种处理方式有何不同。

01 协议处理

1)Spring Cloud更加优雅简单

Feign使用Http进行传输。

Feign 集成了Ribbon,并且嵌入了Spring cloud全家桶 ,通过简单配置 ,就能在分布式里面实现服务间的调用,类似于Bean 调用。

2)Dubbo方式更灵活

Dubbo协议可选,大部分情况使用Dubbo传输协议,也可以使用http协议。

从协议层选择看,Dubbo是配置化的,更加灵活。

Dubbo 协议更适合小数据高并发场景。

02 性能方面

1)Spring Cloud性能调优

Feign 在高并发场景下,通常需要进行如下性能优化,有明显瓶颈,需要改造。

· 调整服务容器到 UnderTow ,在负载大的情况下Undertow 的性能有提高;

· 曾有同学表示将HTTPURLConnection 改成 Httpclient /Okhttp,这样可以优化性能,其实单次调用性能Httpclient差很多,HttpClient 因为封装了很多方便开发者处理的方法,性能比HTTPURLConnection差,改进同时Httpclient 需要设置复用连接池,效果可见一般;

· 开启Gzip;

· Feign中HttpMessageConverters 默认使用jackson2方式进行序列化和反序列化,可以将其改造为ProtoBuf,降低Cpu 损耗并且响应时间也降低。

2)Dubbo性能调优

主要是配置而无需改造。

03 负载均衡

1)Ribbon 的负载均衡策略

· 随机;

· 规则轮询;

· 空闲策略;

· 响应时间策略。

Feign默认使用Ribbon作为负载均衡的组件,Ribbon需要进行全局配置,个性化配置比较麻烦。

2)Dubbo 的负载均衡策略

· 随机;

· 权重轮询;

· 最少活跃调用数;

· 一致性Hash策略。

Dubbo 可以使用路由策略,然后再进行负载均衡。

04 容错机制

Spring cloud 的 Hystix 提供了服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。




图片为引用,来源于官方图片


Dubbo 提供了一整套 FailOver、FailFast、Failsafe、FailBack、Aviailable、Broadcast、Forking 策略,以及Mock




图片为引用,来源于官方图片


05 路由、流量调度、ABtest

1)Ribbon需自己实现,应用不灵活

Ribbon主要通过扩展 AbstractLoadBalancerRule负载均衡的方法来实现,在负载均衡的部分还要进行改造升级。

2)Dubbo更加灵活方便

Dubbo通过界面化、校本化配置路由规则,可以实现灰度发布、动态流量调度、容量计算等,方案成熟。

另外,Dubbo 还支持多版本调用。

06 总结

正如Dubbo的介绍(如下图),业务发展影响着架构的选型,当服务数量不是很大时,使用普通的分布式RPC架构即可,当服务数量增长到一定数据,需要进行服务治理时,就需要考虑使用流式计算架构。




图片为引用,来源于官方图片


Dubbo可以方便的做更精细化的流量调度,服务结构治理的方案成熟,适合生产上使用,虽然Dubbo是尘封后重新开启,但这并不影响其技术价值。

Ribbon Hystrix Feign在服务治理中,配合Spring Cloud做微服务,使用上有很多优势,社区也比较活跃,看将来更新发展。


你可能也喜欢:

  1. 微服务系列:服务注册与发现的实现原理、及实现优劣势比较
  2. Spring Cloud的核心成员、以及架构实现详细介绍
  3. 阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较
  4. 阿里P8架构师谈:Spring Cloud与Dubbo的详细比较
  5. 阿里P8架构师谈:Restful、SOAP、RPC、SOA、微服务之间的区别