Spring Cloud 和Kubernetes都自称自己是部署和运行微服务的最好环境,但是它们在本质上和解决不同问题上是有很大差异的。在本文中,我们将看到每个平台如何帮助交付基于微服务的架构(MSA),它们擅长哪个领域,并且如何两全其美的使用从而在微服务之旅上获得成功。
最近我读了 A. Lukyanchikov的一篇非常棒的文章(https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do),关于使用Spring Cloud和Docker来构建微服务架构。如果你还没看过,建议你看一下,它给出了一个综合的概述:如何使用Spring Cloud来创建一个简单的基于微服务的系统。为了创建一个可增长到数十或上百个服务的可扩展、弹性的微服务系统,必须在一个拥有广泛构建时和运行能力工具集的帮助下集中管理和治理。通过Spring Cloud,涉及到实现功能性服务(例如统计服务、账户服务和通知服务)并且支持基础服务(例如日志分析、配置服务器、服务发现、服务授权)。一个使用Spring Cloud的MSA描述图表如下:
这张图涵盖了系统的运行方面,但是不涉及打包、持续集成、缩放、高可用和自我修复,这些在MSA中同样非常重要。我们假设大部分JAVA开发人员熟悉Spring Cloud,在本文中,我们将做个类比并且看看Kubernetes如何联系Spring Cloud来处理这些额外的障碍。
通过特征对比而不是做一个比较,我们来看一下广阔的微服务障碍和Spring Cloud与Kubernetes如何处理这些障碍。如今MSA的优点就是它是一种得益于易理解和权衡下的架构风格。微服务通过独立部署和多样化技术使得模块边界强化。但是它们以开发分布式系统成本和巨大的运营开销为代价。一个关键的成功要素就是集中在周围的工具上,将会帮你处理尽可能多的MSA问题。启动过程快而简单是很重要的,但是产品过程是很长的,你需要变得更厉害才能成功。
在上面的图中,我们可以看到一个最常见的技术障碍列表(不涵盖非技术性的障碍,例如组织结构、文化等等)需要在MSA中处理。
两个平台Spring Cloud和Kubernetes非常不同并且它们之间没有直接的相同特征。如果在两个平台上每个MSA障碍映射到技术/项目以前常用来处理它,会提出如下图表。
上面的图表主要的结论就是:
为了演示每个项目的范围,这里有个(几乎)端到端的MSA需求表格,在底部从硬件开始,上到顶部DevOps和自服务经验,以及它如何将Spring Cloud和Kubernetes平台联系到一起。
在某些情况下,两个项目用不同的方法满足同样的需求,在一些方面,一个项目可以比另一个项目更强。但也有个sweet的地方,就是两个平台可以互补并组合成一个更出众的微服务体验。例如,Spring Cloud提供Maven插件来创建单独JAR应用程序包。结合Docker、Kubernetes的声明式部署和调度能力,轻松运行微服务。同样,Sring Cloud有应用程序内类库来创建弹性、容错微服务,使用Hystrix(bulkhead和断路器模式)与Ribbon(负载均衡)。但这是不够的,当组合Kubernetes健康检查、过程重启和自动伸缩能力,微服务变成一个真正的抗脆弱系统。
因为两个平台没有直接可比的功能特征,不是挖掘每个条目,以下是每个平台的优缺点总结。
Spring Cloud为开发人员提供工具,在分布式系统中来快速构建一些常用模块,例如配置管理、服务发现、断路机制、路由等等。在Netflix OSS库顶层构建,用java编写,面向Java开发人员。
Kubernetes是一个开源系统,用来自动部署、缩放和管理容器应用。它可以使用多语言并且提供原语服务开通、运行、缩放和分布式系统管理。
如你所见,两个平台在核心领域都很强,并且在其他领域改进。Spring Cloud可以快速使用、对开发者友好的平台,然而Kubernetes对DevOps友好,艰难的学习曲线,但是覆盖更广泛的微服务障碍。以下是这些点的总结。
两种架构处理了不同范围的MSA障碍,并且它们从根本上用了不同的方法。Spring Cloud方法是试图解决在JVM中每个MSA挑战,然而Kubernetes方法是试图让问题消失,为开发者在平台层解决。Spring Cloud在JVM中非常强大,Kubernetes管理那些JVM很强大。同样的,它就像一个自然发展,结合两种工具并且从两个项目中最好的部分受益。
通过这样一种结合,Spring提供应用程序打包,Docker和Kubernetes提供部署和调度。Spring通过Hystrix线程池提供应用程序内隔板,Kubernetes通过资源、进程和命名空间隔离提供隔板。Spring为每个微服务提供健康终端,Kubernetes执行健康检查并且为健康服务通信路由。Spring外部化且升级配置,Kubernetes给每个微服务分配配置。这样的还有很多。
我最喜欢哪个微服务平台?两个都喜欢。我喜欢Spring框架带来的开发者体验。全部都是注解驱动的,类库覆盖所有种类的功能需求。我也喜欢Apache Camel(宁愿Spring Spring Integration)为集成、连接器、消息、路由、弹性和在应用层的容错所做的。然后与集群和多种应用程序实例管理,我更喜欢Kubernetes神奇的力量。每当有一个功能重叠,例如服务发现、负载均衡、配置管理,我试着使用Kubernetes提供的多语言原语。
来源:Kubernetes和Spring Cloud哪个部署微服务更好?