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

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

分布式架构


互联⽹架构演进


单体应⽤架构


定义


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


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


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


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


  • 流量全切到新库


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


  • 迁移失败预案




相关文章
|
6天前
|
存储 分布式计算 关系型数据库
架构/技术框架调研
本文介绍了微服务间事务处理、调用、大数据处理、分库分表、大文本存储及数据缓存的最优解决方案。重点讨论了Seata、Dubbo、Hadoop生态系统、MyCat、ShardingSphere、对象存储服务和Redis等技术,提供了详细的原理、应用场景和优缺点分析。
|
6天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
29 5
|
6天前
|
传感器 算法 物联网
智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建
随着城市化进程的加速,停车难问题日益凸显。本文深入剖析智能停车系统的关键技术,包括停车场电子地图编辑绘制、物联网与传感器技术、大数据与云计算的应用、定位技术及车辆导航路径规划,为读者提供全面的技术解决方案。系统架构分为应用层、业务层、数据层和运行环境,涵盖停车场室内导航、车位占用检测、动态更新、精准导航和路径规划等方面。
33 4
|
7天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
7天前
|
运维 Kubernetes Cloud Native
云原生技术在现代应用架构中的实践与挑战####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在实际项目中的应用案例,分析了企业在向云原生转型过程中面临的主要挑战及应对策略。不同于传统摘要的概述性质,本摘要强调通过具体实例揭示云原生技术如何促进应用的灵活性、可扩展性和高效运维,同时指出实践中需注意的技术债务、安全合规等问题,为读者提供一幅云原生技术实践的全景视图。 ####
|
8天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
6天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
17天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
7天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
17 1
服务架构的演进:从单体到微服务的探索之旅
|
8天前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
26 7

热门文章

最新文章