【编者的话】本文比较了当下最火热的两大微服务开发平台:Spring Cloud 和 Kubernetes 的优缺点,并指出结合二者的优点来组合使用,将在微服务旅程上获得更大成功。
当我们需要部署微服务的时候,哪个更好?Spring Cloud 还是 Kubernetes?答案是都可以,只是各自有其优势。
Spring Cloud 和 Kubernetes 都宣称自己是开发和运行微服务的最佳环境,但是它们的本质非常不一样,所追求的目标也不同。本文我们分析一下两个平台是如何在其擅长的、实现基于微服务的架构(MSA)上起到作用的,并判断如何利用两者的强项,来帮助我们在微服务旅程上获得成功。
最近我读了 A. Lukyanchikov 写的一篇非常精彩的 文章 ,讲的是用 Spring Cloud 和 Docker 来构建微服务架构。如果你还没读过,你应该读一下,因为它给出了一个关于如何利用Spring Cloud来创建一个简单的基于微服务的系统的综合视角。为了构建一个能扩展到数千个服务的可扩展且有弹性的微服务系统,它就必须有一套拥有广泛的构建时和运行时能力的工具集来帮助管理和控制。使用Spring Cloud,既能实现功能型服务(比如统计服务,账号服务以及通知服务),又能实现基础架构服务(比如日志分析,配置服务器,服务发现,认证服务等)。描述这样一个使用Spring Cloud构造的微服务架构(MSA)图如下所示:
MSA with Spring Cloud (by A. Lukyanchikov)
该图包含了运行时视角,但是它不包含打包,持续集成,扩展性,高可用,自愈等在MSA世界中同样重要的功能。本文假设大部分Java 开发者都熟悉Spring Cloud,我们来做个对比,看看Kubernetes是如何提出这些额外的概念,以关联到Spring Cloud 的。
我们不会针对两者一个一个概念的比对,而是根据更广阔的微服务概念,来看看Spring Cloud 和 Kubernetes 分别是如何实现他们的。今天有关MSA的一个好事是,它是一个有着易于理解的 优缺点评估的架构风格 。微服务能加强模块边界,各模块可以有独立的部署和技术差异。但是同时也 带来了代价 ,需要开发分布式系统以及 明显增加操作成本 。一个关键的成功因素是聚焦于使用一套能帮助你实现尽可能多的MSA概念的工具。能使得启动过程迅速且容易是很重要的,但是通向产品化的旅程是很漫长的,你需要达到 这样的高度 才能到达那里。
Microservices concerns
如上图所示,我们可以看到MSA中必须实现的那些最普遍的技术概念(我们将不会关注非技术概念,比如组织结构,文化等)。
SpingCloud 和 Kubernetes 这两个平台非常不一样,并且它们之间也没有直接的等价特性。如果我们将每个MSA概念匹配到这两个平台使用的实现这些概念的技术/项目,我们能得出下表。
Spring Cloud and Kubernetes technologies
从上表中能快速得出的结论是:
为了画出每个项目的范围,这里有张表列出了几乎是端到端的MSA需求,从最底层的硬件,到最上层的DevOps和自服务经验,并且列出了如何关联到Spring Cloud 和 Kubernetes 平台。
Microservices requirements
在某些场景下,两个项目使用不同的方法达成了相同的需求,在某些领域,一个项目可能会强于另一个。但是在某些情况下,两个项目是互补的,可以组合起来达成高级的微服务经验。例如,Spring Boot提供了Maven插件来构建单个JAR应用包。这样就可以结合Docker和Kubernetes的声明式部署和调度能力,使得运行微服务变得轻而易举。同样的,Spring Cloud有个内嵌的应用库,可以利用Hystric(自带隔离和熔断模式)和Ribbon(用来负载均衡)来创建有弹性的,容错的微服务。但是光靠这个还不够,当这个能力和Kubernetes的健康检查,进程重启,以及自动伸缩能力结合在一起时,微服务才能成为一个反脆弱系统。
因为两个平台不能直接用每个特性来比较,我们也不打算针对每个平台都深入每个特性,因此这里就以总结性方式来说明一下两个平台的优缺点。
Spring Cloud给开发者提供了一个工具,能在分布式系统中快速构建例如配置管理,服务发现,熔断,路由等通用模式。这是基于Netflix 的 OSS 库,它们是用Java写的,面向Java开发者。
Kubernetes 是一个针对容器应用的自动化部署,伸缩和管理的开源系统。它兼容多种语言且提供了创建,运行,伸缩以及管理分布式系统的原语。
正如你所看到的,两个平台都有各自的强项,也有需要提高的地方。Spring Cloud 是一个容易上手的,开发者友好的平台。而Kubernetes是DevOps友好的,有着陡峭的学习曲线,但是包含了更广泛的微服务概念。这里是针对这几点的总结。
Strengths and weaknesses
两个框架实现了不同范围的MSA概念,使用的是从根源上就有区别的方式。Spring Cloud方式是尽力在JVM范畴内来解决每个MSA的挑战,而Kubernetes的方式是尽力为开发者在平台层面消除这些问题。Spring Cloud在JVM内非常强大,Kubernetes 在管理这些JVM上非常强大。因此,整合这两者取它们的最佳部分,是一个很自然的进步过程。
Spring Cloud backed by Kubernetes
有了这样一个整合,Spring 提供应用的打包,Docker 和 Kubernetes提供部署和调度。Spring 通过Hystrix线程池提供应用内的隔离,而Kubernetes通过资源,进程和命名空间来提供隔离。Spring 为每个微服务提供健康终端,而Kubernetes执行健康检查,且把流量导到健康服务。Spring 外部化配置并更新它们,而Kubernetes分发配置到每个微服务。这个列表将一直持续。
My favorite microservices stack
我最喜欢的微服务平台是哪个?我 两个都喜欢 。我喜欢Spring 框架提供的开发者经验。它是标签驱动的,并且拥有包含了各种功能需求的库。跟任何整合相关的,我喜欢Apache Camel(而不是Spring Integration),它能提供应用级别的连接器,消息,路由,可靠性和容错功能。而对跟集群和管理多应用实例相关的,我更喜欢魔法般的Kubernetes能力。不论何时,有重复功能,比如服务发现,负载均衡,配置管理,我尽量使用Kubernetes提供的跟语言无关的原语。
原文链接: Deploying Microservices: Spring Cloud vs. Kubernetes (翻译:池剑锋)