您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

一文理解分布式开发中的服务治理

时间:2022-07-22 16:06:47  来源:  作者:博文视点Broadview

我们在分布式开发中经常听到的一个词就是“服务治理”。在理解“服务治理”的概念之前让我们先理解什么是分布式系统,分布式系统之间如何通过RPC(Remote Procedure Call,远程过程调用)方式通信,以及如何解决RPC框架存在的问题,这样才能真正地理解服务治理的核心思想。

 

分布式系统

分布式系统指的是通过网络连接让多台计算机协同解决单台计算机所不能解决的计算、存储等问题,多台计算机之间通过 RPC 方式通信。在使用分布式系统前,首要解决的问题是如何拆解当前面临的问题。通过使用多台计算机分布式解决问题,让分布式系统中的每台机器都负责解决原问题的一个子集。一般来说,可以使用横向拆分法或者纵向拆分法对复杂的系统进行拆分。

◎横向拆分:在无状态系统中多部署几个实例,通过负载均衡方式协调每个实例所负载的计算量。

◎纵向拆分:将一个大应用拆分为多个小应用(例如,将系统拆分为用户、商品、订单服务),每个小应用都负责处理一部分业务。

然而,虽然通过拆分法解决了计算或存储的问题,但是使用分布式技术进行开发会引发比单体应用更多的问题,比如网络异常、数据一致性及分布式系统性能等。因此,在使用分布式架构开发系统前,需要先深入理解分布式系统的概念和可能存在的异常。

01.分布式系统中的常见异常

 

◎服务器宕机:服务器宕机是分布式架构下最常见的异常之一。任何服务器都有可能发生故障,而且故障发生的类型、时间都不尽相同。所以,分布式系统一般允许部分服务器发生故障,但要求在部分服务器发生故障时不影响整个系统的正常使用。

◎网络异常:服务器与服务器之间通过网络通信,若在通信过程中出现消息丢失,则两个节点之间无法进行通信,会出现网络分化、消息乱序等网络问题。

◎分布式系统的三态:如果某个节点向另一个节点发起RPC请求,比如节点A向节点B发送一个消息,节点B根据收到的消息完成某些操作,并将操作的结果通过消息返回给节点A,那么这个RPC请求的执行结果可能有三种状态:成功、失败、超时(未知)。我们将这三种状态称为分布式系统的三态。在设计架构时需要考虑成功、失败、超时(未知)这三种状态的处理方式。

◎存储的数据丢失:对于有状态节点来说,数据丢失意味着状态丢失。通常只能从其他节点读取、恢复该存储数据的状态。

02.分布式系统的副本分类

 

分布式系统的副本指的是在分布式系统中为数据或服务提供的冗余。该副本可分为服务副本和数据副本两种类型。

◎服务副本:多个节点提供某种相同的服务,这种服务不依赖本地节点的存储状态,是一种无状态服务。

◎数据副本:在不同的节点上持久化同一份数据。当出现某一个节点存储的数据丢失时,可以从其他副本上读取该数据。数据多副本是分布式系统解决数据丢失异常的唯一方法,因为数据被分散或者复制到不同的机器上,所以如何保证各台主机之间数据的一致性,成为一个难点。

对于分布式系统而言,服务副本非常容易控制,由于服务本身具备无状况特性,运维人员可以动态增加或者减少服务副本的数量,而不会影响服务接口返回数据的正确性。数据副本分布在不同的计算机上,从技术角度来看,数据的一致性面临着巨大的挑战。数据副本的一致性通常具有以下几种情况。

◎强一致性:任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。这是程度最高的一致性要求,也是实践中最难实现的一致性。

◎弱一致性:系统并不保证进程或者线程在任何时刻访问数据都会返回最新的更新过的值。系统在数据成功写入之后,不承诺立即读到最新写入的值,也不承诺最终多久之后可以读到最新值。

◎最终一致性:数据一旦更新成功,各个副本上的数据最终将达到完全一致的状态,但需要一定的时间。

然而,分布式系统也存在一些复杂特性,比如分布式系统的三态性、异构性、透明性、并发性、可扩展性等。我们在应用分布式系统的过程中要仔细斟酌这些特性的优势和副作用。

03.分布式系统的设计原则

◎异构性:由于分布式系统基于不同的网络、操作系统、计算机硬件和编程语言,因此必须考虑采用一种通用的网络通信协议来屏蔽异构系统之间的差异。开发人员一般选择中间件来屏蔽这些差异。

◎透明性:分布式系统中任意组件的故障及主机的升级或迁移,对用户来说都是透明的。

◎并发性:应用分布式系统的目的是更好地共享资源,所以系统中的每个资源在并发环境下都必须是安全的。

◎可扩展性:随着业务量的增加,系统必须具备可扩展性,以应对因业务量增长而增加的外部流量。

◎故障独立性:任何计算机都有可能发生故障,而且各计算机发生的故障类型不尽相同,发生故障的时间也各不相同。所以,分布式系统一般允许发生部分故障,而不影响整个系统的正常使用。

◎数据一致性:因为数据被分散或者复制到不同的机器上,所以需要保证各台服务器之间数据的一致性。

◎负载均衡:由于分布式系统是多机协同工作的系统,因此为了提高系统的整体效率和吞吐量,必须考虑最大化地发挥每个节点的作用,以最大化地利用资源,避免某个节点过载或者浪费资源。

04.分布式系统的衡量指标

◎系统的性能:系统每秒的事务处理能力,通常用TPS(Transactions Per Second)来衡量。

◎系统的可用性:系统在面对各种异常时可以正确提供服务的能力。该指标可以用系统停服的时间与正常服务时间的比例来衡量,也可以用某功能的失败次数与成功次数的比例来衡量。系统的可用性是分布式系统的重要指标,是系统容错能力的体现。

◎系统的可扩展性:分布式系统通过扩展集群的机器规模来提高系统性能(增大接口吞吐量、降低接口延时、增大接口并发量)、存储容量、计算能力的特性。

 

RPC框架

RPC(Remote Procedure Call,远程过程调用)是一种进程间通信方式,也是一种技术思想。使用 RPC 技术时,允许本地程序通过网络调用另一台服务器上的函数或者方法,具体调用过程一般由 RPC 框架实现,不用编码实现。即无论是调用本地函数还是调用远程函数,我们编写的调用代码在本质上基本相同。

01.RPC框架的工作原理

RPC框架要向服务调用方和服务提供方屏蔽各类复杂性操作,比如负载均衡、序列化和反序列化、网络重试、超时等,主要由客户端、服务器端和注册中心3种角色构成,整体架构如图1所示。

一文理解分布式开发中的服务治理

 

◎客户端(Client):调用远程服务的服务消费方。客户端调用远程服务就像调用本地函数一样,客户端负责序列化、反序列化、连接池管理、负载均衡、故障转移、超时管理、异步管理等。

◎服务器端(Server):暴露服务的服务提供方。服务器端如同实现一个本地函数一样来实现远程服务提供,服务器端需要做收发包队列、I/O线程、工作线程、序列化及反序列化等工作。

◎注册中心:服务注册与发现的注册中心。

02.RPC调用说明

一次RPC调用流程主要由5部分组成,分别是客户端、客户端存根、服务器端存根、服务提供端和网络传输,其调用流程如图2所示。

◎客户端:服务调用方。

◎客户端存根:用于存放服务器端的地址信息,将客户端的请求参数等信息打包成网络消息,再通过网络传输发送给服务器端。

◎服务器端存根:接收客户端发送过来的请求消息并解包,然后调用本地服务处理。

◎服务提供端:服务的真正提供者。

◎网络传输:底层数据传输,可以是TCP或HTTP。

一文理解分布式开发中的服务治理

 

服务治理

业务在刚开始时都是单体应用,随着用户量和访问量的增加,在架构层面会发生变化,逐步由单体应用开发转为分布式应用开发,比如把单体应用中的每个模块都按照特定的方法拆分成一组独立的服务,服务与服务之间通过HTTP或者RPC方式调用。随着业务量的逐步增加,服务的数量也逐步增加。这时维护服务的URL地址就变得非常麻烦,所以需要设计一套系统来统一管理每个服务所对应的URL地址。这套系统就叫作注册中心。当有多个服务时,消费者需要根据规则来调用相关服务,实现软负载均衡,以达到资源利用率最大化的目的。因此,服务注册、服务发现、负载均衡、流量削峰、版本兼容、服务熔断、服务降级、服务限流等方面的问题,都是因服务拆分所引发的一系列问题。如何解决这些问题,让服务更稳定地运行,就叫作服务治理。

总体来说,服务治理指的是企业为了确保事情顺利完成而实施的内容,包括最佳实践、架构原则、治理规程、规律及其他决定性的因素。下面针对服务治理过程中的各个环节做相关说明。

(1)服务:它是分布式架构下的基础单元,包括一个或一组软件功能,其目的是不同的客户端通过网络获取相应的数据,而不用关注底层实现的具体细节。以用户服务为例,当客户端调用用户服务的注册功能时,注册信息会被写入数据库、缓存并发送消息来通知其他关注注册事件的系统,但是调用方并不清楚服务的具体处理逻辑。

(2)注册中心:它是微服务架构中的“通讯录”,记录了服务和服务地址的映射关系,主要涉及服务的提供者、服务注册中心和服务的消费者。在数据流程中,服务提供者在启动服务之后将服务注册到注册中心;服务消费者(或称为服务消费方)在启动时,会从注册中心拉取相关配置,并将其放到缓存中。注册中心的优势在于解耦了服务提供者和服务消费者之间的关系,并且支持弹性扩容和缩容。当服务需要扩容时,只需要再部署一个该服务。当服务成功启动后,会自动被注册到注册中心,并推送给消费者。

(3)服务注册与发布:服务实例在启动时被加载到容器中,并将服务自身的相关信息,比如接口名称、接口版本、IP地址、端口等注册到注册中心,并使用心跳机制定期刷新当前服务在注册中心的状态,以确认服务状态正常,在服务终止时将其从注册表中删除。服务注册包括自注册模式和第三方注册模式这两种模式。

◎自注册模式:服务实例负责在服务注册表中注册和注销服务实例,同时服务实例要发送心跳来保证注册信息不过期。其优点是,相对简单,无须其他系统功能的支持;缺点是,需要把服务实例和服务注册表联系起来,必须在每种编程语言和框架内部实现注册代码。

◎第三方注册模式:服务实例由另一个类似的服务管理器负责注册,服务管理器通过查询部署环境或订阅事件来跟踪运行服务的改变。当管理器发现一个新的可用服务时,会向注册表注册此服务,同时服务管理器负责注销终止的服务实例。第三方注册模式的主要优势是服务与服务注册表是分离的,无须为每种编程语言和架构都完成服务注册逻辑。相应地,服务实例是通过一个集中化管理的服务进行管理的;缺点是,需要一个高可用系统来支撑。

(4)服务发现:使用一个注册中心来记录分布式系统中全部服务的信息,以便其他服务快速找到这些已注册的服务。其目前有客户端发现模式和服务器端发现模式这两种模式。

◎客户端发现模式:客户端从服务注册服务中查询所有可用服务实例的地址,使用负载均衡算法从多个服务实例中选择一个,然后发出请求。其优势在于客户端知道可用服务注册表的信息,因此可以定义多种负载均衡算法,而且负载均衡的压力都集中在客户端。

◎服务器端发现模式:客户端通过负载均衡器向某个服务提出请求,负载均衡器从服务注册服务中查询所有可用服务实例的地址,将每个请求都转发到可用的服务实例中。与客户端发现一样,服务实例在服务注册表中注册或者注销。我们可以将HTTP服务、Nginx的负载均衡器都理解为服务器端发现模式。其优点是,客户端无须关注发现的细节,可以减少客户端框架需要完成的服务发现逻辑;客户端只需简单地向负载均衡器发送请求。其缺点是,在服务器端需要配置一个高可用的负载均衡器。

(5)流量削峰:使用一些技术手段来削弱瞬时的请求高峰,让系统吞吐量在高峰请求下可控,也可用于消除毛刺,使服务器资源的利用更加均衡、充分。常见的削峰策略有队列、限频、分层过滤、多级缓存等。

(6)版本兼容:在升级版本的过程中,需要考虑升级版本后新的数据结构能否理解和解析旧的数据,新协议能否理解旧的协议并做出预期内合适的处理。这就需要在服务设计过程中做好版本兼容工作。

(7)服务熔断:其作用类似于家用的保险丝。当某服务出现不可用或响应超时的情况时,已经达到系统设定的阈值,为了防止整个系统出现雪崩,会暂时停止对该服务的调用。

(8)服务降级:在服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略性地降级,以此释放服务器资源,保证核心任务的正常运行。降级时往往会指定不同的级别,面对不同的异常等级执行不同的处理。

(9)服务限流:服务限流可以被认为是服务降级的一种。它通过限制系统的输入和输出流量来达到保护系统的目的。一般来说,系统的吞吐量是可以被测算的。为了保证系统的稳定运行,一旦达到阈值,就需要限制流量。限制措施有延迟处理、拒绝处理或者部分拒绝处理等。

(10)负载均衡策略:它是用于解决一台机器无法处理所有请求而产生的一种算法。当集群里的1台或者多台服务器不能响应请求时,负载均衡策略会通过合理分摊流量,让更多的服务器均衡处理流量请求,不会因某一高峰时刻流量大而导致单个服务器的 CPU或内存急剧上升。

 

本文节选自《架构演变实战:从单体到微服务再到中台》一书,更多精彩内容欢迎阅读本书!



Tags:分布式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: 分布式  点击:(10)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: 分布式  点击:(52)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: 分布式  点击:(50)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03  Search: 分布式  点击:(54)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  Search: 分布式  点击:(63)  评论:(0)  加入收藏
分布式事务框架选择与实践
分布式事务是处理跨多个服务的原子操作的关键概念,而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个常见的分布式事务框架,并讨论它们的使用和实践。1. XA协...【详细内容】
2024-01-05  Search: 分布式  点击:(104)  评论:(0)  加入收藏
分布式场景下的事务机制
事务消息是RocketMQ的一个非常特色的高级特性,它的基础诉求是通过RocketMQ的事务机制,来保证上下游的数据⼀致性。我们在单机版本下面只需要在业务方法上加上对应的事务就可以...【详细内容】
2023-12-26  Search: 分布式  点击:(145)  评论:(0)  加入收藏
分布式存储系统在大数据处理中扮演着怎样的角色?
如果存储节点本身可以定制,则通常会让其支持部分计算能力,以利用数据的亲和性,将部分计算下推到相关的存储节点上。如果存储是云上的 S3 等对象存储,无法定制,则通常会将数据在计...【详细内容】
2023-12-19  Search: 分布式  点击:(49)  评论:(0)  加入收藏
MongoDB与大数据处理:构建高性能分布式数据库
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-18  Search: 分布式  点击:(73)  评论:(0)  加入收藏
聊一聊雪花算法与分布式ID生成
生成全局唯一ID的雪花算法原理雪花算法是一种用于生成全局唯一ID的算法,最初由Twitter开发,用于解决分布式系统中生成ID的问题。其核心思想是将一个64位的长整型ID划分成多个...【详细内容】
2023-12-12  Search: 分布式  点击:(151)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(7)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(20)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(13)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(16)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(12)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(41)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(23)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(125)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(135)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(135)  评论:(0)  加入收藏
站内最新
站内热门
站内头条