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

至于服务网关,虽然保留了 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。如果你有闲暇时间,可以做个知识拓展。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)

目录 0. 前言 1. Penn-Fudan数据集介绍 2. Penn-Fudan数据集预处理过程 3. 结果展示 4. 完整代码 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如…

Springboot项目启动后浏览器不能直接访问接口,而postman可以访问?

在云服务器上部署springboot后端时,项目启动后浏览器不能直接访问接口,而postman可以访问。这是当时困扰了我大半天的小问题,在我打开防火墙和阿里云安全组之后还是没解决。然后在网上搜了很多很多资料,以为是浏览器访问权限或者是https什么证…

微信公众号数量达到上限怎么办

一般可以申请多少个公众号?许多用户在申请公众号时可能会遇到“公众号显示主体已达上限”的问题。这是因为在2018年11月16日对公众号申请数量进行了调整,具体调整如下:1、个人主体申请公众号数量上限从2个调整为1个。2、企业主体申请公众号数…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”,这就是ABC输入法,点击上面的Delete按钮,删除整项ABC内容&#xff0c…

【计算机毕业设计】128电脑配件销售系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

public class和class的区别

不用public修饰的类 一个Java源文件中可以定义多个不用public修饰的class,且类名不用和java源文件名一致。public修饰的类可以没有。编译之后,一个class就会对应生成一个class字节码文件 对于用public修饰的类 如果一个类用了public修饰,那…

搞懂Nginx的.conf文件路径配置

详解server中各部分作用及如何配置 如下图所示,这是我配置好的一个server代码块,我这里配置了https,所以会比默认的多一部分内容,如果你只需要配置http,则只需关注红色方框的部分即可,下面会按顺序讲解。 ①…

C++进阶--继承

概念 继承,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法。 继承的主要目的是实现代码的重用和构建类之间的层次关系。通过继承,子类可以获得父类的特性,包括数据成员…

海外短剧系统国际短剧源码h5多语言版app挂载tiktok油管ins

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目 前言 一、海外短剧系统是什么? 二、海外短剧系统功能与运营方式介绍 1.系统功能 2.短剧APP运营方式 总结 前言 本文简单介绍海外短剧系统的功能&#xff…

【已解决】Ubuntu64位无法运行32位ELF文件的问题

问题起因 因为在做一道逆向题,发现题目给的文件是32位elf文件,所以想在Linux下执行一下,然后发现会报错。 于是查了一下资料,发现报错的原因是64位的Ubuntu无法直接运行32位的程序,需要下载兼容32位的库。 解决方法…

JUC并发编程10——ThreadLocal

目录 1. ThreadLocal是什么? 2. ThreadLocal怎么用? 3. ThreadLocal源码分析 3.1set方法 3.2get()方法 3.3remove()方法 4.为什么key使用弱引用? 5.ThreadLocalMap 和 HashMap 区别 6.ThreadLocal变量不具有传递性 7.InheritableTh…

Android 跳转应用设置/热点界面或等常用操作

Android 跳转应用设置/热点界面或等常用操作 https://www.jianshu.com/p/ba7164126690 android学习进阶——Setting https://blog.csdn.net/csdn_wanziooo/article/details/81980984 Android 7.1 以太网反射 EthernetManager 配置 DHCP、静态 IP https://codeleading.com/art…

防火墙综合拓扑(NAT、双机热备)

实验需求 拓扑 实验注意点: 先配置双机热备,再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致如果其中一台防火墙有过配置,最好清空或重启,不然配置会同步失败两台防火墙同步完成后,可以直接在主状态防火墙…

MyBatis 的注解实现方法

MyBatis 的注解实现方法 MyBatis 的注解实现方法引入依赖添加配置创建表创建实体类创建mapper接口InsertDeleteSelectResults和ResultMap通过配置文件解决 UpdateOptions MyBatis 的注解实现方法 引入依赖 在springBoot项目中下载了EditStarters插件的,可以直接在配置文件处右…

JVM学习

1.Java虚拟机内部有哪些线程共享,那些线程隔离 程序计数器: 通过改变这个计数器的值来选取下一条需要执行的字节码命令 Java虚拟机栈: 栈,每个方法被执行时,Java虚拟机都会同步的创建一个栈帧用于存储局部变量表&…

Linux:进度条的创建

目录 使用工具的简单介绍: \r : fflush : 倒计时的创建: 倒计时的工作原理: 进度条的创建: 不同场景下、打印任意长度的进度条: main .c procbor.c 测试效果: 使用工具…

STM32学习笔记(四) —— 位段别名区的使用

STM32F103RCT6有两个位段区 (SRAM 最低1M空间和片内外设存储区最低1M空间), 这两个区域都有各自的别名区,在别名区中每个字会映射到位段区的一个位,所以在别名区修改一个字相当于修改位段区中对应的一个位 映射公式( 别名区中的字与位段区中的…

jenkins部署(docker)

docker部署,避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…

Excel得到JSON串

很多时候业务都需要做一种从Excel读取或者导入数据的功能,这在cs程序比较简单,在BS程序上如果封装不好的话那么写起来还是很费劲的,这次封装Excel读取操作。 先看使用 对,你没有看错,就是这么简单。 封装 基础设计…