Spring Cloud 和 Kubernetes 都声称自己是开发和运行微服务的最佳环境,但它们在本质上有很大的不同,解决的问题也不同。在本文中,我们将看看每个平台是如何交付基于微服务架构(MSA)的?它们擅长哪些领域?以及如何充分利用这两个领域在微服务的旅程中取得成功。
最近我读了很多关于用 Spring Cloud 结合容器化构建微服务架构的文章。如果您还没有阅读它,那么您应该多看看,因为它全面概述了如何使用 Spring Cloud 创建一个简单的基于微服务的系统。为了构建一个可扩展且具有弹性的微服务系统,甚至可以扩展到数十个或数百个服务,必须在具有广泛构建时和运行时功能的工具集的帮助下对其进行集中管理和治理。使用 Spring Cloud 过程涉及到实现功能性服务(如统计服务、帐户服务和通知服务)和支持基础设施服务(如日志分析、配置服务器、服务发现、认证服务)。下面是描述这种使用 Spring Cloud 的 MSA 的图表:

来自Spring Cloud
这张图涵盖了系统的运行时方面,但没有涉及打包、持续集成、扩展、高可用性和自修复方面,这些方面在 MSA 世界中也非常重要。假设大多数 Java 开发人员都熟悉 Spring Cloud,在本文中,我们将进行比较,通过解决这些额外的问题来了解 Kubernetes 与 Spring Cloud 之间的关系。
我们不需要逐个特性进行比较,而是来看看更广泛的微服务关注点,看看 Spring Cloud 和 Kubernetes 是如何解决这些问题的。当今 MSA 的一个优点是,它是一种架构风格,其优点和利弊都得到了很好的平衡。微服务支持强大的模块边界、独立部署和技术多样性,但它们的代价是开发分布式系统和显著的运营、成本开销。因此,这是一个关键的成功因素,关注周围的工具,将帮助您解决尽可能多的 MSA 关注。快速且轻松的开始很重要,但学习研究过程是漫长的,所以你需要足够耐心才能到达。

微服务框架解决问题
在上面的图表中,我们可以看到一个包含最常见的技术关注点的列表(我们不包括非技术关注点,例如组织结构、文化等等),这些都必须在 MSA 中解决。这是我个人的观点,不同的组织会有不同的看法,但在大多数情况下,它应该适用于每个人。
这两个平台非常不同,它们之间不存在直接的功能对等。如果我们将每个 MSA 关注点映射到用于在两种平台上解决它的技术/项目上,我们会得到下表。

Kubernetes和Spring Cloud对比图
从上表可以得出的主要结论是:
为了说明每个项目的范围,这里有一个(几乎)端到端的 MSA 需求表,从底部硬件开始,到顶部的 DevOps 和自助化部署服务,以及它与 Spring Cloud 和 Kubernetes 平台的关系。

在某些情况下,两个项目使用不同的方法来处理相同的需求,在某些领域,这一个可能比另一个更强。但这两个平台也有一个互补点,可以结合在一起提供更优质的微服务体验。例如,Spring Boot 为构建单个 jar 应用程序包提供了 Maven 插件。Docker 和 Kubernetes 的声明式部署和调度功能使运行微服务变得非常容易。类似地,Spring Cloud 内有丰富的应用程序类库,用于创建弹性、容错等功能,使用 Hystrix(带有熔断、限流和断路器模式)和 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,因为它在应用程序级别上集成连接器、消息传递、路由、弹性和容错等功能。然后可以解决对于集群管理多个应用程序实例有关的任何事情,我更喜欢神奇的 Kubernetes 能力。每当有功能重叠时,比如服务发现、负载均衡、配置管理,我当然会尝试使用 Kubernetes 提供的能力。