基于Kubernetes的微服务架构,你学废了吗?

news2024/12/23 14:05:06

至于服务网关,虽然保留了 Zuul,但没有采用 Kubernetes 的 Ingress 来替代。这里有两个主要考虑因素:首先,Ingress Controller 并非 Kubernetes 的内置组件,有多种可选方案(例如 KONG、Nginx、Haproxy 等),且需要独立安装。

2017年,这一年在容器技术发展史上具有重要的分水岭意义,标志着“后微服务时代”的开始。这一年,发生了几件重大事件,彻底改变了容器管理领域的格局。

首先是 CoreOS,一直以来与 Docker 竞争的 RKT 容器技术的领头羊,宣布放弃其容器管理系统 Fleet,转而支持 Kubernetes。接着,容器管理行业的领头羊 Rancher Labs 也放弃了自家多年开发的 Cattle 系统,采纳“All-in-Kubernetes”的策略,从此 Rancher 2.0 版本起只支持 Kubernetes。

同年,Kubernetes 的主要对手 Apache Mesos 宣布了与 Kubernetes 的集成计划,“Kubernetes on Mesos”,这标志着他们从竞争对手转变为支持者,让 Kubernetes 能够与 Mesos 的其他顶级框架(例如 HDFS、Spark 和 Chronos 等)实现资源的动态共享和隔离。

此外,2017年10月,Docker 的母公司,也是 Kubernetes 最大的竞争对手之一,宣布 Docker 将同时支持 Swarm 和 Kubernetes,这在事实上承认了 Kubernetes 的领导地位。

这些事件标志着长达三至四年的容器技术竞争战争,主要围绕 Docker Swarm、Apache Mesos 和 Kubernetes,最终以 Kubernetes 的胜利告终。Kubernetes 的崛起不仅是容器技术发展的一个重要里程碑,也预示着软件架构发展新纪元的到来。

需求场景

在采用了基于 Spring Cloud 的微服务架构之后,小书店 Fenix's Bookstore(虚拟) 成功地应对了伸缩性、独立部署、运维管理等方面的挑战,以及产品经理提出的日益增长的复杂业务需求。然而,对于团队中的开发者、设计师和架构师来说,工作并没有变得更加轻松。微服务所涉及的新技术术语,如配置中心、服务发现、网关、熔断、负载均衡等,对新手来说学习曲线陡峭。而从产品的角度看,Spring Cloud 的各种组件,如 Config、Eureka、Zuul、Hystrix、Ribbon、Feign 等,也构成了产品编译后代码的主要部分。

微服务架构选择在应用层面解决分布式问题,而不是在基础设施层面,主要是因为软件的应用服务比硬件基础设施更加灵活,而后者难以跟上前者的步伐。但是,随着 Kubernetes 在容器编排管理方面的统一,这些技术性的底层问题开始在基础设施层面找到了广泛认可的解决方案。因此,Fenix's Bookstore 开始了它在“后微服务时代”的又一次架构升级,此次升级主要集中在两个目标上。

Fenix's Bookstore 的微服务架构升级主要围绕两个核心目标进行。第一个目标是减少非业务功能代码的占比。在这家书店的系统中,用户服务(Account)、商品服务(Warehouse)和交易服务(Payment)是承担实际业务逻辑的核心模块。而认证授权服务(Security)则同时涉及技术和业务层面,配置中心(Configuration)、网关(Gateway)和服务注册中心(Registry)则完全是技术性质的组件。目的是尽可能地消除这些纯技术组件,以及那些附属于其他业务模块的技术性功能。

第二个目标是在尽量不改变原有代码的情况下完成迁移。依托于 Spring Framework 4 中的 Conditional Bean 等声明式编程特性,现代 Java 技术组件越来越倾向于声明式(Declarative Programming)而非命令式编程(Imperative Programming)。这样的编程风格允许开发者从目标出发描述编码意图,而不是围绕具体的技术实现过程,从而减少代码与技术实现的耦合。如果需要更换技术实现,只需调整配置声明即可。

从升级的角度看,如果仅以 Java 代码来衡量,这次迁移到 Kubernetes 后的项目与之前基于 Spring Cloud 的版本在代码层面上没有任何区别,每一行 Java 代码都保持不变。但实际上,区别在于 Kubernetes 实现中直接删除了配置中心和服务注册中心等工程,在其他工程的 pom.xml 文件中也移除了像 Eureka、Ribbon、Config 等组件的依赖。取而代之的是引入了一系列以 YAML 配置文件为基础的 Skaffold 和 Kubernetes 资源描述。这些资源描述文件将动态构建出 DNS 服务器、服务负载均衡器等虚拟化基础设施,替代了原有应用层面的技术组件。升级后的应用架构如下图所示:

技术组件

Fenix's Bookstore 采用基于 Kubernetes 的微服务架构,并采用 Spring Cloud Kubernetes 做了适配,其中主要的技术组件包括以下几种。

在 Fenix's Bookstore 的微服务架构中,为了实现容器环境的感知,我们使用了Spring Cloud Kubernetes,它集成了 Fabric8 的 Kubernetes Client。但是,Spring Cloud Kubernetes 版本 1.1.2 中使用的 Fabric8 Kubernetes Client 版本是 4.4.1,这个版本根据 Fabric8 提供的兼容性列表,仅支持到 Kubernetes 1.14。尽管在 Kubernetes 1.16 上也能运行,但在 1.18 版本上就无法正确识别 Api-Server。因此,在 Maven 项目中添加依赖时,需要手动排除旧版本,并引入更新的版本(在这个项目中使用的是 4.10.1)。

配置管理方面,项目利用 Kubernetes 的 ConfigMap 来进行配置管理,并通过 Spring Cloud Kubernetes Config 自动地将 ConfigMap 的内容注入到 Spring 的配置文件中,实现动态更新。服务发现是通过 Kubernetes 的 Service 实现的,Spring Cloud Kubernetes Discovery 能自动将 HTTP 服务请求转换为完全限定域名(FQDN)。负载均衡方面,则直接利用 Kubernetes Service 的内置负载均衡功能(即 DNS 负载均衡),因此不再需要像 Ribbon 这样的客户端负载均衡组件。从 Spring Cloud Kubernetes 1.1.2 开始,Ribbon 的适配支持已被移除,且暂时没有对 Spring Cloud LoadBalancer 这一替代品提供适配。

至于服务网关,虽然保留了 Zuul,但没有采用 Kubernetes 的 Ingress 来替代。这里有两个主要考虑因素:首先,Ingress Controller 并非 Kubernetes 的内置组件,有多种可选方案(例如 KONG、Nginx、Haproxy 等),且需要独立安装。为了保持演示项目的环境简单,我选择不使用 Ingress;其次,考虑到 Fenix's Bookstore 的前端项目存放在网关中,即使移除了 Zuul,仍然需要保持一个前端项目的存在。因此,移除 Zuul 并不能进一步减少项目数量,这减弱了移除 Zuul 的必要性

在 Fenix's Bookstore 的微服务架构更新中,服务熔断功能仍然由 Hystrix 实现。由于 Kubernetes 本身不提供细致的服务治理能力,如熔断、流量控制和监控等,我们计划在后续基于 Istio 的服务网格架构中解决这些问题。在认证授权方面,我们继续使用 Spring Security OAuth 2.0。虽然 Kubernetes 的 RBAC(基于角色的访问控制)能够处理服务层面的访问控制问题,但 Spring Security 跨越了业务和技术的界限,其认证授权模块仍然负责前端用户的认证和授权,这是与业务直接相关的部分。

它是基于 Apache 2.0 协议授权的。遵守这一许可协议的条件下,你可以自由地对代码进行修改和重新发布,甚至用于商业目的。但是,你需要遵守以下要求:署名在原始代码及其衍生代码中保留原作者的署名和代码来源信息;保留许可证在原始代码及其衍生代码中保留 Apache 2.0 协议文件。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asdf安装不同版本的nodejs和yarn和pnpm

安装asdf 安装nodejs nodejs版本 目前项目中常用的是14、16和18 安装插件 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf plugin-add yarn https://github.com/twuni/asdf-yarn.git可以查看获取所有的nodejs版本 asdf list all nodejs有很多找…

Wireshark网络协议分析 - TCP协议

在我的博客阅读本文 文章目录 1. 基础2. 实战2.1. 用Go写一个简单的TCP服务器与客户端2.2. Wireshark抓包分析2.3. 限制数据包的大小——MSS与MTU2.4. 保证TCP的有序传输——Seq,Len与Ack2.5. TCP头标志位——URG,ACK,PSH,RST&…

【前端素材】bootstrap3 实现地产置业公司source网页设计

一、需求分析 地产置业公司的网页通常是该公司的官方网站,旨在向访问者提供相关信息和服务。这些网页通常具有以下功能: 公司介绍:网页通常包含有关公司背景、历史、核心价值观和使命等方面的信息。此部分帮助访问者了解公司的身份和目标。 …

visual studio2022专业版安装步骤

目录 一、Visual studio下载二、创建C#项目——Hello World三、专业版秘钥激活 一、Visual studio下载 首先进入下载官网 先下载2022专业版,等等后面还需要选环境 我勾选了以下几个和c#开发有关的,后面缺什么还可以再安装所有以少勾了问题也不大 然后…

solidworks 焊接型材库

型材库中有大部分型材 H型钢有49种 八角钢有40种 扁钢有60种 不等边钢有84种 槽钢有41种 也可以按照自己需要的去添加 下载地址https://download.csdn.net/download/jintaihu/19347986

《金融电子化》昆仑银行在应用性能监控(APM)平台的实践与探索

《金融电子化》昆仑银行在应用性能监控(APM)平台的实践与探索 中国人民银行印发的《金融科技发展规划(2022-2025年)》是对金融科技发展的重要引领。规划强调了金融科技在推动金融行业现代化转型、提升金融服务效率和风险防控水平…

体验 AutoGen Studio - 微软推出的友好多智能体协作框架

体验 AutoGen Studio - 微软推出的友好多智能体协作框架 - 知乎 最近分别体验了CrewAI、MetaGPT v0.6、Autogen Studio,了解了AI Agent 相关的知识。 它们的区别 可能有人要问:AutoGen我知道,那Autogen Studio是什么? https://g…

直播不仅可以带货,还可以远程协作

直播是一种非常直观高效的信息共享模式,目前直播带货比较火,但我也不懂,现就我涉及的领域和实践做一些分享,目前我所做的直接互动分发系统在软硬件全系统闭环下,结合100ms级的低延迟,基本可以让人有深入其境…

Vue_Router_守卫

路由守卫:路由进行权限控制。 分为:全局守卫,独享守卫,组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强,history没有#兼容性差"…

ImageNet预训练图像分类模型预测单张图像

导入基础工具包 import osimport cv2import pandas as pd import numpy as npimport torchimport matplotlib.pyplot as plt %matplotlib inline 计算设备确定 # 有 GPU 就用 GPU,没有就用 CPU device torch.device(cuda:0 if torch.cuda.is_available() else c…

pytorch学习笔记(十二)

以下代码是以CIFAR10这个10分类的图片数据集训练过程的完整的代码。 训练部分 train.py主要包含以下几个部件: 准备训练、测试数据集用DateLoader加载两个数据集,要设置好batchsize创建网络模型(具体模型在model.py中)设置损失函…

深入理解G0和G1指令:C++中的实现与激光雕刻应用

系列文章 ⭐深入理解G0和G1指令:C中的实现与激光雕刻应用⭐基于二值化图像转GCode的单向扫描实现⭐基于二值化图像转GCode的双向扫描实现⭐基于二值化图像转GCode的斜向扫描实现基于二值化图像转GCode的螺旋扫描实现基于OpenCV灰度图像转GCode的单向扫描实现基于Op…

Apple Pencil如何连接iPad?这里提供详细步骤

如果你刚拿起一支Apple Pencil,想和iPad一起使用,你需要先连接设备。将Apple Pencil与iPad配对的方法因你拥有的铅笔而异。 一旦你将Apple Pencil连接到iPad,你就可以利用这些方便的功能。你可以记下手写笔记,使用Scribble功能&a…

H5 嵌套iframe并设置全屏

H5 嵌套iframe并设置全屏 上图上代码 <template><view class"mp-large-screen-box"><view class"mp-large-screen-count"><view class"mp-mini-btn-color mp-box-count" hover-class"mp-mini-btn-hover" clic…

QEMU - e1000全虚拟化前端与TAP/TUN后端流程简析

目录 1. Host -> Guest 2.Guest ->Host 3. 如何修改以支持TUN设备的后端&#xff1f; 4. 相关 QEMU 源码 5. 实验 1. Host -> Guest 2.Guest ->Host 3. 如何修改以支持TUN设备的后端&#xff1f; 1. 简单通过后端网卡名字来判断是TUN还是TAP。 2. 需要前端全…

gdp调试—Linux

目录 介绍 使用 介绍 代码分为debug模式和release模式 如果一份代码要被调试&#xff0c;这份代码必须是debug Linux下编译代码默认是是release模式 如果你想代码是debug模式 必须加上 - g 小提&#xff1a; vim默认&#xff1a;命令模式 gcc默认&#xff1a;releas…

华为数通方向HCIP-DataCom H12-831题库(简答题01-27)

第01题 第02题 第03题 第04题 第05题 IS-IS是链路状态路由协议,使用SPF算法进行路由计算。某园区同时部署了IPV4和IPv6并运行IS-IS实现网络的互联与通。如图所示,该网络IPV4和IPV6开销相同,R1和R4只支持IPV4缺省情况下,计算形成的IPV6最短路径树中,R2访问R6的下一跳设备是…

【C++初阶】C++入门(2)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、函数重载1.1 函数重载的概念1.2 函数重载的种类1.3 C支持函数重载的原理 二…

最全前端 HTML 面试知识点

一、HTML 1.1 HTML 1.1.1 定义 超文本标记语言&#xff08;英语&#xff1a;HyperTextMarkupLanguage&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言 HTML元素是构建网站的基石 标记语言&#xff08;markup language &#xff09; 由无数个…

橱窗宝石 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 橱窗里有一排宝石&#xff0c;不同的宝石对应不同的价格&#xff0c;宝石的价格标记为 gems[i],0<i<n, n gems.length 宝石可同时出售0个或多个&#xff…