从开发者的角度看K8S中的复合容器模式

就应用设计最佳实践和原则而言,构建复杂的基于容器的架构与编程没有太大区别。本文的目标是使用众所周知的编程原理从开发人员的角度展示三种流行的可扩展性架构模式。

让我们从单一职责原则开始。根据 R. Martin 的说法,“一个类应该只有一个改变的理由。” 但类是用于简化现实世界问题并表示软件组件的抽象。因此,一个组件应该只有一个随时间变化的原因。软件服务,特别是微服务也是组件(运行时组件),应该只有一个改变的理由。微服务应该是单个可部署单元,这意味着它们独立于其他组件进行部署,并且可以根据需要拥有任意数量的实例。

但这总是正确的吗?微服务是否始终作为单个单元部署?

在Kubernetes中,微服务的体现是 Pod。Pod 被定义为一组共享文件系统、内核命名空间和 IP 地址等资源的容器。Pod 是 Kubernetes 集群中调度的原子单元,每个 Pod 旨在运行给定应用程序的单个实例。

根据文档,“Pod 旨在支持形成一个内聚服务单元的多个协作进程(作为容器)。Pod 中的容器会自动在集群中的同一物理或虚拟机上共同定位和共同调度”水平扩展应用程序意味着复制 Pod。根据 Kubernetes 文档,可以使用两种策略来配置 Pod:

运行单个容器的 Pod:“每个 Pod 一个容器”模型是最常见的 Kubernetes 用例;Pod 是单个容器的包装器,Kubernetes 管理 Pod,而不是直接管理容器。

运行多个容器一起工作的 Pod:Pod 可以封装由多个紧密耦合且需要共享资源的共置容器组成的应用程序。这些位于同一位置的容器形成了一个单一的内聚服务单元,例如,一个容器向公众提供存储在共享卷中的数据,而一个单独的sidecar容器则刷新或更新这些文件。Pod 将这些容器、存储资源和临时网络身份包装在一起作为一个单元。”

答案是:不!微服务并不总是作为单个单元部署!

除了可扩展性模式、部署和可靠性模式等一些流行的云架构模式之外,还有可扩展性架构模式。我们将仔细研究云架构的三种最流行的可扩展性模式:

  • 边车模式

  • 大使模式

  • 适配器模式

边车模式

问题

每个可部署的服务/应用程序都有自己的“更改原因”或责任。然而,除了其核心功能之外,它还需要做其他事情,在软件开发人员术语中称为“横切关注点”。一个示例是需要发送到监控服务的性能指标的集合。另一种方法是记录事件并将其发送到分布式日志服务。我将它们称为横切关注点,因为它们不直接与业务逻辑相关并且是多个服务所需要的,它们基本上代表了需要成为每个部署单元一部分的可重用功能。

解决方案

这个问题的解决方案被称为边车模式,并且要求创建一个称为边车容器的额外容器。边车容器是主容器的扩展,遵循开放-封闭设计原则(开放于扩展,封闭于修改)。它们在部署方面与“主”容器紧密耦合,因为它们作为同一Pod的一部分部署,但仍然容易替换,并且不破坏扩展容器的单一责任。此外,实现的模块化允许对与业务相关的功能和其他助手服务(如事件记录或监控)进行独立测试。两个容器之间的通信是快速和可靠的,它们共享对相同资源的访问,使助手组件能够提供可重用的基础架构相关服务。此外,它适用于许多类型的服务,解决了在使用不同技术方面的异质性问题。边车组件的升级也很简单,因为它通常意味着升级Docker容器版本,并使用例如Kubernetes的无停机时间策略进行重新部署。

大使容器

问题

已部署的服务并不是孤立运行的。它们通常通过网络与其他服务进行通信,甚至在单个组织控制的应用程序或软件平台之外。组件之间的集成通常意味着与外部 API 的集成以及处理外部系统的故障或不可用。外部系统集成的常见做法是定义所谓的 API Facade,即隐藏外部系统 API 复杂性的内部 API。API Facade 的作用是隔离外部依赖项,提供内部 API 定义的实现,并在需要时负责安全性和路由。此外,外部系统的故障和不可用通常使用一些常见模式(例如重试模式、断路器模式)进行处理,有时还由本地缓存提供支持。所有这些技术细节都会使主要服务变得复杂,并且似乎是辅助容器的候选者。

解决方案

该问题的解决方案被称为大使模式,并意味着创建一个称为大使容器的额外容器。大使容器将本地连接代理到外部世界,它们基本上是一种边车容器。这种容器组合很强大,不仅因为关注点的分离和不同团队可以轻松地拥有组件,而且它还允许轻松地模拟本地开发环境的外部服务。

适配器容器

问题

仍有许多整体系统计划迁移到更轻量级的架构。然而,迁移不可能一次性完成,而且在两个版本的系统中都支持添加新功能的同时,等待整个系统重写多年也是有风险的。迁移应该以小块的形式进行,发布单独的服务并将它们一一集成。这个过程会重复进行,直到遗留的整体系统消失。因此,我们有一个支持新 API 的系统新部分和一个仍然支持旧 API 的旧系统部分。例如,我们可能新实现了 REST 服务,但仍然有一些旧的基于 SOAP 的服务。我们需要一些东西来负责暴露旧功能,就好像所有服务都已迁移并且可以由客户系统集成一样。

解决方案

该问题的解决方案称为适配器或反腐败模式。适配器容器负责从一种通信协议转换为另一种通信协议以及从一种数据模型转换为另一种数据模型,同时向外部世界隐藏实际服务。此外,适配器容器可以提供双向通信。如果遗留系统需要与新服务通信,它也可以是该通信的适应组件,充当一种大使容器,直到迁移完成。


在本文中,我们了解了容器组合如何在不实际更改主应用程序容器的情况下提供可扩展性机制,通过允许将复合 Pod 视为在微服务架构中公开单个简单服务的任何其他简单 Pod 来提供稳定性和可重用性。有人会问为什么不使用一个库并在多个容器之间共享它。好吧,这也是一个解决方案,但我们面临着在使用它的所有服务之间引入耦合的共同责任问题。此外,异构服务需要使用所有支持的语言重写库。这也打破了单一责任原则,无论如何我们都希望保留这一原则。

作者:Daniela Kolarova

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

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

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

相关文章

软考高级之系统架构师系列之操作系统基础

概念 接口 操作系统为用户提供两类接口:操作一级的接口和程序控制一级的接口。操作一级的接口包括操作控制命令、菜单命令等;程序控制一级的接口包括系统调用。 UMA和NUMA UMA,统一内存访问,Uniform Memory Access&#xff0c…

大型企业如何通过低代码平台提高开发效率和降低成本?

云计算、大数据、人工智能、物联网风口之下,企业数字化转型如同被按下了快进键。为快速攻破转型路上的技术关,企业纷纷把目光投向了低代码开发平台,希望可以用最短的时间,开发出最适合企业发展的应用。 集团企业需要什么样的数字化…

NeRF-SLAM部署运行(3060Ti)

记录在部署运行期间遇到的一些问题,分享给大家~ 一、环境 RTX 3060 Ti、8G显存(其实是不够用,只能简单跑跑demo)、Ubuntu18.04 二、部署 1. 下载代码 git clone https://github.com/jrpowers/NeRF-SLAM.git --recurse-submod…

解决恶意IP地址攻击:保卫网络安全的有效方法

随着互联网的发展,网络安全威胁变得日益复杂,其中包括恶意IP地址攻击。这些攻击通常是网络犯罪分子的手段之一,用于入侵系统、窃取数据或进行其他恶意活动。本文将探讨如何解决恶意IP地址攻击,以保护网络安全。 恶意IP地址攻击是…

与云栖的浪漫邂逅:记一段寻找云端之美的旅程

云端之旅 2023 年的云栖大会如约而至,这次云栖大会也是阿里新任掌门蔡老板当任阿里巴巴董事局主席以来的第一次。大会与以往有很多不一样的地方,其中 AIGC 更是本届大会的重点议题!你会感叹,阿里还是猛啊! 我逛了下展…

Web Woeker和Shared Worker的使用以及案例

文章目录 1、前言2、介绍 Web Worker3、使用须知及兼容性3.1、使用须知3.2、兼容性 4、使用 Web Worker4.1、创建 Web Worker4.2、与主线程通信4.3、终止 Web Worker4.4、监听错误信息 5、使用 Shared Worker4.5、调试 Shared Worker 6、使用中的一些坑6.1、Web Woeker 中引入了…

8种按钮设计的常见类型分享

按钮是UI界面的元素之一,可以本能地吸引游客并将其转化为买家。界面中的UI按钮类型包括:CTA按钮、幽灵按钮、下拉按钮、浮动操作按钮、汉堡包按钮、加号按钮、消耗品按钮、共享按钮。 号召性用语按钮 CTA(呼叫语言)按钮是一种交…

被这7款在线涂鸦画板惊艳到,手残也能画出涂鸦大片!

作为一名涂鸦爱好者或者手帐达人,你是否在寻找好用的在线涂鸦画板软件呢?涂鸦画板软件释放了创造性的无限可能,让你能够将想法转化为令人惊叹的视觉效果,并轻松地与客户、同行和全球观众分享你的作品。 在这篇文章中,…

如何将微信视频号的视频保存到手机相册?

微信视频号是近年来微信推出的一项功能,它允许用户通过手机拍摄和分享短视频内容。然而,许多人纷纷表示他们想要保存微信视频号上的视频,以便在离线时观看。但一直以来这个需求腾讯一直没有开放随后也取消了复制视频链接功能,为此…

审核 Microsoft SQL Server 日志

手动审核数据库活动是一项艰巨的任务,有效完成审计的最佳方法是使用简化和自动化数据库监控的综合解决方案,该解决方案还应使数据库管理员能够监控、跟踪和即时识别任何操作问题的根本原因,并实时检测对机密数据的未经授权的访问。 什么是 S…

NI USB9218国产对标51.2 kS/s/ch,2通道C系列通用模拟输入模块

51.2 kS/s/ch,2通道C系列通用模拟输入模块 NI‑9218专为多用途测量而设计。 它使用针对特定测量的适配器提供了对加速度计、供电传感器、全桥和电压测量以及四分之一桥、半桥、60V和电流测量的内置支持。 每个通道可单独选择,因而用户可在各个通道上进行…

可靠的互联网兼职平台,平常可以做副业充实生活

在互联网时代,越来越多的人开始通过网络来寻找兼职副业的机会,能够更灵活地安排自己的时间,实现自己的收入增值。那么找到一个正规可靠的线上兼职平台就是一个比较重要的事情,这里分享几个正规靠谱的线上兼职副业平台,…

YOLOv7优化:独家创新(Partial_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(Partial_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLO…

基于深度学习的人脸性别年龄识别 - 图像识别 opencv 计算机竞赛

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

自适应H5樱花个人网站引导页导航源码SEO增强版

懂前端和 PHP 技术想更改前端页面的可以看:网站的前端页面不好看,你可以查看 index 目录,内有参数 txt 文本里面记录了前端页面所使的关键 JS 代码和 php 代码,只需要稍加复制粘贴修改到新的前端页面就可以了!主目录的…

Cesium笔记(0):Cesium简介和本地运行

一、Cesium介绍 是国外一个基于JavaScript编写的使用WebGL的地图引擎开源程序,可以免费用于商业和非商业 二、特点 支持3D,2D,2.5D形式的地图展示可以自行绘制图形,高亮区域,并提供良好的触摸支持支持绝大多数的浏览器和mobile动态地理空间…

代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗

前言:动态规划基础 动态规划首先可以解决的问题有背包问题,打家劫舍问题,股票问题,子序列问题等,主要是将一个大的问题切分成多个重叠的子问题,所以动态规划一定是上一个状态递推过来的,有一个重要的状态转移方程,但是这也并不是解题的全部,我们将动态规划的题目基本分为五步来…

【java学习—十一】泛型(1)

文章目录 1. 为什么要有泛型Generic2. 泛型怎么用2.1. 泛型类2.2. 泛型接口2.3. 泛型方法 3. 泛型通配符3.1. 通配符3.2. 有限制的通配符 1. 为什么要有泛型Generic 泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过…

Android原生项目集成uniMPSDK(Uniapp)遇到的报错总结

uni小程s序SDK 集成到Android原生项目:老项目中用到的库较多,会出现几种冲突问题,总结如下: 报错1: Execution failed for task :app:processDebugManifest. > Manifest merger failed with multiple errors, see logs Andro…

【文献分享】基于线特征的激光雷达和相机外参自动标定

论文题目:Line-based Automatic Extrinsic Calibration of LiDAR and Camera 中文题目:基于线特征的激光雷达和相机外参自动标定 作者:Xinyu Zhang, Shifan Zhu, Shichun Guo, Jun Li, and Huaping Liu 作者机构:清华大学汽车安…