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

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

分布式架构


互联⽹架构演进


单体应⽤架构


定义


⼀个归档包(例如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按照模块拆出去


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


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


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


  • 流量全切到新库


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


  • 迁移失败预案




相关文章
|
5天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
34 3
|
5天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
1天前
|
存储 分布式计算 分布式数据库
风险数据集市整体架构及技术实现
【11月更文挑战第11天】在当今大数据时代,风险数据集市作为金融机构的核心基础设施之一,扮演着至关重要的角色。它不仅为银行、保险等金融机构提供了全面、准确的风险数据支持,还帮助这些机构实现了风险管理的精细化和智能化。本文将深入探讨一种基于大数据Lambda架构设计的风险数据集市整体架构,并详细介绍其底层实现原理及实现方式。
13 3
|
1天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
20 2
|
3天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
6天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
5天前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
19 3
|
6天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
36 4
|
5天前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
18 2

热门文章

最新文章