CAP 定理
- 在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
- 虽然 CAP 理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择 P(分区容忍)要素,因为网络本身无法做到 100% 可靠,有可能出故障,所以分区是一个必然的现象。如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入,当有写入请求时,系统返回 error(例如,当前系统不允许写入),这又和 A 冲突了,因为 A 要求返回 no error 和 no timeout。因此,分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构
BASE 理论
- Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。
- Soft state(软状态):允许系统中存在中间状态,这个状态不影响系统可用性,这里指的是CAP中的不一致。
- Eventually consistent(最终一致性):最终一致是指经过一段时间后,所有节点数据都将会达到一致。
- BASE 是对CAP 中 AP 方案的一种补充。在 BASE 中用软状态和最终一致,保证了延迟后的一致性。BASE 和 ACID 是相反的,ACID 是一种强一致性模型,而 BASE 却是牺牲这种强一致性,允许数据短时间内不一致,最终一致性。
TCC 事务
Trying:
- 完成所有业务检查(一致性)
- 预留必须业务资源(准隔离性)
Confirm:
- 真正执行业务
- Confirm操作要满足幂等性
Cancel:
- 释放Try阶段预留的业务资源
- Cancel操作要满足幂等性
Eureka 自我保护机制
- 如果Eureka在指定时间没有收到client的心跳时,server就会剔除这个节点,但是有时候由于网络,会造成大部分节点都出现心跳接收过慢,所以Eureka自我保护机制就是,当在15分钟内85%以上的client 都没有正常收到心跳时,server就会认为是出现了网络故障,不会移除client,仍然接收新服务注册,只不过不会同步到其它节点。而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
Ribbon 负载均衡
- 是进程内LB(负载均衡)
- IRule:根据特定算法获取一个访问服务
OpenFeign 服务接口调用
- 使调用服务更加简单,更加符合面向接口调用,让调用像调用本地服务一样
- 默认继承了Ribbon负载均衡器
- 可以配置调用超时时间
服务雪崩
- 微服务调用链路上,某个服务挂掉之后导致级联故障,影响到整个应用的其它模块,导致雪崩
Hystrix
- 处理分布式系统的延迟和容错,当某个服务故障时,返回给调用者一个预期的结果,避免发生雪崩
- 核心功能
- 服务降级
- 服务熔断
- 服务健康实时监控
- 服务降级
- 不让客户端等待,返回预先定义好的返回结果(fallback)
- 触发情况
- 程序运行异常
- 超时
- 服务熔断触发降级
- 线程池、信号量打满也会触发
- 服务熔断
- 直接拒绝访问,放回降级方法定义的返回结果
- 服务降级 -》 服务熔断 -》 回复调用链路
- 服务限流: 限制QPS
- 熔断时机
- 请求次数超过峰值
- 超时时间
- 失败率
- 熔断一段时间后,熔断器会处于半开状态,会放入一部分请求,如果成功,则会关闭断路器
Gateway 网关
- 主要功能
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
- 核心概念
- 路由:是网关的基本模块,它记录着服务的ID、URL等,通过一系列的断言和过滤器匹配路由
- 过滤器
- 工作流程
- 客户端发起请求,通过负载均衡到达对应的网关,然后通过Gateway Handler Mapping中找到请求匹配的路由,发送到对用的Handler,Handler在通过指定的过滤器链最终将请求发送到我们的目标服务器
- 核心逻辑:路由转发 + 执行过滤链
SpringCloud Confg 配置中心
- 依赖GitHub 实现配置云存储,但每次配置变更需要依赖健康检测接口进行手动刷新,才能更新配置
SpringCloud Bus 消息总线
- 由于每次修改配置中心的配置之后都需要手动刷新,所以通过消息总线借助消息队列的广播模式,通知所有服务更新配置
SpringCloud Stream
- 屏蔽底层消息中间件的差异,统一消息的编程模型
分布式事务
- 2阶段提交(2PC)
- 协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待答复
- 各参与者执行事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)
- 如参与者执行成功,给协调者反馈同意,否则反馈中止
- 3PC
- 在协调者和参与者中都引入超时机制
- 增加预提交步骤,保证了在最后提交阶段之前各参与节点的状态是一致的。
- PreCommit只记录日志不提交事务
- TCC(事务补偿)
- TCC 事务机制以初步操作(Try)为中心的,确认操作(Confirm)和取消操作(Cancel)都是围绕初步操作(Try)而展开
- Try 阶段中的操作,其保障性是最好的,即使失败,仍然有取消操作(Cancel)可以将其执行结果撤销。
- 本地消息表
- 主动事务方会把事务信息记录到本地消息列表,再通过消息中间推送给被动事务方
- MQ事务方案(可靠消息事务)
- 是对本地消息表的进一步封装
- Seata
- 提供了 AT、TCC、SAGA 和 XA 事务模式
- 核心组件
- TC(Transaction Coordinator):事务协调者。管理全局的分支事务的状态,用于全局性事务的提交和回滚。
- TM(Transaction Manager):事务管理者。用于开启、提交或回滚事务。
- RM(Resource Manager):资源管理器。用于分支事务上的资源管理,向 TC 注册分支事务,上报分支事务的状态,接收 TC 的命令来提交或者回滚分支事务。
