赞
踩
Spring Cloud 是一系列框架的有序集合,利用 Spring Boot 的开发便利性简化分布式系统基础设施开发,可一键启动和部署。
早期的 Spring Cloud 五大组件:
随着 Spring Cloud Alibaba 在国内兴起,项目中可能使用的组件有:
总结:Eureka 采用 AP 方式,Nacos 默认是 AP 模式,可以采用 CP 模式。
@EnableFeignClients
注解开启对 Feign Client 扫描加载处理,定义接口并加@FeignClient
注解。@FeignClients
注解的类信息注入 Spring IOC 容器。在分布式系统中,服务可能失败导致雪崩,Hystrix 是防雪崩利器,具有服务降级、服务熔断、服务隔离、监控等防止雪崩的技术。Hystrix 有四种防雪崩方式:
项目中使用 Hystrix 实现的断路器默认关闭,开启需在引导类上添加@EnableCircuitBreaker
注解。
断路器状态机有三个状态:
在大型互联网项目中,某个服务宕机时,调用该服务的其他服务也会宕机,微服务之间调用互通,导致服务不可用逐步扩大,使整个项目服务宕机崩溃。
你们项目中有没有做过限流 ? 怎么做的 ?
从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。
限流算法区别
2. 参考回答
在我们的项目中,由于流量较大,采用了令牌桶算法进行限流,该限流操作在 gateway 中进行设置。令牌桶就如同一个存放固定容量令牌的容器,按照固定速率 r 不断地往桶里添加令牌。桶中最多可存放 b 个令牌,一旦桶满,新添加的令牌就会被丢弃。当有请求到达时,会尝试从桶中获取令牌。若能获取到令牌,则继续处理请求;若没有令牌可获取,请求则会排队等待或者直接被丢弃。与漏桶算法不同,漏桶算法的流出速率恒定,而令牌桶算法的流出速率有可能大于 r,这意味着对于突发流量,令牌桶算法也能够有效应对。
具体而言,我们在网关路由中进行过滤器配置,以此来设置桶的容量大小以及令牌的固定生成速率。同时,为了更加精准地进行限流控制,我们通常会按照用户访问的 IP 进行限制。由于令牌的存储和管理需要高效且可共享,所以我们将令牌存入 Redis 中,这也使得项目需要集成 Redis 使用。通过这样的方式,我们能够有效地应对项目中的大流量请求,确保系统的稳定运行。
你们项目的配置文件是怎么管理的 ?
大部分固定配置文件放在服务本地,环境不同可能变化的部分放到 Nacos 中,Nacos 存放各个微服务共享的、需动态变更的配置。
在分布式系统中,一个业务因跨越不同数据库或不同微服务而包含多个子事务,要求所有子事务同时成功或失败,这就是分布式事务。
例如某电商系统下单操作,需请求订单服务、账户服务、库存服务。订单生成后,分别请求账户服务扣减余额和库存服务扣减库存。若后续操作出现问题导致订单生成失败,但账户余额和库存已扣减成功,这就出现了问题,而分布式事务就是解决此类不一致问题的。
一个应用的某个功能需操作多个库,不同库存储不同业务数据。
当一个库数据量较大或预期未来数据量大时,会进行水平拆分即分库分表。例如将数据库 B 拆分为两个库,对于分库分表情况,开发人员通常使用数据库中间件降低 SQL 操作复杂性。如一条单库语法的 SQL,在分库后需改写为多条 SQL 分别插入不同分库,此时要保证所有分库操作要不都成功,要不都失败,所以数据库中间件面临分布式事务问题。
一个应用的某个功能需调用多个微服务实现,不同微服务操作不同的数据库。例如 Service A 完成某个功能需直接操作数据库,同时调用 Service B 和 Service C,而 Service B 操作两个数据库,Service C 操作一个数据库,需保证这些跨服务对多个数据库的操作要不都成功,要不都失败,这是典型的分布式事务场景。
CAP 定理由加州大学伯克利分校 Eric Brewer 教授提出,指出 WEB 服务无法同时满足以下三个属性:
更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(强一致性),不能存在中间状态。
系统提供的服务必须一直处于可用状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
对于分布式系统,各节点之间存在网络交互。网络存在延迟且无法 100%确保可用,所以分区网络故障不可避免。在此条件下,要保证各节点一致性,就必须在一个节点数据变更时将数据同步给另一个节点,而在数据同步过程中,被同步的节点不能对外提供服务,否则会出现数据不一致,这就违背了可用性。所以在存在系统分区的场景下,可用性和一致性无法同时满足。
CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸,核心思想是即使无法做到强一致性,但应用可以采用适合的方式达到最终一致性。其思想包含三方面:
分布式系统在出现不可预知的故障时,允许损失部分可用性,但不等于系统不可用。
允许系统中的数据存在中间状态,认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
强调系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。其本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
上面的三种分布式事务的解决方案适用于对数据一致性要求很高的场景。适用于对数据强一致性要求不高但要求数据最终一致的场景。例如在支付系统中,常使用基于 MQ 实现的分布式事务解决方案。以借呗借钱为例,借呗审核通过后同步生成借款单,借款单生成后向 MQ 发送消息通知支付宝转账,支付宝读取 MQ 消息并增加账户余额。最复杂的是保障本地事务和 MQ 消息发送在同一个事务中执行,若中途操作发生异常,如支付宝余额增加发生问题,需人工解决,事故概率极低。
**例题: **
向借呗申请借钱,借呗审核通过后支付宝的余额才会增加,但借呗和支付宝有可能不是同一个系统,这时候如何实现事务呢?实现方案如下图:
执行流程如下:
在上述流程中,最为复杂的部分实际上是如何确保步骤 2 和步骤 3 在同一个事务中执行,也就是实现本地事务和 MQ 消息发送在同一个事务中。只有在借款结束后,借呗的数据处理才算完成,此时支付宝才能读取到消息并执行余额增加操作,从而完成整个流程。
然而,如果在中途操作发生异常,例如支付宝余额增加出现问题,目前并没有特别好的自动解决办法,通常需要人工进行干预解决。虽然这种事故发生的概率极低,但在设计系统时也需要考虑到这种情况的存在,并制定相应的应急预案和人工处理流程,以确保在出现问题时能够及时有效地进行处理,保障系统的稳定性和数据的准确性。
Seata 事务管理中有三个重要角色:
维护全局和分支事务的状态,协调全局事务提交或回滚。
定义全局事务的范围、开始全局事务、提交或回滚全局事务。
管理分支事务处理的资源,与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
分为两个阶段:
接收 TC 指令,提交或回滚事务。
XA 模式牺牲了可用性,保证了强一致性。
AT 模式牺牲了一致性,保证了可用性。
TCC 模式与 AT 模式非常相似,每阶段都是独立事务,不同的是 TCC 通过人工编码来实现数据恢复。需要实现三个方法:
Seata 中的 tcc 模型执行流程如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。