【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式技术特别及问题分析

简介: 【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式技术特别及问题分析

分布式架构


互联⽹架构演进


单体应⽤架构


定义


⼀个归档包(例如war格式)包含所有功能的应⽤程序,我们通常称为单体应⽤。⽽架构单体应⽤的⽅ 法论,就是单体应⽤架构。


架构示意图

image.png

优缺点分析


  • 初期:


  • 架构简单,统一化管理真个服务和生态体系
  • 开发、测试、部署都很⽅便



  • 随着项⽬的发展,项⽬越来越臃肿,问题出现了:


  • 复杂性⾼


  • 只有逻辑性的模块化,物理不隔离,随着代码的增⻓也越来越混乱、复杂。⼀个百万⾏级别的单体应⽤为例,整个项⽬包含的模块⾮常多,模块的边界模糊,依赖关系不清晰,代码质量参差不⻬,混乱地堆砌在⼀起……整个项⽬⾮常复杂。每次修改代码都⼼惊胆战,甚⾄添加⼀个简单的功能,或者修改⼀个BUG都会带来隐含的缺陷。



  • 技术债务


  • 时间推移、需求变更和⼈员更迭,会逐渐形成应⽤程序的技术债务,并且越积越多。“不坏不修(Not broken,don’t fix)”,这在软件开发中⾮常常⻅,在单体应⽤中这种思想更甚。已使⽤的系统设计或代码难以被修改,因为应⽤程序中的其他模块可能会以意料之外的⽅式使⽤它。


  • 部署频率低


  • 随着代码的增多,构建和部署的时间也会增加。⽽在单体应⽤中,每次功能的变更或缺陷的修复都会导致我们要重新部署整个应⽤。全量部署的⽅式耗时⻓、影响范围⼤、⻛险⾼,这使得单体应⽤项⽬上线部署的频率较低。⽽部署频率低⼜导致两次发布之间会有⼤量的功能变更和缺陷修复,出错概率⽐较⾼。




可靠性较差,影响范围大


极端场景下,某个BUG,例如死循环、OOM等,可能会导致整个应⽤的崩溃。



扩展能⼒受限


单体应⽤只能作为⼀个整体进⾏扩展,⽆法根据业务模块的需要进⾏伸缩。


  • 模块是计算密集型的,它需要强劲的CPU;
  • 模块则是IO密集型的,需要更⼤的内存。

由于这些模块部署在⼀起,我们不得不在硬件的选择上做出妥协。



阻碍技术创新


单体应⽤往往使⽤统⼀的技术平台或⽅案解决所有的问题,团队中的每个成员都必须使⽤相同的开发语⾔和框架,要想引⼊新框架或新技术平台会⾮常困难。例如,⼀个使⽤Struts 2构建的、有100万⾏代码的单体应⽤,如果想要换⽤Spring MVC,毫⽆疑问切换的成本是⾮常⾼的。




微服务架构


诞⽣背景


  1. 互联⽹的迅速发展 => 敏捷
  2. 快速验证、快速试错 => 持续交付
  3. 更频繁的部署频率 => 要⾃动化,DevOps
  4. 单体架构⽆法满⾜要求



微服务是什么


微服务架构⻛格是⼀种将⼀个单⼀应⽤程序开发为⼀组⼩型服务的⽅法,每个服务运⾏在⾃⼰的进程中,服务间通信采⽤轻量级通信机制(通常⽤HTTP资源API)。这些服务围绕业务能⼒构建并且可通过全⾃动部署机制独⽴部署。这些服务共⽤⼀个最⼩型的集中式的管理,服务可⽤不同的语⾔开发,使⽤不同的数据存储技术。



TPS分布式架构


Martin Fowler《微服务》博客原⽂:www.martinfowler.com/articles/mi…⽂:blog.cuicc.com/blog/2015/0…



微服务优缺点


优点:


  • 单个服务更易于开发、维护
  • 单个微服务启动较快
  • 局部修改容易部署
  • 技术栈不受限
  • 按需伸缩



缺点:


  • 运维要求⾼
  • 分布式固有的复杂性
  • ⽹络延迟、容错、分布式事务...
  • 重复劳动



微服务 vs SOA

image.png

微服务设计原则


  • 单⼀职责原则 SOLID
  • 服务⾃治原则
  • 轻量级通信机制
  • 合理的微服务粒度
  • ⾃动化机制:⾃动化测试、部署、运维,⼀切。



调⽤关系设计原则


  • 尽量缩短链路
  • 避免循环依赖


微服务架构通览

image.png


服务发现原理+负载均衡原理剖析


最初的模式

image.png

单体应用集中式部署

image.png

多个应用集中式部署(集群式)

image.png

多应用分布式部署(分布式)

image.png

多应用分布式部署+TDDL分布式代理数据

image.png

微服务拆分⽅方案


领域驱动设计(DDD)


  • 领域模型:为了准确定义需要解决的问题⽽构造的抽象模型。


  • 领域语⾔ - 定义领域模型时,⼀定要基于某个特定场景,建⽴⼀个⽆歧义的交流语⾔。例如UML
  • 界限上下⽂ - 限定某个特定边界的上下⽂。对于相同的模型⽽⾔,在不同的场景强调的场景是不太⼀样的。例如:对于订单⽽⾔,从⽤户的视⻆分析,⽤户关⼼的是订单的价格、快递到的时间;从库存的⻆度分析,库存更关注订单的库存的告警等等。




⾯向对象


  • by name:对象模型
  • by verb:对象⾏为。



微服务拆分最佳实践


初期使⽤⾯向对象/DDD建模后拆分即可,不要过分纠结微服务粒度,也不宜拆分得过细(防⽌出现很多不合理的拆分粒度),满⾜当前要求即可。当随着业务的发展,业务场景需要我们进⼀步细化拆分的粒度再去细化拆分或改造。



项⽬改造成微服务


改造前须知


  1. 改造不是⼀蹴⽽就的,往往很⻓⼀段时间内,新⽼架构是共存的



改造原则


  1. 初期只做必要的微服务治理
  • 缩⼩改造范围,⼩范围试⽔
  1. 降低对已有系统的侵⼊性
  • 尽量减少对现有系统的改动,降低⻛险,保证可⾏性
  • 初期挑选相对独⽴、耦合性较⼩的上层应⽤进⾏改造,积累经验
  • 经验丰富后,再进⾏⼤规模的改造



新⽼架构共存


  1. 只能⼀点⼀点改造,并逐步将遗留项⽬迁移⾄微服务架构。


老应用依赖新应用

image.png

调用模式

网络异常,图片无法展示
|

新应用依赖老应用

image.png

⽼服务暴露基于HTTP的API,新⽼服务之间通过Spring Cloud Sidecar进⾏通信,Sidecar原理解析。



代码改造方式


绞杀者模式

image.png

  • 对于遗留系统Legacy


  • 不改动⽼系统Legacy,⽽是另起微服务Modern,实现对Legacy的改造


  • 外层创建⼀个⻔⾯,做接⼝的转发,对于已经改造完的API,转发到Modern,对于未改造的API,
  • 依然转发到Legacy


  • 使⽤⽹关配置转发规则


  • 随着迁移的不断深⼊,最终绞杀掉Legacy


修缮者模式image.png


  • 识别出应⽤要拆的部分(Flawed Supplier)


  • 为(Flawed Supplier)抽象接⼝层(Abstraction Layer),从⽽隔离(Flawed Supplier)内部发
  • ⽣的变化


  • “客户端”通过接⼝层(Abstraction Layer)调⽤(Flawed Supplier)


  • 为要拆的部分(Flawed Supplier)编写新的实现(New Supplier)


  • “客户端”通过接⼝层调⽤新的实现(New Supplier)


  • 删除Flawed Supplier



数据库层⾯的改造


  • 废弃掉掉触发器、存储过程


  • ⼲掉跨模块的join,使⽤API调⽤的⽅式实现原有功能


  • 将API按照模块拆出去


  • 将相关的表拆到对应的微服务种


  • 业务改造期间,通过双写⽅式


  • 切少量流量到新库,进⾏测试与验证


  • 流量全切到新库


  • 逐步退化⽼库,直⾄废弃


  • 迁移失败预案




相关文章
|
19天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
12天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
133 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
1天前
|
机器学习/深度学习 存储 人工智能
基于AI的实时监控系统:技术架构与挑战分析
AI视频监控系统利用计算机视觉和深度学习技术,实现实时分析与智能识别,显著提升高风险场所如监狱的安全性。系统架构包括数据采集、预处理、行为分析、实时决策及数据存储层,涵盖高分辨率视频传输、图像增强、目标检测、异常行为识别等关键技术。面对算法优化、实时性和系统集成等挑战,通过数据增强、边缘计算和模块化设计等方法解决。未来,AI技术的进步将进一步提高监控系统的智能化水平和应对复杂安全挑战的能力。
|
18天前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
26天前
|
Cloud Native 持续交付 云计算
云原生技术在现代IT架构中的转型力量####
本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的关键作用与实践路径。通过具体案例分析,展示了云原生如何赋能企业实现更高效的资源利用、更快的迭代速度以及更强的系统稳定性,为读者提供了一套可借鉴的实施框架与策略。 ####
24 0
|
26天前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
51 1
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
21天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
58 5
|
24天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
53 8
|
1月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
58 16