Article / 文章中心

部署微服务:Spring Cloud pk Kubernetes

发布时间:2021-12-14 点击数:114

Spring Cloud和Kubernetes都声称是开发和微服务的最佳运行环境,但它们本质上非常不同。在本文中,我们将了解他们如何帮助交付基于微服务的架构 (MSA),它们擅长哪些领域,以及如何利用自身优势在微服务之旅中取得两全其美的结果

使用 Spring Cloud 创建一个基于微服务的系统需要一些什么?


为了构建一个可扩展且具有弹性的微服务系统,该系统支持增长到数十或数百个服务,必须借助具有广泛构建时间和runtime功能的工具集对其进行集中管理和治理。使用 Spring Cloud,这涉及实现功能服务(例如统计服务、帐户服务和通知服务)和支持基础设施服务(例如日志分析、配置服务器、服务发现、身份验证服务)。使用 Spring Cloud 描述此类 MSA 的图表如下:

MSA 图表


该图涵盖了系统的运行时方面,但没有涉及封装、CICD、扩展、高可用性和自我修复,这些在 MSA 中也非常重要。假设大多数 Java 开发人员都熟悉 Spring Cloud,在本文中,我们将通过解决这些问题来绘制一个平衡点,看看 Kubernetes 与 Spring Cloud 之间的关系


微服务问题

与其逐个进行功能比较,不如让我们来看看更广泛的微服务关注点,看看 Spring Cloud 和 Kubernetes 如何处理这些问题。


关于 MSA 的好处在于,它是一种具有易于理解和权衡的架构风格 。微服务支持强大的模块边界,具有独立部署和技术多样性。它们是以开发分布式系统和大量运营开销为代价的。一个关键的成功

因素是专注于能够帮助您尽可能多的解决 MSA 问题。使启动过程快速而简单很    重要。


MSA列表

在上图中,我们可以看到一个列表,其中包含必须在 MSA 中解决的最常见的技术问题。


  • 技术映射

Spring Cloud 和 Kubernetes 这两个平台非常不同,它们之间没有直接的功能对等。如果我们将每个 MSA 关注点映射到用于在两个平台中解决它的技术,我们会得出下表。

Spring Cloud和Kubernetes的对比



上表的主要结论是:

  • Spring Cloud 拥有一组丰富的、集成良好的 Java 库,可以将所有runtime问题作为应用程序堆栈的一部分来解决。因此,微服务本身有库和runtime代理来进行客户端服务发现、负载平衡、配置更新、指标跟踪等。单例集群服务和批处理作业等模式也在 JVM 中进行管理。

  • Kubernetes 是多语言的,不仅针对 Java 平台,而且以通用方式解决所有语言的分布式计算挑战。它为平台级别和应用程序堆栈之外的配置管理、服务发现、负载平衡、跟踪、度量、单例、计划作业提供服务。该应用程序不需要任何用于客户端逻辑的库或代理,并且可以用任何语言编写。

  • 在某些领域,两个平台都依赖类似的第三方工具。例如,ELK 和 EFK 堆栈、跟踪库等。例如 Hystrix 和 Spring Boot,在这两种环境中同样有用。在某些领域,两个平台是互补的,可以组合在一起,以创建更强大的解决方案( KubeFlix和 Spring Cloud Kubernetes就是这样的例子)。


  • 微服务要求

为了展示每个项目的范围,这里有一张表格,其中包含端到端的 MSA 要求,从底部的硬件到顶部的 DevOps 和自助服务体验,以及它们之间的关系到 Spring Cloud 和 Kubernetes 平台。


在某些情况下,两个项目使用不同的方法满足相同的要求,并且在某些领域,一个项目可能比另一个项目更强大。但也有一个好处,两个平台相互补充,可以结合互补,以获得卓越的微服务体验。


例如,Spring Boot 提供了用于构建单个jar应用程序包的Maven插件。结合 Docker 和 Kubernetes 的声明式部署和调度功能,运行微服务变得轻而易举。


同样,Spring Cloud 具有应用程序内库,用于使用 Hystrix和Ribbon创建弹性、容错的微服务。但这还不够,当它与Kubernetes 的健康检查结合时,进程会重新启动,

 Hystrix和Ribbon

  • 对比

Spring Cloud

Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如配置管理、服务发现、路由等。它构建在 Netflix OSS库之上,用Java编写,供Java开发人员使用

优点
  • Spring Platform自身提供的统一编程模型和Spring Boot的快速应用创建能力,为开发者提供了极佳的微服务开发体验。例如,使用很少的注释,您可以创建一个配置服务器。

  • 有丰富的库选择,涵盖了大多数runtime问题。由于所有库都是用 Java 编写的,因此它提供了多种功能、更好的控制和微调选项。

  • 不同的 Spring Cloud库彼此很好地集成在一起。例如,一个Feign客户端也将使用Hystrix进行断路,使用Ribbon进行负载均衡请求。一切都是注解驱动的,使 Java 开发人员可以轻松开发。


缺点
  • Spring Cloud 的主要优点之一也是它的缺点——它仅限于 Java。MSA的一个强大动机是能够在需要时交换技术堆栈、库甚至语言。这在 Spring Cloud中是不可能的。如果你想使用SpringCloud/Netflix OSS基础服务,比如配置管理、服务发现或者负载均衡,解决方案并不优雅。

  • Java 开发人员需要关心和处理 Java 应用程序的问题太多。每个微服务都需要运行各种客户端来进行配置检索、服务发现和负载均衡。设置它们很容易,但这并不会隐藏构建时和runtime对环境的依赖。例如,开发人员可以使用EnableConfigServer创建一个 Config Server,但这只是一种方式。每次开发人员想要运行单个微服务时,他们都需要启动并运行配置服务器。对于受控环境,开发人员必须考虑使Config Server高可用,并且它支持Gi或Svn,因此他们需要一个共享文件系统。同样,对于服务发现,开发者需要先启动一个 Eureka服务器。

  • Spring Cloud 本身在微服务旅程中的范围较短,开发人员还需要考虑自动化部署、调度、资源管理、进程隔离、自愈、构建管道等,以获得完整的微服务体验。在这一点上,我认为将Spring Cloud单独与Kubernetes进行比较是不公平的,而在 Spring Cloud + Cloud Foundry(或 Docker Swarm)和 Kubernetes之间进行比较更公平 。但这也意味着,要获得完整的端到端微服务体验,Spring Cloud必须辅以Kubernetes本身这样的应用平台。


Kubernetes
Kubernetes 是一个开源系统,用于自动化部署、扩展和管理容器化应用程序。它是多语言的,并提供用于配置、运行、扩展和管理分布式系统。
优点
  • Kubernetes 是一个多语言和语言不可知的容器管理平台,能够运行云原生和传统容器化应用程序。它提供的服务,例如配置管理、服务发现、负载均衡、指标收集和日志聚合,可以被多种语言使用。这允许在组织中拥有一个平台,可供多个团队(包括使用Spring的Java开发人员)使用并服务于多种用途:应用程序开发、测试环境、构建环境(运行源控制系统、构建服务器、工件存储库)等。
  • 与 Spring Cloud 相比,Kubernetes 解决了更广泛的 MSA 问题。除了提供runtime服务,Kubernetes 还允许您配置环境、设置资源约束、RBAC、管理应用程序生命周期、启用自动扩展和自我修复。
  • Kubernetes 技术基于谷歌 15 年的研发和管理容器的经验。是Github上最活跃的开源社区之一。

缺点:
  • Kubernetes 是多语言的,因此,它的服务和原语是通用的,没有针对不同的平台(如 Spring Cloud for JVM)进行优化。例如,配置作为环境变量或挂载的文件系统传递给应用程序。它没有Spring Cloud Config 提供的花哨的配置更新功能。
  • Kubernetes 不是面相开放人员的平台。它旨在供具有DevOps意识的IT人员使用。因此,Java 开发人员需要学习一些新概念并学习解决问题的新方法。尽管使用MiniKube启动 Kubernetes 实例非常容易,但手动安装高可用的 Kubernetes 集群会产生大量的操作开销。
  • Kubernetes 仍然是一个相对较新的平台,并且仍在积极开发和成长中。因此,每个版本都添加了许多新功能,而且 API 是可扩展和向后兼容的。

两全其美
这两个框架都解决了不同范围的 MSA 问题,而且它们以根本不同的方式来解决。
  • Spring Cloud试图解决 JVM 内部的MSA挑战,而 Kubernetes试图通过在平台级别解决问题来让开发人员解决问题。
  • Spring Cloud在JVM内部非常强大,而Kubernetes在管理这些 JVM 方面非常强大。因此,将它们结合起来并取其精华去其糟粕。

Kubernetes


通过这样的组合,Spring 提供应用程序打包,Docker 和 Kubernetes 提供部署和调度。Spring 通过 Hystrix 线程池提供应用内隔离,Kubernetes 通过资源、进程和命名空间隔离提供逻辑隔离。Spring 为每个微服务提供健康端点,Kubernetes 执行健康检查和流量路由到健康服务。Spring 外部化和更新配置,Kubernetes 将配置分发到每个微服务。配合默契,简直完美。

一张图足以涵盖,请看图:

Spring