• Spring Cloud Alibaba-Sentinel之限流、熔断(2)


    考虑充值是一项重要的功能,通常不希望因为查询余额接口调用过于频繁而导致充值功能不可用,现在引入Sentinel对payment-service服务的/balance接口做限流保护。

    一、限流

    在上一节payment-service代码上增加依赖:

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                <version>${alibaba.version}</version>
            </dependency>
     
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
                <version>1.6.0</version>
            </dependency>
    

    在bootstrap.yml中增加Sentinel的数据源设置:

    spring:
      application:
        name: payment-service
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
          discovery:
            server-addr: 127.0.0.1:8848
        sentinel:
          datasource:
            ds1:
              nacos:
                server-addr: 127.0.0.1:8848
                dataId: ${spring.application.name}-flow-rules
                data-type: json
                rule-type: flow
    

    其中,数据源名称ds1任意设置即可。这里使用Nacos作为数据源,所以名称的下一级属性设置为nacos。

    接下来按dataId在Nacos中创建配置

    dataId:payment-service-flow-rules
    格式:JSON
    内容:

    [
      {
        "resource": "protected-resource",
        "controlBehavior": 2,
        "count": 1,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0
      }
    ]
    

    修改PaymentController

    在getBalance方法上增加注解:

    @SentinelResource(value = "protected-resource", blockHandler = "handleBlock")
    

    添加一个handleBlock方法,要求参数与getBalance保持一致,并且在最后增加一个BlockException参数

        public Balance handleBlock(Integer id, BlockException e) {
            return new Balance(0, 0, 0, "限流");
        }
    

    在限流设置中,grade=1表示基于QPS/并发数做流量控制,count=1表示阈值为1,即QPS超过1触发。controlBehavior=0表示处理策略是直接拒绝。

    重启payment-service,在浏览器中打开http://localhost:8082/pay/balance?id=1并迅速刷新,可以看到一部分的请求返回数据为handleBlock方法的返回值。

    在Nacos中把count值改为1000,继续快速刷新浏览器,可以观察到不会再触发限流。

    限流设置的主要参数:

    参数 含义 选项
    grade 限流阈值类型

    0 基于线程数

    1 基于QPS

    count 限流阈值  
    controlBehavior QPS流量控制中对超过阈值的流量处理手段

    0 直接拒绝

    1 Warm Up

    2 匀速排队

    strategy 调用关系限流策略

    0 根据调用方限流(limitApp)

    1 根据调用链路入口限流

    2 具有关系的资源流量控制

    limitApp 调用来源 default 不区分调用者
    {some_origin_name} 针对特定的调用者
    other 针对除 {some_origin_name} 以外的其余调用方

    匀速排队模式演示:

    把controlBehavior设置为2,即匀速排队模式,同时增加一个参数maxQueueingTimeMs值为20000。再次快速刷新浏览器观察影响。

    Sentinel控制台

    Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。
    下载地址

    https://github.com/alibaba/Sentinel/releases

    启动

    java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel -jar E:sentinel-dashboard-1.8.1.jar
    

    如果我们需要修改端口,其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。需要注意,我们启动的时候需要使用绝对路径来启动

    使用
    http://localhost:8718/
    (用户名和密码都是sentinel)

    修改登录信息

    https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0#%E9%89%B4%E6%9D%83

    如果需要自定义登录用户名和密码等信息可以参考上面的文档;

    用户可以通过如下参数进行配置:

    -Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;
    -Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;
    -Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
    我们可以下载到源码包,修改相应的配置。

    修改payment-service的bootstrap.yml

    spring:
      application:
        name: payment-service
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
          discovery:
            server-addr: 127.0.0.1:8848
        sentinel:
          eager: true
          transport:
            dashboard: localhost:8718
          datasource:
            ds1:
              nacos:
                server-addr: 127.0.0.1:8848
                dataId: ${spring.application.name}-flow-rules
                data-type: json
                rule-type: flow
    

    重启应用后在Sentinel控制台中可以看到相关信息

    二:熔断

     限流从服务生产者角度考虑,使用Sentinel对服务做了限流保护,那么从消费者角度上,需要考虑另一种情况。

    假设在用户登录时,为了简化客户端处理,account服务的登录接口在处理成功后会调用payment服务查询余额接口获得余额信息一并返回给客户端。当payment服务严重卡顿时,我们希望登录接口不会被拖慢,而是快速失败并降级。来看看Sentinel是如何解决的。

    消费方应用account-service为基础,首先添加依赖:

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                <version>${alibaba.version}</version>
            </dependency>
     
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
                <version>1.6.0</version>
            </dependency>
    

    修改bootstrap.yml

    spring:
      application:
        name: account-service
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
          discovery:
            server-addr: 127.0.0.1:8848
        sentinel:
          eager: true
          transport:
            dashboard: localhost:8718
          datasource:
            ds1:
              nacos:
                server-addr: 127.0.0.1:8848
                dataId: ${spring.application.name}-degrade-rules
                data-type: json
                rule-type: degrade
    ribbon:
      ConnectTimeout: 2000
      ReadTimeout: 5000
    feign:
      sentinel:
        enabled: true
    

    在Nacos后台新建配置:

    dataId:account-service-degrade-rules
    格式:JSON
    内容:

    [
      {
        "resource": "GET:http://payment-service/pay/balance",
        "count": 500,
        "grade": 0,
        "timeWindow": 10
      }
    ]
    

      

    以上配置的含义是:

    当资源的平均响应时间超过阈值500毫秒之后,资源进入准降级状态。如果接下来1秒内持续进入5个请求的RT都持续超过这个阈值,那么在接下的时间窗口(timeWindow)之内,对这个方法的调用都会自动地熔断。

    接下来修改Nacos中配置项payment-service-dev.properties的sleep值,修改为1000,让/pay/balance接口响应前先挂起1秒钟来模拟服务器卡顿情况。

    分别启动两个服务,用浏览器打开http://localhost:8081/acc/user?id=1并连续刷新6次以上。可以观察到,从第7次开始接口不再等待1秒后返回,而是快速返回降级后的信息。

    降级策略

    grade 说明 count
    0 平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值之后,资源进入准降级状态。如果接下来1s内持续进入5 个请求的RT都持续超过这个阈值,那么在接下的时间窗口之内,对这个方法的调用都会自动地熔断 单位ms, 上线4900
    2 异常比例:当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态 0.0-1.0
    3 异常数:当资源近1分钟的异常数目超过阈值之后会进行熔断  
  • 相关阅读:
    基于vue2.0 +vuex+ element-ui后台管理系统:包括本地开发调试详细步骤
    require.js实现js模块化编程(二):RequireJS Optimizer
    require.js实现js模块化编程(一)
    树型权限管理插件:jQuery Tree Multiselect详细使用指南
    表格组件神器:bootstrap table详细使用指南
    后台管理系统中的重点知识大全
    Ajax最详细的参数解析和场景应用
    npm常用命令小结
    详解javascript,ES5标准中新增的几种高效Object操作方法
    git入门学习(二):新建分支/上传代码/删除分支
  • 原文地址:https://www.cnblogs.com/h-z-y/p/14525379.html
Copyright © 2020-2023  润新知