架构师修炼系列【微服务设计与运行】

微服务架构强调每个服务独立部署,高内聚低耦合,通过点对点或异步消息协议协作。它降低了复杂系统的相互影响,提高了可维护性和扩展性。微服务的特点包括独立部署、可替代性、数据独立、服务编排和透明性。与SOA不同,微服务更注重服务的自治和业务内聚。开发中应遵循自治性、可恢复性、透明性、自动化和一致性的原则,确保服务稳定、可扩展和易于管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微服务应用

通常在单体系统中,开发者会在类、模块、类库的层面来设计功能属性,而在微服务应用中,开发者的目标则变成了可独立部署的功能单元,而每个功能单元以一些复杂的方式进行交互,功能单元之间的相互协作则是通过一系列消息协议来完成,而这些协议可能是点对点的也可能是异步的,每个功能单元共同合作起来形成了一个更加复杂的系统
微服务发展至今已并非新鲜事物,而其定义也非常容易理解,但它确实能够显著的降低复杂系统开发过程中的相互牵扯和冲突,且同时具备了软件工程实践倡导的【高内聚】【低耦合】,很显然具备这样特点的系统更容易维护、易扩展,通过这些手段完成为客户持续交付价值的最终目的,这里的重点在于持续交付,而如果更高维度考虑,将其与商业行为结合,这个最终目的应该是为客户快速的持续的交付价值,于是这里的重点便多了一个维度即快速的持续的

微服务特点

概念是非常容易懂的,稍微有几年开发经验的开发者一看便知道其中的意义,但到了实操层面具体该怎么做技术设计又无从下手,如果说微服务的概念告诉了我们它解决了什么问题,那么微服务的几个特点【我更愿称之为原则】告诉了我们应该如何做技术设计

高内聚 低耦合

内聚度时用来衡量某个模块中的各个元素属于一个整体的紧密程度的指标,耦合度则是衡量一个元素对另一个元素的内部运转逻辑了解程度的指标,而在讨论内聚和耦合的时候,单一职责原则便是一个很少的提升内聚的手段即:将那些因相同原因而修改的内容聚合到一起,将那些因不同原因而修改的内容进行拆分
单个微服务应该是高内聚的,它应该只负责应用的一个功能,同样每个服务对其他服务的内部运转逻辑知道的越少就越容易修改,而不需要让其他服务跟着一起修改

场景实例

考虑一下出售股票的场景,大致需要如下4步处理

  • 用户创建一个订单,用来出售其账户里某只股票的股份
  • 账户中的这部分持仓就会被预留下来,确保相同的股份不可以被多次出售
  • 提交订单到市场上需要缴纳印花税
  • 系统需要将这个订单发送给对应的股票交易市场

如图所示微服务设计,它是整个交易系统的一部分

在这里插入图片描述

从图中可以看到,微服务的三大关键特点:

  • 每个微服务只负责一个功能,这个功能可能是业务相关的功能,也可能是共用的技术功能,比如与第三方的集成
  • 每个微服务都拥有自己的数据存储,这是降低耦合非常关键的设计,各服务之间的数据访问,仅可以通过服务提供的接口来访问它们自己所不拥有的数据
  • 微服务自己负责编排和协作(控制消息和操作的执行顺序来完成某些有用的功能),既不是由连接微服务的消息机制来完成的,也不是通过另外的软件功能来完成的

除了以上的三大特点外,还有两个基本特性:

  • 每个微服务都可以独立部署,如果做不到,那么到了部署阶段微服务应用还是一个庞大的单体应用,而团队不能仅仅考虑到coding的部分,还需要考虑部署、监控、诊断等一些列环节,如此微服务才能发挥其作用
  • 每个微服务都是可代替的,每个微服务只具备一项功能,所以这很自然地限制了服务的大小,同时每个服务的职责或角色更加易于理解

微服务与SOA的区别

微服务与传统的面向服务架构SOA有一个关键区别,微服务负责协调系统中的各个操作,而SOA类型的服务通常通过使用企业服务总线ESB或者更复杂的编排标准将应用本身与消息和流程编排拆开,在SOA模型下,服务通常缺乏内聚度,因为业务逻辑会不断地添加到服务总线上,而非服务本身

通过分解来实现扩展

在这里插入图片描述

扩展立方体定义了三种不同的扩展应用程序的方法:X轴扩展在多个相同实例间实现请求的负载均衡,Y轴扩展通过拆分功能将项目分解为多个服务,Z轴扩展根据请求的属性路由请求。

X轴扩展(cookie-cutter)

X轴扩展主要是面向单体应用程序的扩展,单体应用程序的多个相同实例通过负载均衡器去分配请求,主要用于提升系统吞吐量和可用性,常见应用:集群

Z轴扩展(数据分区)

Z轴扩展是要实现单体应用的多个实例,但不同的是实例之间并不是相同的,每个实例只负责数据集的一个子集,路由网关通过请求的属性将请求路由到特定的实例,从而实现对数据的水平分区,主要用于提升系统的吞吐量,常见应用:分库分表

Y轴扩展(功能性分解)

X轴扩展和Z轴扩展都可以提升系统的吞吐量,但并没有解决日益增长的开发问题和应用复杂性的问题,Y轴扩展通过拆分功能解决此类问题,主要用于降低系统耦合性,常见应用:微服务

微服务与生俱来的优势

  • 可以针对每个问题选择最合适的技术工具,无需多个服务死板的采用固有的技术和工具
  • 自治和独立部署意味着可以分别管理这些微服务所对应的资源需求,同时减少故障,不会因某个服务故障导致其他服务连锁故障
  • 自治性也使得开发者可以独立的对这些服务进行开发、部署和扩容

5大核心原则

自治性、可恢复性、透明性、自动化和一致性

自治性

非常明确的是微服务是自治的,每个服务的操作和修改都是独立于其他服务的,那么为了保证自治性,开发者需要将服务设计得松耦合、可独立部署

松耦合

每个微服务通过明确定义的接口或者发布的事件消息来与其他服务进行交互,这些交互需独立于协作方的内部实现

可独立部署

不同的服务通常由多个不同的团队并行开发,因此独立部署则成为快速交付价值的非常关键环节,也因此各服务之间相对完全独立
在这里插入图片描述

自治性也是团队文化,各个服务的责任和所有权委派给有责任交付商业价值的团队,这是非常关键的管理决策,组织的设计会对系统设计产生影响,清晰的服务所有权有助于团队基于他们本身所处的环境和目标迭代开发和做技术决策

可恢复性

微服务与生俱来的具备故障隔离的机制,如果开发者独立的部署这些微服务,那么当应用或者基础设施出现故障,故障只会影响到整个系统一部分功能,同样部署功能的粒度越小、开发者越能更平缓的对系统进行变更

透明性

当故障发生时,开发者需要记得微服务应用是依赖于多个服务之间的交互及其表现的,而这些服务是由不同的团队开发的,因此无论在什么时候系统都应该是透明的、可观测的,如此更有利于发现问题诊断问题解决问题

自动化

通过开发大量的服务来缓解应用不断变化所带来的痛苦,看似有悖常理,事实上相对一单体系统,微服务确实是一种更加复杂的架构,通过采用自动化和在基础设施内保持服务之间的一致性,开发者可以极大地降低因为这些额外的复杂性引入的管理成本,通过自动化也可以保证部署和系统运维过程中的正确性

微服务架构的流行与两种趋势是同时发生的,一种趋势是DevOps技术的得到了主流接纳,其中典型的就是基础设施即代码(infrastructure-as-code)技术;另一种趋势是完全通过API进行编程的基础设施环境(如AWS和Azure)的兴起,三者同时发生并非巧合

一致性

以恰当的方式调整开发工作至关重要,开发者的目标应该是围绕业务实体来组织服务和团队,只有如此服务和团队的内聚性才能更高

为了理解一致性的重要性,对比一下很多传统的SOA系统都是分别部署他们的技术层的:UI层、业务逻辑层、集成层和数据层
在这里插入图片描述

SOA中使用横向拆分是有问题的,会导致内聚的功能被分散到多个系统中,新的功能可能需要协调发布到多个服务中,并且可能与其他在同一技术抽象层的其他功能产生耦合
在这里插入图片描述

微服务架构应该偏向于纵向拆分,每个服务应该与一个独立的业务功能相匹配,并且将所有相关的技术层的内容封装到一起

开发者应牢记谁在消费这些服务,为了保证系统的稳定性,开发者需要在开发过程中有足够的耐心来保持所开发服务的向后兼容(无论是显式地兼容,还是同时运行多个版本的服务)这样就可以确保不需要强迫其他团队升级或破坏服务之间已有的复杂交互

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Davieyang.D.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值