如果你是在一个中小型项目中应用Spring Cloud,那么你不需要太多的改造和适配,就可以实现微服务的基本功能。但是如果是在大型项目中实践微服务,可能会发现需要处理的问题还是比较多,尤其是项目中老代码比较多,没办法全部直接升级到Spring Boot框架下开发的话,你会非常希望能有一个侵入性更低的方案来实施微服务架构。在这种场景下,Service Mesh将会成为你的最佳选择,经过一段时间的发展,目前Service Mesh这个概念已经开始逐步被大家了解和认知。同时,一些Service Mesh的实现方案也逐步成熟和落地,例如Istio、Linkerd、Envoy等。在本系列文章的下一篇中,将为大家对Service Mesh概念做一个系统的介绍。但是在了解Service Mesh概念之前,还是建议大家先对微服务和Spring Cloud这些概念和框架有一个深入的了解,这样才能体会到应用Service Mesh的价值和意义。
Spring Cloud与Dubbo
网上关于Spring Cloud和Dubbo对比的文章很多,大多数对比结果都是Spring Cloud压倒性优势战胜Dubbo,下表是对Dubbo和Spring Cloud做的一个基础功能的对比:
实际上,Dubbo的关注点在于服务治理,并不能算是一个真正的微服务框架。包括目前在开发中的Dubbo 3.0,也不能完整覆盖微服务的各项功能需求。而Spring Cloud一方面是针对微服务而设计,另外一方面Spring Cloud是通过集成各种组件的方式来实现微服务,因此理论上可以集成目前业内的绝大多数的微服务相关组件,从而实现微服务的全部功能。
而对Dubbo而言,如果一定要应用到微服务的使用场景中的话,上表中欠缺的大多数功能都可以通过集成第三方应用和组件的方式来实现,跟Spring Cloud相比主要的缺陷在于集成过程中的便利性和兼容性等问题。
Spring Cloud与Docker
虽然网上也有很多文章写到如何使用Docker来实现微服务,但是事实上单独使用Docker是没办法完整的实现微服务的所有功能的。在实际上微服务架构中,Spring Cloud和Docker更多的是一种协作的关系,而不是一种竞争的关系。通过Docker容器化技术,可以更好的解决引入Spring Cloud微服务后带来的部署和运维的复杂性。
Spring Cloud生态圈中的Pivotal Cloud Foundry(PCF)作为PaaS实现,也提供一些类似于Docker的功能支持,但是无论上功能上还是易用性上和Docker还是存在比较大的差异。Pivotal Cloud Foundry和Docker之间的关系更多的是一种兼容关系,而不是竞争关系,Pivotal Cloud Foundry的主要竞争对手是Red Hat的OpenShift。目前,Pivotal Cloud Foundry支持的IaaS包括:AWS、AZURE、GCP、vSphere、OpenStack等。
Spring Cloud与Kubernetes
网上也有一些“Spring Cloud与Kubernetes哪个更好”,“当已经有了Kubernetes之后,还需要使用Spring Cloud么”之类的文章。首先说笔者并不认为Spring Cloud与Kubernetes是竞争关系,但是也不否认二者确实在诸多功能上存在一些重合。下图是对Spring Cloud与Kubernetes在微服务架构中的一些基础功能上的对比:
通过对比可以看出,Spring Cloud和Kubernetes确实存在一些功能上的重合,但是二者的定位其实差别很大。Spring Cloud是一个基于Java语言的微服务开发框架,而Kubernetes是一个针对容器应用的自动化部署、伸缩和管理的开源系统,它兼容多种语言且提供了创建、运行、伸缩以及管理分布式系统的原语。Spring Cloud更多的是面向有Spring开发经验的Java语言开发者,而Kubernetes不是一个针对开发者的平台,它的目的是供有DevOps思想的IT人员使用。
为了区分Spring Cloud和Kubernetes两个项目的范围,下面这张图列出了几乎是端到端的微服务架构需求,从最底层的硬件,到最上层的DevOps和自服务经验,并且列出了如何关联到Spring Cloud和Kubernetes平台。
总结
通过Spring Cloud、Docker和Kubernetes的组合,可以构建更加完整和强大的微服务架构程序。通过三者的整合,使用Spring Boot提供应用的打包,Docker和Kubernetes提供应用的部署和调度。Spring Cloud通过Hystrix线程池提供应用内的隔离,而Kubernetes通过资源、进程和命名空间来提供隔离。Spring Cloud为每个微服务提供健康终端,而Kubernetes执行健康检查,且把流量导到健康服务。Spring Cloud外部化配置并更新它们,而Kubernetes分发配置到每个微服务。
对于一名开发人员或者架构师来说,想要精通微服务设计与开发,能够在大中型项目中应用微服务架构,单纯掌握Spring Cloud是远远不够的,Docker和Kubernetes等都是需要学习和掌握的内容。同时,由于采用微服务架构后带来了分布式的相关问题,对于分布式系统理论也必须有一定的了解。当然,最重要的还是对系统业务的深入理解,对整体业务进行合理的规划和拆分,才能真正行之有效的应用微服务架构,构建高效、健壮、灵活、可扩展的微服务应用。