SpringCloud PK K8s 谁更胜一筹

2023-10-31

SpringCloud PK K8s 谁更胜一筹

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对比图

从上表可以得出的主要结论是:

  • Spring Cloud 有一组丰富的集成良好的 Java 库,可以作为应用程序堆栈的一部分解决所有运行时问题。因此,微服务本身就有库和运行时代理来进行客户端服务发现、负载均衡、配置更新、指标检测等功能。但这些服务都是在 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 平台本身提供的统一编程模型,以及 Spring Boot 的快速应用程序开发能力,为开发人员提供了良好的微服务开发体验。例如,用很少的注解就可以完成配置中心服务,用很少的注解就可以让客户端库使用您的后台服务。
  • 有丰富的库可供选择,涵盖了大多数运行时问题。由于所有的库都是用 Java 编写的,所以它提供了多种特性、更大的控制和微调选项。
  • 不同的 Spring cloud 库彼此很好地集成在一起。例如,一个 Feign 客户端也能使用 Hystrix 来做断路器,使用 Ribbon 来做请求的负载。一切都是注解驱动的,易于开发,感觉就像 Java 开发人员的天堂。

缺点

  • Spring Cloud 的一个主要优点同时也是它的缺点——它仅限于 Java。MSA 的一个强大动机是在需要时能够改变技术栈、库甚至语言。这些对 Spring Cloud 来说是不可能的。如果你想消费 Spring Cloud/Netflix OSS 基础设施服务,比如配置管理、服务发现、负载均衡,这个解决方案并不能完美解决。Netflix Prana 项目实现了 sidecar 模式,以在 HTTP 上公开基于 Java 的客户端库,使用非 java 语言编写的应用程序可能存在于 Netflix 生态系统中,但它不是很优雅。此外,自从我写了这篇文章以来,Pivotal 还宣布了一个名为 SteelToe 的新项目,它允许使用 net 客户端的服务发现和配置 Java 服务调用。
  • Java 开发人员有太多的责任去关心和处理 Java 应用程序。每个微服务都需要运行各种客户端,以进行配置检索、服务发现和负载平衡。设置这些很容易,但这并不会隐藏构建时间和对环境的运行时依赖关系。例如,我可以很容易地创建一个带有@EnableConfigServer 注解的配置服务器,但这只是一个简单的方法。每次我想运行一个微服务时,我都需要启动配置服务器并运行它。对于受控环境,我必须考虑使配置服务器高度可用,因为它可以由 Git 或 Svn 支持,所以我需要为它共享文件系统。类似地,对于服务发现,我需要首先启动 Eureka 服务器。对于受控环境,我需要在每个 AZ 上使用多个实例对其进行多副本部署等等。作为一名 Java 开发人员,除了实现所有功能性服务之外,我还必须构建和管理一个重要的微服务平台。
  • 仅仅 Spring Cloud 在微服务领域的应用范围就比较局限,为了获得完整的微服务体验,您还需要考虑自动部署、调度、资源管理、进程隔离、自愈、构建管道等问题。就此而言,我认为将 Spring Cloud 单独与 Kubernetes 进行比较是不公平的,更公平的比较应该是将 Spring Cloud + Cloud Foundry(或 Docker Swarm)与 Kubernetes 进行比较。但这也意味着,要想获得完整的端到端微服务体验,Spring Cloud 必须辅之以 Kubernetes 之类的平台。

Kubernetes

Kubernetes 是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。它是支持多种语言的,并为配置、运行、扩展和管理分布式系统提供了了良好的支持。

优点

  • Kubernetes 是一个多语言的通用容器管理平台,能够运行本地云和传统的容器化应用程序。它提供的服务,如配置管理、服务发现、负载平衡、指标收集、日志聚合,都可以被各种语言使用。这允许在组织中拥有一个平台,可以被多个团队使用(包括使用 Spring 框架的 Java 开发人员),并服务于多种目的:应用程序开发、测试环境、构建环境(用于运行源代码控制系统、构建服务)
  • 与 Spring Cloud 相比,Kubernetes 解决了更广泛的 MSA 问题。除了提供运行时服务外,Kubernetes 还允许您提供环境、设置资源约束、RBAC、管理应用程序生命周期、支持自动伸缩和自愈(行为几乎像一个抗脆弱的平台)。
  • 我忍不住要提到 Kubernetes 技术是基于谷歌 15 年的研发和管理容器的经验。此外,它拥有近 1000 名提交者,是 Github 上最活跃的开源社区之一。

缺点

  • Kubernetes 支持多种语言,因此它提供的服务是通用的,并没有针对不同的平台或者语言进行优化,比如针对 JVM 的 Spring Cloud。例如,配置作为环境变量或文件系统传递给应用程序。它没有 Spring Cloud Config 提供配置自动更新功能特性。
  • Kubernetes 并不是一个专注于开发者的平台。它的目的是让有 DevOps 意识的 It 人员使用。因此,Java 开发人员需要学习一些新概念,并以开放的心态学习解决问题的新方法。尽管使用 MiniKube 启动 Kubernetes 实例的开发人员非常容易,但是手动安装高可用的 Kubernetes 集群会带来很大的操作成本。
  • Kubernetes 仍然是一个相对较新的平台,它仍然在积极开发和成长。因此,每个版本都会增加很多新特性,可能很难跟上。好消息是,它设计思想超前,而且 API 是可扩展和向后兼容的。

两者完美结合

正如你所看到的,这两个平台在某些领域都有优势,并在其他领域有所改进。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 提供的能力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud PK K8s 谁更胜一筹 的相关文章

随机推荐

  • 环境感知算法——4.RandLA-Net基于SemanticKITTI训练

    1 前言 RandLA Net Random Sampling and Local Feature Aggregator Network 是一种处理点云数据的神经网络结构 采用随机采样 Random Sampling RS 以降低点云密度并
  • 【华为OD机试】组成最大数【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小组中每位都有一张卡片 卡片上是6位内的正整数 将卡片连起来可以组成多种数字 计算组成的最大数字 输入描述 号分割的多个正整数字符串 不需要考虑非数字异常情况 小组最
  • 多变的智能降噪

    告警 作为监控的平台的最直观的体现形式 可以体现出被 监控者 的当前状态 你可以看到它是健康十足的平稳状态 亦或是偶尔发出告警的异常状态 甚至是告警癫狂的崩溃状态 这都是最直观的告诉你他是否需要你的方式 但如果没有好的梳理方式 反而会让人没
  • android studio 突然无法启动 if you already have a 64-bit jdk installed,define a java_home variable in

    控制台输出乱码 按照方法处理 然后就无法启动 鼠标选中Android studio应用 双击shift键 弹出框 输入vmoption 添加 Dfile encoding UTF 8 Android studio控制台 输出乱码解决方法 n
  • 网络请求及协议

    TCP IP 协议 图解HTTP常见问题 归类 目录
  • 《clickhouse原理解析与应用实践》读书笔记

    福利置顶 温馨提示 电子版可在微信读书app阅读 第一章 ClickHouse的前世今生 传统BI的局限性 数据仓库 为了解决数据孤岛的问题 即通过引入一个专门用于分析类场景的数据库 将分散的数据统一汇聚到一处 数据仓库的衍生概念 对数据进
  • Docker网络学习

    文章目录 Docker容器网络 1 Docker为什么需要网络管理 2 Docker网络简介 3 常见的网络类型 4 docker 网络管理命令 5 两种网络加入差异 6 网络讲解 docker Bridge 网络 docker Host
  • 腾讯云私有云平台运维面试

    文章目录 概述 JD 岗位描述 一面 二面 三面 HR面 概述 根据会议将面试问题进行总结 很多问题感觉当时没回答好 这是为啥呢 应该还是不熟练吧 或者不善于表达 将次经历分享出来 大家多练练 JD 岗位描述 私有云平台运维 JD 腾讯云智
  • ThreadLocal,看我就够了!

    ThreadLocal 开胃菜 研究过Handler的应该对ThreadLocal比较眼熟的 线程中的Handler对象就是通过ThreadLocal来存放的 初识ThreadLocal的可能被它的名字有所误导 ThreadLocal初一看
  • 将Android项目作为module导入到主项目中

    导入module流程 1 主项目中import需要导入项目的app模块 2 修改该module中build gradle里的com android application为com android library 3 删除该module的ap
  • 【Java】JDBC操作Oracle数据库

    1 Statement 用于执行静态 SQL 语句并返回它所生成结果的对象 statement每次执行sql语句 相关数据库都要执行sql语句的编译 import java sql Connection import java sql Dr
  • 前端例程20220802:玻璃背光按钮

    演示 原理 使用元素包裹按钮 按钮设置为玻璃质感 设置光标悬停动画 使用元素的before和after两个元素作为背景灯光 设置光标悬停动画 代码
  • cmd for命令

    for命令式批处理命令中最复杂也是功能最为强大的一个命令 它可以对一组不同的文件或数据进行循环处理 FOR variable variable IN set DO command command parameters variable 指定
  • pytorch语义分割-全卷积网络

    文章目录 1 语义分割和实例分割 2 语义分割的数据集处理 3 转置卷积 4 全卷积神经网络 FCN 1 语义分割和实例分割 2 语义分割的数据集处理 最重要的语义分割数据集之一是Pascal VOC2012 matplotlib inli
  • linux 可能从硬盘安装吗,从硬盘安装linux(radHat)

    1 gt 从网上下载redhat iso安装文件 并放在同一文件夹中 2 gt 用WinISO解开第一张盘的 iso文件 如解到cd1文件加中 不用全部解出 只要dosutils子文件夹就可以了 3 gt 进入MS DOS打开cd1文件夹的
  • 使用可视化库matplotlib绘图时,plt.show()过后只出现Figure size 640x480 with 1 Axes而没有生成图片

    使用可视化库matplotlib绘图时 plt show 过后只出现
  • Tomcat源码:Acceptor与Poller、PollerEvent

    参考资料 Tomcat源码解析系列 十一 ProtocolHandler Tomcat源码解析系列 十二 NioEndpoint 前文 Tomcat源码 启动类Bootstrap与Catalina的加载 Tomcat源码 容器的生命周期管理
  • 联想计算机连接不上蓝牙耳机,thinkpad如何连接蓝牙耳机_thinkpad连接蓝牙耳机的步骤...

    现在的电脑一般都配备有蓝牙功能 可以方便用户们使用一些蓝牙设备 例如最近就有小伙伴问小编thinkpad如何连接蓝牙耳机 那么针对这一问题 今天小编就来为大家整理分享关于thinkpad连接蓝牙耳机的步骤 一起往下看吧 具体步骤如下 1 先
  • VB封装DLL并调用

    首先明确DLL函数是什么 DLL 动态链接库 Dynamic Link Library 一个DLL文件里面可以包含多个函数 其实就是实现共享函数的一种方式 一个应用程序可能需要多个DLL联合起来才可以正常使用 一 新建ActiveX Dll
  • SpringCloud PK K8s 谁更胜一筹

    SpringCloud PK K8s 谁更胜一筹 Spring Cloud 和 Kubernetes 都声称自己是开发和运行微服务的最佳环境 但它们在本质上有很大的不同 解决的问题也不同 在本文中 我们将看看每个平台是如何交付基于微服务架构