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

米饭5个月前行业资讯207

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

相关文章

Linux 安装Docker完整教程(六)

Linux 安装Docker完整教程(六)

背景近些年随着云原生的发展,Docker在云原生中的作用使得它也蓬勃发展起来。今天这篇文章就带大家一起实现一下在Linux操作系统下Docker的部署过程,收藏起来,以备不时之需。当然,如果对Dock...

Linux第一个小程序——进度条实现

Linux第一个小程序——进度条实现

前言我们之前学习过vim编辑器、gcc/g++的使用和make/makefile工具,所以今天我们就可以使用它们创建Linux上第一个小程序——进度条。在实现进度条之前我们首先需要补充两个小知识。1....

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

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

一、微服务保护保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。为了方便讲解,下面的商品服务是故障方,购物车服务是故障调用方。1.1 微服务保护方案:微服务保护的方案有很多,比如:请...

【网络】NAT、代理服务、内网穿透(2)

【网络】NAT、代理服务、内网穿透(2)

2.代理服务器代理服务器(Proxy Server)的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理。(1)正向代理正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并...

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

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

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

Linux 中通过 cpulimit 限制服务的CPU占用率

Linux 中通过 cpulimit 限制服务的CPU占用率

通常做资源限制有多种方法,比如用 CGroup 方法、system-run等,cpulimit 只是其中的一种方式。安装sudo apt update sud...

发表评论    

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