部署微服务:Spring Cloud pk Kubernetes
作者 | 徐磊 翻译
来源 | 新钛云服(ID:newtyun)
转载请联系授权(微信ID:zlm935177782)
Spring Cloud和Kubernetes都声称是开发和微服务的最佳运行环境,但它们本质上非常不同。在本文中,我们将了解他们如何帮助交付基于微服务的架构 (MSA),它们擅长哪些领域,以及如何利用自身优势在微服务之旅中取得两全其美的结果。
使用 Spring Cloud 创建一个基于微服务的系统需要一些什么?
为了构建一个可扩展且具有弹性的微服务系统,该系统支持增长到数十或数百个服务,必须借助具有广泛构建时间和runtime功能的工具集对其进行集中管理和治理。使用 Spring Cloud,这涉及实现功能服务(例如统计服务、帐户服务和通知服务)和支持基础设施服务(例如日志分析、配置服务器、服务发现、身份验证服务)。使用 Spring Cloud 描述此类 MSA 的图表如下:
该图涵盖了系统的运行时方面,但没有涉及封装、CICD、扩展、高可用性和自我修复,这些在 MSA 中也非常重要。假设大多数 Java 开发人员都熟悉 Spring Cloud,在本文中,我们将通过解决这些问题来绘制一个平衡点,看看 Kubernetes 与 Spring Cloud 之间的关系。
微服务问题
与其逐个进行功能比较,不如让我们来看看更广泛的微服务关注点,看看 Spring Cloud 和 Kubernetes 如何处理这些问题。
关于 MSA 的好处在于,它是一种具有易于理解和权衡的架构风格 。微服务支持强大的模块边界,具有独立部署和技术多样性。它们是以开发分布式系统和大量运营开销为代价的。一个关键的成功因素是专注于能够帮助您尽可能多的解决 MSA 问题。使启动过程快速而简单很重要。
在上图中,我们可以看到一个列表,其中包含必须在 MSA 中解决的最常见的技术问题。
技术映射
Spring Cloud 和 Kubernetes 这两个平台非常不同,它们之间没有直接的功能对等。如果我们将每个 MSA 关注点映射到用于在两个平台中解决它的技术,我们会得出下表。
上表的主要结论是:
- 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 的健康检查结合时,进程会重新启动,
对比
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 方面非常强大。因此,将它们结合起来并取其精华去其糟粕。
- 通过这样的组合,Spring 提供应用程序打包,Docker 和 Kubernetes 提供部署和调度。Spring 通过 Hystrix 线程池提供应用内隔离,Kubernetes 通过资源、进程和命名空间隔离提供逻辑隔离。Spring 为每个微服务提供健康端点,Kubernetes 执行健康检查和流量路由到健康服务。Spring 外部化和更新配置,Kubernetes 将配置分发到每个微服务。配合默契,简直完美。
个人最喜欢的微服务堆栈
一张图足以涵盖,请看图: