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

米饭3个月前行业资讯144

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

相关文章

docker配置国内镜像加速

docker配置国内镜像加速

docker配置国内镜像加速由于国内使用docker拉取镜像时,会经常出现连接超时的网络问题,所以配置Docker 加速来使用国内的镜像加速服务,以提高拉取 Docker 镜像的速度。1、备...

【Docker 】提升开发效率的 Docker 实践技巧

【Docker 】提升开发效率的 Docker 实践技巧

在现代软件开发中,Docker 已成为重要的工具之一。本文将介绍如何利用 Docker 的构建缓存、自定义镜像、私有镜像仓库,以及环境变量来优化开发流程。一、构建缓存合理安排 Dockerfile 中...

Docker——Windows版本Docker安装

Docker——Windows版本Docker安装

一、简介一、简介  1.1 Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像Docker应用运行在...

Docker: ubuntu系统下Docker的安装

Docker: ubuntu系统下Docker的安装

安装依赖操作系统版本Ubuntu Kinetic 22.10Ubuntu Jammy 24.04 (LTS)Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LT...

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

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

1.2 Sentinel:微服务保护的技术有很多,但在目前国内使用较多的还是 Sentinel,所以接下来我们学习 Sentinel 的使用。1.2.1 介绍和安装:Sentinel 是阿里巴巴开源的...

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(3)

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(3)

3.5 声明交换机和队列:在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时,队列和交换机是程序员定义的,将来项目上线,又要交给运维去创建。那么程序员就需要把程序中运行的所有...

发表评论    

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