分解整体:将整体式架构转换为微服务的容器化之旅

news2024/12/22 23:13:22

传统上,软件应用程序是使用单体架构开发的,其中所有应用程序组件都紧密交织在一起,并作为一个单元进行部署。随着软件应用变得更为复杂,组织开始依赖分布式系统,单体架构的限制开始变得更加明显。容器化被引入作为解决这个问题以及满足应用程序可伸缩性、敏捷性和弹性需求的解决方案。微服务的成功进一步推动了容器的使用,这使得组织能够将单体应用拆解为可独立部署的服务。这种松散耦合的框架还使开发人员能够快速部署更改,同时实现增强的可扩展性和容错能力。在这篇文章中,我们探讨了单体架构的局限性,并演示了容器和微服务如何支持现代应用程序的交付。我们还深入研究了组织在向容器化过渡的过程中可以采用的各种策略、阶段和关键步骤,并了解不同的策略如何支持不同的用例。

将整体式架构分解为微服务

与整体式架构相比,微服务架构由模块化、松散耦合的组件组成,这些组件通过定义良好的 API 进行通信。此体系结构可提高容错能力,因为一个服务的故障对整个系统的影响有限。微服务还与单体架构不同,它使用多语言持久性,使每个服务能够根据其需求选择理想的存储解决方案。

但是,在从整体式架构过渡到微服务架构之前,必须了解两者之间的主要区别,以便做出有关应用程序设计的明智决策并选择正确的转换策略。

下表概述了这些区别,提供了对每种方法的独特优势和特征的见解:

图片

迁移到容器的策略

迁移到容器的策略因组织的特定要求和目标而异。这些策略有助于管理从整体架构到容器化微服务的过渡,使组织能够实现更高的敏捷性、可扩展性和弹性。让我们回顾一些常见的方法。

  • 分阶段方法

此方法涉及通过容器化逐步将整体式架构分解为微服务,从可能首先实现最大收益的组件开始。它降低了风险,同时让团队有时间随着时间的推移学习和调整流程。

何时使用: 当您希望将风险降至最低并中断正在进行的运营时,分阶段方法被认为是最佳选择。它还适用于资源有限或复杂的整体式应用程序的组织,这些组织希望从整体式逐步过渡到微服务。

  • 混合架构

混合架构方法结合了整体式和微服务组件,其中一些组件保留在整体式架构中,而另一些则逐步迁移到微服务架构。此方法平衡了两种体系结构的优点,适用于无法完全承诺完整迁移的组织。

何时使用:
当不可行或没有必要将应用程序完全过渡到微服务时,请采用此方法。此策略特别适用于希望保留整体应用程序的某些部分,同时为特定组件获得微服务的一些优势的组织。

  • 大爆炸方法

从头开始使用微服务重新设计和实现整个应用程序。尽管此策略可能需要专用资源,并且可能会带来更大的风险,但这允许组织充分利用微服务和容器的优势。

何时使用: 当您的整体式应用程序已达到需要彻底检修以满足当前和未来需求的地步,或者当您的组织能够承受资源密集型但风险更高的过渡到微服务和容器,同时获得其所有优势时,请选择此方法。

  • 重新平台化

此方法涉及将整体式应用程序移动到容器平台,而不将其分解为微服务。平台重构提供了容器化的一些好处,例如改进了部署和可伸缩性,而没有完全迁移到微服务的复杂性。

何时使用: 当目标是在不将整体架构分解为微服务的情况下获得容器化的一些优势时,建议使用重新平台化。对于刚接触容器化并希望在承诺完全迁移到微服务之前试水的组织来说,它也是理想的选择。


拥抱容器化之旅的实际步骤

踏上容器化之旅意味着将整体架构转变为精简、高效且可扩展的微服务。以下部分探讨了将整体式架构迁移到容器所涉及的各个阶段,并提供了一个全面的路线图,以成功驾驭容器化的复杂性。

将整体架构迁移到容器的阶段

从整体架构到容器的迁移过程通常经历三个阶段。每个阶段都侧重于解决特定挑战并逐步转换架构以优化效率、灵活性和可维护性:

1、确定组织应用程序体系结构中的整体架构。

寻找具有单一代码库、共享资源和有限模块化的大型紧密耦合系统。分析依赖项、数据流和通信模式,以了解整体架构的复杂性。

2、定义服务边界。

执行域驱动设计 (DDD) 分析,以确定整体架构内的逻辑服务边界。建立封装特定业务功能或流程的边界上下文,使微服务能够围绕这些上下文进行设计,并减少服务间的依赖关系。

3、将应用程序重新架构为更小、更易于管理的部分。

使用 API 网关、服务注册表和断路器等模式将整体式应用程序重新架构为微服务。实现 API 驱动的方法,每个微服务公开一个 RESTful API 或使用基于消息的通信,如 AMQP 或 Kafka。

图片

图 1:将整体架构迁移到容器

容器化之旅的关键步骤

采用容器化通常涉及一系列定义明确的步骤,这些步骤可以针对个别用例进行定制。成功的容器化采用可能因每个组织的用例而异。但是,以下四个步骤为组织从识别组件应用程序和设置可靠的管理到管理容器的安全实践提供了一般指导。

识别应用程序组件

使用依赖关系图或体系结构关系图分析应用程序的体系结构,以识别数据库、Web 服务器和后台辅助角色等各个组件。确定可以容器化的组件,并确定应在容器化过程中解析的相关依赖项。

目的:

  • 提供应用程序体系结构的清晰度
  • 有助于高效分配资源
  • 实现组件隔离,实现更大的模块化
  • 帮助进行依赖关系管理
  • 确保容器化组件之间的无缝通信

容器化应用程序组件

为每个组件创建 Dockerfile,以便将应用程序组件封装到隔离的容器中,从而简化部署、可移植性和版本控制。使用多阶段构建来优化映像大小,并采用最佳实践,例如使用非 root 用户和最小化攻击面。通过标记映像并将其存储在容器注册表(如 Docker Hub、RedHat Quay 或 GitHub 容器注册表)中,确保映像的正确版本控制。

目的:

  • 将组件封装在容器中以创建隔离环境
  • 可在不同环境中轻松转移组件
  • 有助于更好地控制组件的版本

容器编排

选择容器编排平台(如 Kubernetes 或 Docker Swarm)来管理容器化应用程序的部署、扩展和管理。通过在部署清单或撰写文件中定义资源限制和请求,实现适当的资源分配。使用活动性和就绪性探测创建自我修复部署,以监视容器运行状况并重新启动运行状况不佳的容器。

目的:

  • 确保每个容器的资源优化分配
  • 保持应用程序的高可用性和容错能力
  • 促进滚动更新和回滚,停机时间最短

容器管理和安全

使用 Prometheus 和 Grafana 等工具进行监控和日志记录,并对关键事件进行自定义警报。为容器更新实现 CI/CD 管道,自动执行生成、测试和部署过程。采用安全最佳实践,例如扫描图像以查找漏洞、强制实施网络分段以及应用最小特权原则。此外,还建议使用容器安全解决方案,以帮助持续监视威胁并实施安全策略。

例如,可以将以下配置文件视为用于管理和保护容器的伪代码:


# Example of container security best practices configuration
container_security:
  - use_non_root_user: true
  - minimize_attack_surface: true
  - implement_network_segmentation: true
  - enforce_least_privilege: true

例如,下一步,以下伪代码演示了如何使用任何容器管理工具加载安全最佳实践配置并将其应用于正在运行的容器:

# Pseudocode to manage and secure containers
import container_management_tool

# Load security best practices configuration
security_config = load_config("container_security")

# Apply security best practices to running containers
container_management_tool.apply_security_config(security_config)

# Monitor container performance and resource usage
container_management_tool.monitor_containers()

# Implement logging and alerting
container_management_tool.setup_logging_and_alerts()

目的:

  • 监控容器性能和资源使用情况
  • 实施日志记录和警报,以便更好地了解容器化应用程序
  • 通过扫描图像中的漏洞并应用最佳实践来确保容器安全
  • 使用容器安全解决方案实施安全策略并监控威胁

真实用例

在其应用程序架构中成功实施容器化的一些组织的真实示例包括Netflix,Spotify和Uber。

Netflix:架构转型,实现敏捷性和可扩展性

Netflix 就是这样一家成功利用容器和微服务架构来解决其流媒体服务大规模问题的公司。通过投资基于容器的工作负载,Netflix 能够将其整体式应用分解为独立的、更集中的服务,这些服务可以独立部署和管理,从而提供更高的敏捷性和可扩展性,同时更轻松地适应高峰时段的大流量高峰。这提供了更大的灵活性,因为他们可以更轻松地处理增加的流量。

Spotify:容器化可提高开发人员的工作效率

Spotify还采用了容器和微服务来提高开发人员的生产力。在转型之旅之前,他们依赖于一个整体架构,该架构需要在跨职能团队之间进行广泛的协调来运行和维护。通过使用容器化和微服务打破这个整体,他们创建了一个模块化架构,开发人员能够在其中独立处理其应用程序的特定组件或功能,而不会受到不同团队的干扰。容器还提供了一个一致的环境,开发人员能够在其中轻松地在应用程序上构建、测试和部署迭代更改。

优步:用于部署和流量峰值管理的容器

起初,Uber 使用的是难以扩展的单体框架,需要密切的团队协作才能顺利运行。他们过渡到使用面向领域的微服务架构 (DOMA) 来根据需求扩展其服务。该平台利用容器,允许更快速的部署并改进对流量高峰的处理。

Uber利用微服务和容器独立扩展其服务,使其能够根据流量或使用模式调整其产品。此外,使用微服务提供了增强的故障隔离和弹性,确保其核心服务即使在一项服务发生故障时仍然可用。

结论

踏上容器化之旅使组织能够将其整体式应用程序转变为更敏捷、可扩展且更具弹性的基于微服务的系统。尽管有这些好处,但也必须认识到,从整体式应用程序过渡到容器化微服务可能会带来挑战,例如增加操作复杂性和管理分布式系统的潜在问题。在反思自己组织的容器化之旅时,请考虑以下问题:

  • 整体式应用程序的哪些组件将从容器化中受益最大?
  • 您将采用什么策略来迁移到容器:分阶段方法、混合架构、大爆炸方法或重新平台化?
  • 您将如何在新架构中确保有效的容器编排和管理?

回答了上述问题,转型之旅的蓝图已经确定。接下来是实施所选策略,监控进度,并根据需要进行迭代以完善流程。

作者:Sudip Sengupta

更多技术干货请关注公号“云原生数据库

squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等

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

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

相关文章

关于连接数据库时只能使用localhost而不能使用IP连接的问题解决办法

出现:java.sql.SQLException: null, message from server: "Host DESKTOP-H84MBU3 is not allowed to connect to this MySQL server"问题 解决办法: 1、打开数据库操作命令窗口 2、修改user表中 "root" 所对应的 "host&q…

JMeter之IP欺骗技术(模拟不同的IP地址并发请求)

目录 前言: 第一步:在负载机上绑定IP地址 第二步:点击高级,添加伪造的IP地址 第三步:新增IP地址复制到文本 第四步:新建参数化请求 第五步:新建压力测试脚本 第六步:配置线程…

【Mysql】事务原理与优化最佳实践(四)

前言 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增 删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题&…

【C】函数

目录 【1】函数是什么 【2】C语言中函数的分类 【2.1】库函数 【2.2】如何学会使用库函数 【2.3】自定义函数 【3】函数的参数 【3.1】实际参数(实参) 【3.2】形式参数(形参) 【4】函数的调用 【4.1】传值调用 【4.2】传址调用 【…

kubernetes环境搭建及部署

一、kubernetes 概述 1、kubernetes 基本介绍 kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源 的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效…

【Python】文件

文章目录 一. 什么是文件二. 文件路径三. 打开文件四. 关闭文件五. 写文件1. 清空写2. 追加写 六. 读文件1. 使用 read 方法读取2. 使用 for 循环按行读取3. 使用 readlines 方法读取整个文件的内容 七. 上下文管理器1. 什么是上下文管理器?2. 为什么要有上下文管理…

ESP8266模块MQTT AT Commands 发送 json字符串

ESP8266 wifi模块介绍 ESP8266EX 由乐鑫公司开发,提供了⼀套⾼度集成的 Wi-Fi SoC 解决⽅案,其低功耗、紧凑设计和⾼稳定性可以满⾜⽤户的需求。ESP8266EX 拥有完整的且⾃成体系的 Wi-Fi ⽹络功能,既能够独⽴应⽤,也可以作为从机…

ORA-31664: unable to construct unique job name when defaulted

某个环境备份不足空间问题处理后,手动执行expdp备份的脚本,报错如下 Export: Release 11.2.0.4.0 - Production on Tue Jul 4 11:46:14 2023 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle D…

【海量数据挖掘/数据分析】之 决策树模型(决策树模型、决策树构成、决策树常用算法、决策树性能要求、信息增益、信息增益计算公式、决策树信息增益计算实例)

【海量数据挖掘/数据分析】之 决策树模型(决策树模型、决策树构成、决策树常用算法、决策树性能要求、信息增益、信息增益计算公式、决策树信息增益计算实例) 目录 【海量数据挖掘/数据分析】之 决策树模型(决策树模型、决策树构成、决策树常…

Windows环境部署MySQL_5.7的安装、测试连接以及卸载全过程实操手册

前言: 前面记录了双环境的oracle的安装卸载及相关测试评估,这里记录下 MySQL5.7社区免费版的部署手册。 什么是 MySQL MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数…

window.open()实现PDF预览

效果图如下: 页面使用: window.open(strUrl) 参数说明如下图:

深度学习笔记之Transformer(四)铺垫:LayerNormalization

深度学习笔记之Transformer——LayerNormalization 引言回顾:批标准化问题描述问题处理 层标准化批标准化无法处理的问题 引言 在介绍 Transformer \text{Transformer} Transformer模型架构之前,首先介绍 Transformer \text{Transformer} Transformer的…

linux 环境下ElasticSearch 7.1.6.3、kibana-7.16.3安装

安装包放入百度网盘,自取 链接:https://pan.baidu.com/s/1Uh9pKFoaz9qi4CE4_GmlOA?pwdroky 提取码:roky 快速演示下安装操作: ElasticSearch 7.1.6.3: 1.上传至服务器相应目录下 我传到的/home目录下&#xff0…

0、技术选型

技术选型参考: 系统数据流程图 框架发行版本选型 1)如何选择Apache/CDH/HDP版本? (1)Apache:运维麻烦,组件间兼容性需要自己调研。(一般大厂使用,技术实力雄厚&#xf…

【随笔】jupyter notebook启动打开文件出现:500 : Internal Server Error

错误: 看log有 module ‘mistune’ has no attribute BlockGrammar’错误 打开文件有500 : Internal Server Error 解决方法: pip install --upgrade jupyterhub pip install --upgrade --user nbconvertconda环境可以: conda install nbc…

使用Python开发ChatGPT AI工具助手(ChatCatsy):4天快速开发指南

引言: ChatGPT是一种基于人工智能的对话生成模型,它可以用于开发聊天机器人、虚拟助手等应用。本教程将指导您在3天内使用Python开发一个ChatGPT AI工具助手。无需担心,即使您是初学者,也可以轻松跟随本指南完成项目。 第一天&a…

Java-数据结构(三)-List:ArrayList和LinkedList及其相关面试题

目录 一、引言二、ArrayList2.1 ArrayList是什么?2.2 ArrayList的历史由来2.3 ArrayList的使用好处2.4 ArrayList的底层原理2.5 ArrayList的操作方法及代码示例 三、LinkedList3.1 LinkedList是什么?3.2 LinkedList的历史由来3.3 LinkedList的使用好处3.…

攻防世界_web

robots 题目描述是这样的,虽然这是一道基础题,但我确实还没有了解过robots协议 第一次知道是被御剑给扫描出来的后台文件 这次直接访问看看 初级题就是初级题,访问后得到提示,如果没做过我估计还不知道该咋整,这也是一…

Squid 缓存代理(一)---原理及搭建(传统代理、透明代理)

前言 Squid 是 Linux 系 统 中 最 常 用 的 一 款 开 源 代 理 服 务 软 件 ( 官 方 网 站 为 http://www.squid-cache.org),可以很好地实现 HTTP 和 FTP,以及 DNS 查询、SSL 等应用的缓存代理。缓存代理作为应用层的代理服务软件…

C#(四十八)之StreamWriter StreamWriter使用方法及与FileStream类的区别

StreamReader类的属性: CurrentEncoding:获取流使用的字符编码 EndOfStream:指示当前位置是否在流的末尾 StreamReader类的方法: Read():读取流中的下一个字符或下一组字符。 ReadBlock():读取一个字符…