• 微服务保护


    微服务保护

    雪崩问题:微服务调用中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩

    解决雪崩问题的常见方式有四种:

    超时处理:设定超时事件,请求超过一定时间没有响应就返回错误消息,不会无休止等待(但是当释放的速度没有请求的速度快则还是会引发雪崩)

    舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离

    熔断降级:由断路器统计业务执行的异常比例:如果超出阈值则会熔断该业务,拦截访问该业务的一切请求

    流量控制:限制业务访问的QPS,避免服务因流量过高而故障(预防雪崩)

    初识Sentinel

    官方网站:home (sentinelguard.io)

    下载:sentinel-dashboard-1.8.1.jar

    安装到非中文目录

    运行:java -jar sentinel-dashboard-1.8.1.jar

    打开浏览器访问:localhost:8080

    账号密码都是sentinel

    如果要修改Sentinel的默认端口

    java -jar sentinel-dashboard-1.8.1.jar --server.port=8090

    微服务整合Sentinel

    例子:使用之前的项目cloud-demo

    1、引入依赖:

    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-sentinel
    
    
    • 1
    • 2
    • 3
    • 4

    2、配置地址

    cloud:
     sentinel:
       transport:
         dashboard: localhost:8090 #sentinel控制台地址
    
    • 1
    • 2
    • 3
    • 4

    3、多次访问order-service返回控制台查看

    在这里插入图片描述

    限流规则

    设置QPS不能超过5

    在这里插入图片描述

    使用:Jmeter测试每秒发送10个请求

    在这里插入图片描述

    流控模式

    在添加限流规则时,点击高级选项,可以选择三种流控模式:

    • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
    • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
    • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

    流控模式-关联

    使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流

    案例:添加接口

    @GetMapping("/query")
    public String queryOrder(){
        return "查询订单成功";
    }
    @GetMapping("/update")
    public String updateOrder(){
        return "修改订单成功";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当update的QPS超过5时,对queue做限流

    在这里插入图片描述

    在这里插入图片描述

    此时update没有影响,而queue受到影响

    流控模式-链路

    例如有两条请求链路:

    • /test1 ->/common
    • /test2 ->/common

    只希望统计从/test2进入到/common的请求

    案例:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流

    在OrderService中添加方法

    public  void queryGoods(){
        System.out.println("查询商品");
    }
    
    • 1
    • 2
    • 3
    @GetMapping("/query")
    public String queryOrder(){
        orderService.queryGoods();
        System.out.println("查询订单");
        return "查询订单成功";
    }
    @GetMapping("/save")
    public String saveOrder(){
        orderService.queryGoods();
        System.out.println("新增订单");
        return "查询订单成功";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这样就形成了两条链路

    Sentinel默认只标记Controlller中的方法为资源,如果要标记其他方法,需要利用注解@SentinelResource

    @SentinelResource("goods")
     public  void queryGoods(){
         System.err.println("查询商品");
     }
    
    • 1
    • 2
    • 3
    • 4

    Sentinel默认会将Controlller方法做context整合,导致链路模式失效,需要修改配置文件

    sentinel:
      transport:
        dashboard: localhost:8090 #sentinel控制台地址
      web-context-unify: false  #关闭context整合
    
    • 1
    • 2
    • 3
    • 4

    给good添加流控规则

    在这里插入图片描述

    设置每秒发送4个请求

    query中受到限制只能有2个请求

    在这里插入图片描述

    流控效果

    流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

    快速失败:达到阈值后,新的 请求会被立即拒绝并抛出FlowException异常。是默认的处理方式

    warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。

    排队等待:让所有请求按照先后次序排队执行,两个请求的间隔不能小于指定时长

    warm-up

    给order-service添加warm-up
    在这里插入图片描述

    排队等待

    QPS=5,意味着每200ms处理一个队列的请求,timeout=2000ms,意味着预期等待超过2000ms的请求会被拒绝

    给/order/{order}这个资源设置QPS为10,最大等待时间为5秒
    在这里插入图片描述

    热点参数限流

    之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值

    案例:给/order/{orderId}这个资源添加热点参数限流,规则如下:

    默认的热点参数规则是每1秒请求量不超过2

    给102这个参数设置例外:每1秒请求量不超过4

    给103这个参数设置例外:每1秒请求量不超过10

    热点参数限流对默认的SpringMVC资源无效

    需要使用 @SentinelResource注解

    @SentinelResource("hot")
     @GetMapping("{orderId}")
     public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
         // 根据id查询订单并返回
         return orderService.queryOrderById(orderId);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

  • 相关阅读:
    【Java学习】JDK安装及第一个java程序
    redis 持久化
    11-Go基础:接口
    centos 安装多个版本的php并切换
    云端智享——记移动云手写docker-demo
    slam学习
    cmmi3认证需要企业具备什么条件?
    猿创征文|2022年快过完了,是时候总结一下那些优秀的 React 组件库
    SpringMVC07-RESTful
    【无标题】
  • 原文地址:https://blog.csdn.net/qq_57907966/article/details/126578884