微服务架构的基础框架选择
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微服务架构的基础框架选择:Spring Cloud还是Dubbo
最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构。第一次实施微服务架构时,我们应该选择哪个基础框架更好呢?
Round 1:背景
Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点。阿里巴巴近几年对开源社区的贡献不论在国内还是国外都是引人注目的,比如:JStorm 捐赠给Apache 并加入Apache 基金会等,为中国互联网人争足了面子,使得阿里巴巴在国人眼里已经从电商升级为一家科技公司了。
Spring Cloud,从命名我们就可以知道,它是Spring Source 的产物,Spring 社区的强大背书可以说是Java 企业界最有影响力的组织了,除了Spring Source 之外,还有Pivotal 和Netfix 是其强大的后盾与技术输出。其中Netflix 开源的整套微服务架构套件是Spring Cloud 的核心。
小结:如果拿Dubbo 与Netflix 套件做对比,前者在国内影响力较大,后者在国外影响力较大,我认为在背景上可以打个平手;但是若要与Spring Cloud 做对比,由于Spring Source 的加入,在背书上,Spring Cloud 略胜一筹。不过,英雄不问出处,在背景这一点上,不能作为选择框架的主要因素,当您一筹莫展的时候,可以作为参考依据。
Round 2:社区活跃度
我们选择一个开源框架,社区的活跃度是我们极为关注的一个要点。社区越活跃,解决问题的速度越快,框架也会越来越完善,不然当我们碰到问题,就不得不自己解决。而对于团队来说,也就意味着我们不得不自己去维护框架的源码,这对于团队来说也将会是一个很大的负担。
下面看看这两个项目在github 上的更新时间,
Dubbo :https:///dubbo
最后更新时间为:2016年5月6日
Spring Cloud :https:///spring-cloud
最后更新时间为:12分钟前
可以看到Dubbo 的更新已经是几个月前,并且更新频率很低。而Spring Cloud 的更新是12分钟前,仍处于高速迭代的阶段。
小结:在社区活跃度上,Spring Cloud 毋庸置疑的优于Dubbo,这对于没有大量精力与财力维护这部分开源内容的团队来说,Spring Cloud 会是更优的选择。
Round 3:架构完整度
或许很多人会说Spring Cloud 和Dubbo 的对比有点不公平,Dubbo 只是实现了服务治理,而Spring Cloud 下面有17 个子项目(可能还会新增)分别覆盖了微服务架构下的方方面面,服务治理只是其中的一个方面,一定程度来说,Dubbo 只是Spring Cloud Netflix 中的一个子集。但是在选择框架上,方案完整度恰恰是一个需要重点关注的内容。
根据Martin Fowler 对微服务架构的描述中,虽然该架构相较于单体架构有模块化解耦、可独立部署、技术多样性等诸多优点,但是由于分布式环境下解耦,也带出了不少测试与运维复杂度。
根据微服务架构在各方面的要素,看看Spring Cloud 和Dubbo 都提供了哪些支持。
以上列举了一些核心部件,大致可以理解为什么之前说Dubbo 只是类似Netflix 的一个子集了吧。当然这里需要申明一点,Dubbo 对于上表中总结为“无”的组件不代表不能实现,而只是Dubbo 框架自身不提供,需要另外整合以实现对应的功能,比如:
•分布式配置:可以使用淘宝的diamond、百度的disconf 来实现分布式配置管理。但是Spring Cloud 中的Config 组件除了提供配置管理之外,由于其存储可以使用git,因此它天然的实现了配置内容的版本管理,可以完美的与应用版本管理整合起来。
•服务跟踪:可以使用京东开源的Hydra
•批量任务:可以使用当当开源的Elastic-Job
•……
虽然,Dubbo 自身只是实现了服务治理的基础,其他为保证集群安全、可维护、可测试等特性方面都没有很好的实现,但是几乎大部分关键组件都能找到第三方开源来实现,这些组件主要来自于国内各家大型互联网企业的开源产品。
RPC vs REST
另外,由于Dubbo 是基础框架,其实现的内容对于我们实施微服务架构是否合理,也需要我们根据自身需求去考虑是否要修改,比如Dubbo 的服务调用是通过RPC 实现的,但是如果仔细拜读过Martin Fowler 的Microservices 一文,其定义的服务间通信是HTTP协议的REST API。那么这两种有何区别呢?
先来说说,使用Dubbo 的RPC 来实现服务间调用的一些痛点:
•服务提供方与调用方接口依赖方式太强:我们为每个微服务定义了各自的service 抽象接口,并通过持续集成发布到私有仓库中,调用方应用对微服务提供的抽象接口存在强依赖关系,因此不论开发、测试、集成环境都需要严格的管理版本依赖,才不会出现服务方与调用方的不一致导致应用无法编译成功等一系列问题,以及这也会直接影响本地开发的环境要求,往往一个依赖很多服务的上层应用,每天都要更新很多代码并install 之后才能进行后续的开发。若没有严格的版本管理制度或开发一些自动化工具,这样的依赖关系会成为开发团队的一大噩梦。
而REST 接口相比RPC 更为轻量化,服务提供方和调用方的依赖只是依靠一纸契约,不存在代码级别的强依赖,当然REST 接口也有痛点,因为接口定义过轻,很容易导致定义文档与实际实现不一致导致服务集成时的问题,但是该问题很好解决,只需要通过每个服务整合swagger,让每个服务的代码与文档一体化,就能解决。所以在分布式环境下,REST 方式的服务依赖要比RPC 方式的依赖更为灵活。
•服务对平台敏感,难以简单复用:通常我们在提供对外服务时,都会以REST 的方式提供出去,这样可以实现跨平台的特点,任何一个语言的调用方都可以根据接口定义来实现。那么在Dubbo 中我们要提供REST 接口时,不得不实现一层代理,用来将RPC 接口转换成REST 接口进行对外发布。若我们每个服务本身就以REST 接口方式存在,当要对外提供服务时,主要在API 网关中配置映射关系和权限控制就可实现服务的复用了。
相信这些痛点也是为什么当当网在dubbox(基于Dubbo 的开源扩展)中增加了对REST 支持的原因之一。
小结:Dubbo 实现了服务治理的基础,但是要完成一个完备的微服务架构,还需要在各环节去扩展和完善以保证集群的健康,以减轻开发、测试以及运维各个环节上增加出来的压力,这样才能让各环节人员真正的专注于业务逻辑。而Spring Cloud 依然发扬了Spring Source 整合一切的作风,以标准化的姿态将一些微服务架构的成熟产品与框架揉为一体,并继承了Spring Boot 简单配置、快速开发、轻松部署的特点,让原本复杂的架构工作变得相对容易上