服务保护、分布式事务

81 阅读4分钟

服务雪崩问题

服务雪崩是指在微服务架构中,当某个服务出现故障或响应缓慢时,会导致依赖该服务的其他服务也出现故障,进而引发一系列连锁反应,最终导致整个系统崩溃的现象。

产生原因

  • 高并发请求:大量请求同时访问某个服务,可能导致该服务过载,进而引发雪崩。
  • 资源不足:服务器资源有限,无法处理过多请求,导致服务响应缓慢甚至崩溃。

解决方案

利用阿里巴巴开源的sentinel流控组件,实现服务限流、熔断、降级等多种服务保护功能。

1. 服务降级

降级是指当某个服务出现故障时,提供一个简化或者默认的响应,来代替正常的服务调用,保证核心业务不受影响。

feign使用sentinel是实现服务降级

feign接口实现降级

1.1. 引入sentinel依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

1.2. 开启feign对sentinel的支持

feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

1.3. 为FeignClient编写失败后的降级逻辑

@Slf4j
@Component
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);
                cause.printStackTrace();
                // 查询购物车允许失败,查询失败,返回空集合
    return CollUtils.emptyList();
            }
    
            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("远程调用ItemClient#deductStock扣减库存失败,参数:{}",items,cause);
            }
        };
    }
}

1.4. feign接口配置fallbackFactory

@FeignClient(name="item-service",path = "/items",fallbackFactory = ItemClientFallbackFactory.class)
非feign接口实现服务降级

使用@SentinelResource注解实现。

@ApiOperation("查询购物车列表")
@SentinelResource(value = "queryMyCarts", fallback = "queryMyCartsFallback", blockHandler = "queryMyCartsBlockHandler")
@GetMapping
public List<CartVO> queryMyCarts(){

    return cartService.queryMyCarts();
}
//当发生非限流非熔断异常走此方法
public List<CartVO>  queryMyCartsFallback(Throwable throwable){
    log.error("非限流、非熔断异常执行的降级方法,throwable:",  throwable);
    return new ArrayList<>();
}
//当发生熔断、限流走此方法
public List<CartVO>  queryMyCartsBlockHandler( BlockException blockException){
    log.error("触发限流、熔断时执行的降级方法,blockException:",  blockException);
    return new ArrayList<>();
}

2. 服务熔断

熔断是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

熔断配置可直接通过sentinel面板进行配置,配置完即刻生效。

3. 服务限流

通过限制单位时间内访问服务的请求数量,防止服务过载。

限流配置可直接通过sentinel面板进行配置,配置完即刻生效。

分布式事务

分布式事务场景:

跨数据源完成一次事务:业务数据分布在多个数据库,一次事务操作需要跨多个数据库去完成,需要由多个服务远程调用协作去完成,远程调用依赖网络,由于网络问题会导致整体事务不能正常完成。 跨服务完成一次事务:用的一个数据库,但是跨服务通过远程调用去完成一次事务。

CAP理论

CAP理论的核心是:在分布式系统中,无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个需求,最多只能同时满足其中的两个。因此,分布式系统的设计者需要根据系统的实际需求和场景,权衡这三者之间的取舍。

  • Consistency(一致性) :所有节点在同一时间的数据是一致的。例如,当一个客户端对数据进行了更新操作,那么之后所有客户端对该数据的读取都会得到最新的值。
  • Availability(可用性) :每个请求都能得到响应,系统始终可用。即使部分节点出现故障,系统仍然能够对外提供服务。
  • Partition tolerance(分区容错性) :系统在遇到网络分区(即网络故障导致部分节点之间无法通信)的情况下,仍然能够继续运行。

CP:强调数据一致性。

AP:强调可用性,允许出现短暂不一致,最终达到数据一致性。

Seata

seata AT工作原理:

1、TM通知TC,开启全局事务。TC记录全局事务开启状态; 2、TM通知RM,开始执行分支事务。RM向TC注册分支事务; 3、RM执行自己的业务,并提交事务。同时在提交前后向unlog记录日志; 4、RM向TC汇报自己的事务执行成功或失败的状态状态; 5、TM通知TC,提交或回滚全局事务。TC检查全局事务中每个分支事务的状态,由TM统一提交或回滚事务; 6、提交:每个RM删除unlog表数据;回滚:每个RM根据unlog中的数据,执行反向操作。最后删除unlog数据。

image.png