微服务保护和分布式事务(3)

米饭6个月前行业资讯357

1.3 请求限流:

在簇点链路后面点击流控按钮,即可对其做限流配置:

image-20241121171200123

在弹出的菜单中填写:

image-20241121171816981

这样就把查询购物车列表这个簇点资源的流量限制在了每秒 6 个,也就是最大 QPS 为 6。


1.4 线程隔离:

限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。


1.4.1 OpenFeign 整合 Sentinel:

application.yml文件,开启 Feign 的 sentinel 功能:

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

然后重启对应微服务,可以看到调用另一个微服务 FeignClient 自动变成了一个簇点资源:

image-20241121184630705

1.4.2 配置线程隔离:

接下来,点击对应微服务接口的 FeignClient 对应的簇点资源后面的流控按钮:

image-20241121185214609

在弹出的表单中填写下面内容:

image-20241121185252386

注意,这里勾选的是并发线程数限制,也就是说这个查询功能最多使用 5 个线程,而不是 5 QPS。如果查询商品的接口每秒处理 2 个请求,则 5 个线程的实际 QPS 在 10 左右,而超出的请求自然会被拒绝。


1.5 服务熔断:

上面使用线程隔离导致了一些问题如下:


第一,超出的 QPS 上限的请求就只能抛出异常,从而导致购物车的查询失败。但从业务角度来说,即便没有查询到最新的商品信息,购物车也应该展示给用户,用户体验更好。也就是给查询失败设置一个降级处理逻辑。


第二,由于查询商品的延迟较高,从而导致查询购物车(购物车接口里面调用商品接口,涉及不同微服务之间的调用)的响应时间也变的很长。这样不仅拖慢了购物车服务,消耗了购物车服务的更多资源,而且用户体验也很差。对于商品服务这种不太健康的接口,我们应该直接停止调用,直接走降级逻辑,避免影响到当前服务。也就是将商品查询接口熔断。


1.5.1 编写降级逻辑:

触发限流或熔断后的请求不一定要直接报错,也可以返回一些默认数据或者友好提示,用户体验会更好。


给 FeignClient 编写失败后的降级逻辑有两种方式:


方式一:FallbackClass,无法对远程调用的异常做处理

方式二:FallbackFactory,可以对远程调用的异常做处理,我们一般选择这种方式。

这里我们演示方式二的失败降级处理。


涉及 ItemClient 接口,该接口是 OpenFeign 客户端。


步骤一:给ItemClient定义降级处理类,实现FallbackFactory:

代码如下:

@FeignClient(value = "item-service",
        configuration = DefaultFeignConfig.class,
        fallbackFactory = ItemClientFallback.class)
public interface ItemClient {
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam Collection<Long> ids);

    @PutMapping("/items/stock/deduct")
    void deductStock(@RequestBody List<OrderDetailDTO> items);

}

// 实现FallbackFactory
@Slf4j
public class ItemClientFallback 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);
                // 查询购物车允许失败,查询失败,返回空集合
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                // 库存扣减业务需要触发事务回滚,查询失败,抛出异常
                throw new BizIllegalException(cause);
            }
        };
    }
}

步骤二:将刚刚创建的实现了 FallbackFactory 接口的实现类,加入到 spring 容器中。

这里我使用方法注解创建。

@Bean
public ItemClientFallback itemClientFallback(){
    return new ItemClientFallback();
}

步骤三:在ItemClient接口中使用ItemClientFallbackFactory

image-20241121191841015

1.5.2 服务熔断:

对于不太健康的接口,我们应该停止调用,直接走降级逻辑,避免影响到当前服务。也就是将商品查询接口熔断。当商品服务接口恢复正常后,再允许调用。这其实就是断路器的工作模式了。


Sentinel中的断路器不仅可以统计某个接口的慢请求比例,还可以统计异常请求比例。当这些比例超出阈值时,就会熔断该接口,即拦截访问该接口的一切请求,降级处理;当该接口恢复正常时,再放行对于该接口的请求。


断路器的工作状态切换有一个状态机来控制:

image-20241121192424546

状态机包括三个状态:


closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到 open 状态。

open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。open 状态持续一段时间后,会进入 half-open 状态。

half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。

请求成功:则切换到 closed 状态。

请求失败:则切换到 open 状态。

我们可以在控制台通过点击簇点后的**熔断**按钮来配置熔断策略:

image-20241121192842541

在弹出的表格中这样填写:

image-20241121192923322

这种是按照慢调用比例来做熔断,上述配置的含义是:

  • RT超过 200 毫秒的请求调用就是慢调用。

  • 统计最近 1000ms 内的最少 5 次请求,如果慢调用比例不低于 0.5,则触发熔断。

  • 熔断持续时长 20s。


  • 本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

    云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

    《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

    想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ

相关文章

Gradle 8.4.0 配置阿里云镜像的详细指南

Gradle 8.4.0 配置阿里云镜像的详细指南

引言Gradle 是一个强大的构建工具,广泛用于自动化构建、测试、发布等过程。然而,由于网络原因,Gradle 默认的 Maven 中央仓库访问速度可能较慢,特别是在中国大陆地区。为了提高依赖下载速度...

【Docker 】深入探索 Docker :高阶操作与配置设置(上)

【Docker 】深入探索 Docker :高阶操作与配置设置(上)

Docker 是现代应用开发和部署的重要工具,能够帮助开发者轻松创建、管理和部署容器化应用。除了基本的命令外,掌握高阶操作和配置设置将大大提高您的工作效率和应用性能。本文将介绍一些 Docker 的高...

Linux 配置MySQL环境(三)

Linux 配置MySQL环境(三)

一、下载1. 官网下载MySQL官网:https://www.mysql.com/进入官网之后点击 DOWNLOADS进入页面 ( 在这里我们选择社区版) ,点击 MySQL Community (G...

微服务保护和分布式事务(5)

微服务保护和分布式事务(5)

2.3 XA 模式:Seata 支持四种不同的分布式事务解决方案:XATCCATSAGA这里我们以XA模式和AT模式来给大家讲解其实现原理。XA 规范是 X/Open 组织定义的分布式事务处理(DTP...

MyBatisPlus从零到一:快速入门与核心功能详解(4)

MyBatisPlus从零到一:快速入门与核心功能详解(4)

三、扩展功能3.1 代码生成插件:在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表...

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境Docker-OSXsickcodes/Docker-OSX: Docker-OSX 项目尝试通过 Docker 容...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。