部署微服务:Spring Cloud pk Kubernetes

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

[[440220]]

本文转载自微信公众号「新钛云服」,作者徐磊 翻译。转载本文请联系新钛云服录公众号。

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 将配置分发到每个微服务。配合默契,简直完美。

个人最喜欢的微服务堆栈

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

 

原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes

 

责任编辑:武晓燕 来源: 新钛云服
相关推荐

2017-09-05 14:05:11

微服务spring clou路由

2024-02-06 18:05:54

微服务SpringCloud

2018-06-01 23:08:01

Spring Clou微服务服务器

2017-06-26 09:06:10

Spring Clou微服务架构

2024-08-05 10:03:53

2024-07-10 10:51:39

SpringEureka数据中心

2023-12-19 09:33:40

微服务监控

2017-09-04 16:15:44

服务网关架构

2021-10-19 14:02:12

服务器SpringSecurity

2020-06-30 07:58:39

微服务Spring BootCloud

2024-11-21 16:09:22

2017-12-20 15:37:39

Spring Clou微服务架构

2023-08-22 11:00:16

云计算容器微服务

2021-07-07 07:44:20

微服务Nacos缓存

2017-07-03 09:50:07

Spring Clou微服务架构

2017-08-09 15:50:47

Spring Clou微服务架构

2017-08-10 11:15:05

Spring Clou微服务架构

2018-07-09 09:27:10

Spring Clou微服务架构

2022-07-17 11:45:39

微服务架构

2020-12-30 07:49:32

KubernetesJava Spring Clo
点赞
收藏

51CTO技术栈公众号