> 活动地址:CSDN21天学习挑战赛
分布式开发就需要知道什么是分布式系统,分布式系统直接如何通过RPC方式通信,服务治理解决那些问题?(学习《架构演变实战:从单体到微服务再到中台》)
1、分布式系统
分布式系统可用理解为通过网络连接让多台计算机协同解决单台计算机所不能解决的计算、存储问题,多台计算机之间通过RPC方式进行通信。
通过使用多台计算机分布式解决单台计算机的问题,需要让分布式系统中的每台计算机解决原问题的一个子集,这时需要使用横向拆分法或纵向拆分法对复杂的系统进行拆分。
- 横向拆分:在无状态系统中多部署几个实例,通过负载均衡方式协调每个实例所负载的计算量。
- 纵向拆分:将一个大应用拆分为多个小应用,每个小应用负责处理一部分业务。如将电商系统拆分为用户、商品、订单服务。
虽然通过拆分解决了计算和存储的问题,但使用分布式开发会引发比单体应用更多的问题,如网络异常、数据一致性及分布式系统的性能等。
为了解决分布式系统中的问题,出现了副本概念。分布式系统副本是为分布式系统中的数据或服务提供冗余,一种是服务副本,另一种是数据副本。
- 服务副本:多个节点提供某种相同的服务,这种服务不依赖本地节点的存储状态,是一种无状态服务。分布式系统种服务副本非常容易控制,由于服务本身具备无状态特性,运维人员可以动态增加或减少服务副本的数量,而不会影响服务。
- 数据副本:在不同节点上持久化同一份数据,当出现某一个节点存储的数据丢失了,可用从其他副本节点上读取数据,数据副本是分布式系统种解决数据丢失的唯一方法,但是数据副本需要被分散或复制到不同的节点上,所以如何保证各节点之间数据的一致性是一个巨大挑战。
数据的一致性分为如下
- 强一致性:任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据;
- 弱一致性:系统并不保证进程或线程在任何时刻访问数据都会返回最新更新成功的数据;
- 最终一致性:数据一旦更新成功,各个副本上的数据最终将达到完全一致的状态,但需要一定的时间。
在分布式开发时,需要遵循的设计原则如下
- 异构性:由于分布式系统基于不同的网络、操作系统、硬件和语言,因此必须考虑采用一种通用的网络通信协议来屏蔽异构系统之间的差异,一般选择中间件来屏蔽这些差异。
- 并发性:应用分布式系统的目的是更好地共享资源,所以系统中的每个资源在并发环境下都必须是安全的。
- 可扩展性:任何计算机都有可能发生故障,发的故障类型也不尽相同,需要允许发生部分故障,而不影响整个分布式系统的正常使用。
- 数据一致性:需要保证各个节点之间的数据一致性。
- 负载均衡:由于分布式系统是协同工作的系统,为了提高系统的整体效率和吞吐量,必须考虑最大化发挥每个节点的作用,最大化利用每个节点的资源。
分布式系统的衡量指标如下
- 系统的性能:系统每秒的事物处理能力,通过用TPS(Transactions Per Second)来衡量。
- 系统的可用性:系统停服的时间与正常服务的时间的比值,可用性是系统容错能力的体现。
- 系统的可扩展性:通过扩展集群的节点规模来提高系统的吞吐量、并发量、存储量、计算量。
2、RPC框架
RPC(Remote Procedure Call,远程过程调用)是一种进程间通信方式,也是一种技术思想。使用 RPC 技术时,允许本地程序通过网络调用另一台服务器上的函数或者方法,具体调用过程一般由 RPC 框架实现,不用编码实现。即无论是调用本地函数还是调用远程函数,我们编写的调用代码在本质上基本相同。
RPC框架要向服务调用方和服务提供方屏蔽各类复杂性操作,比如负载均衡、序列化和反序列化、网络重试、超时等,主要由客户端、服务端和注册中心3种角色构成
- 客户端:调用远程服务的服务消费方。客户端调用远程服务就像调用本地函数一样,客户端负责序列化、反序列化、连接池管理、负载均衡、故障转移、超时管理、异步管理等。
- 服务端:暴露服务的服务提供方。服务器端如同实现一个本地函数一样来实现远程服务提供,服务器端需要做收发包队列、I/O线程、工作线程、序列化及反序列化等工作。
- 注册中心:服务注册与发现的注册中心。
3、服务治理
业务刚开始是都是单体应用,随着用户量和访问量的增加,架构层面也发生了变化,逐步由单体应用转变为分布式应用开发,如把单体应用的每个模块按照特定的方法拆分成一组独立的服务,服务与服务之间通过HTTP或RPC方式调用。但随着服务的数量增加,维护服务的URL地址就变得非常麻烦,所以需要设计一套系统来管理每个服务所对应的URL地址,出现了注册中心。当有多个服务是,消费者需要根据规则来调用相关的服务,实现软负载均衡,以达到资源最大化利用的目的,出现了负载均衡。还会面临流量削峰、版本兼容、服务熔断、服务降级、服务限流等问题,如何解决这些问题,让服务更稳定运行,就叫做服务治理。
- 服务:分布式架构下的基础单元,包括一个或一组软件功能,器目的是不同客户端通过网络获取相应的数据,而不用关注底层实现的具体细节。
- 注册中心:微服务架构中的“通信录”,记录了服务和服务地址的映射关系,主要涉及服务的提供者,服务注册中心和服务的消费者。在数据流程中,服务的提供者在启动服务之后将服务注册到注册中心,服务消费者在启动时,会从注册中心拉取相关配置,并将器放到缓存中。注册中心的优势在于解耦了服务提供者和服务消费者之间的关系,并且支撑弹性扩容和缩容。
- 服务注册与发布:服务实例在启动时被加载到容器中,并将服务自身的相关信息,包括接口名称、接口路由、IP地址、端口等注册到注册中心,并使用心跳机制定期刷新当前服务在注册中心的状态,以确认服务状态正常,在服务终止时将其从注册表中删除。
- 服务发现:使用一个注册中心来记录分布式系统中全部的信息,以便其他服务快速找到这些已注册的服务,目前有客户端发现模式和服务端发现模式。客户端发现模式是从服务注册服务中查询所有可用服务实例的地址,使用负载均衡算法从多个服务实例中选择一个,然后发出请求。服务端发现模式是客户端通过负载均衡向某个服务提出请求,负载均衡从服务注册服务中查询所有可用服务实例的地址,将每个请求都转发到可用的服务实例中。
- 流量削峰:使用一些计算手段来削弱瞬时的请求高峰,让系统吞吐量在高峰请求下可控,也可用于消除毛刺,使用服务器资源的利用更加均衡充分。常用队列、分层过滤、多级缓存的解决方式。
- 服务熔断:作用类似加用的保险丝,当某服务出现不可用或响应超时的情况,已经达到系统设定的阈值,为了防止整个系统出现崩溃,会暂时停止对该服务的调用。
- 服务降级:在服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略性的降级,一次释放服务器资源,保证核心功能的正常运行。
- 服务限流:服务限流是服务降级的一种,通过限制系统的输入和输出来达到保证系统的目的。一般来说,系统的吞吐量是可用被测算的,为了保证系统的稳定运行,一旦达到阈值,就需要限制流量。限制措施有延迟处理,拒绝处理等。
- 负责均衡:用于解决一台机器无法处理所有请求而产生的一种算法,当集群李的一台或多台机器不能响应请求时,负载均衡策略会通过合理分摊流量,让更多的机器均衡处理流量请求,不会因某一高峰时刻流量大而导致某太机器宕机。