Spring Cloud Alibaba整合Sentinel,使用nacos持久化流控规则

  • Post author:
  • Post category:其他


一、引入依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

二、在nacos中创建限流配置,Data ID和Group都可以自己随便写,配置格式我使用json

各配置项含义如下:

https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

Field 说明 默认值
resource 资源名,资源名是限流规则的作用对象
count 限流阈值
grade 限流阈值类型,QPS 模式(1)或并发线程数模式(0) QPS 模式
limitApp 流控针对的调用来源
default

,代表不区分调用来源
strategy 调用关系限流策略:直接、链路、关联 根据资源本身(直接)
controlBehavior 流控效果(直接拒绝/WarmUp/匀速+排队等待),不支持按调用关系限流 直接拒绝
clusterMode 是否集群限流

三、在nacos中创建熔断降级配置,和限流的一样Data ID和Group都可以自己随便写,配置格式使用json

但是配置参数是不一样的,具体含义如下:

Field 说明 默认值
resource 资源名,即规则的作用对象
grade 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例
count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow 熔断时长,单位为 s
minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5
statIntervalMs 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms
slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

四、在application.yml中配置读取nacos信息,配置详细可以看注释

server:
  port: 8083  #服务端口
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  #nacos服务地址
    sentinel:
      transport:
        dashboard: 127.0.0.1:8949 #sentinel dashboard地址
      datasource:
        flowDB:      #名称随意取
          nacos:
            server-addr: 127.0.0.1:8848   #nacos地址
            data-id : sentinel            #nacos配置中设置的data-id
            group-id: DEFAULT_GROUP       #nacos配置中设置的group-id
            data-type: json               #nacos配置中设置的数据类型
            rule-type: flow               #指定为限流规则
        degradeDB:
          nacos:
            server-addr: 127.0.0.1:8848
            data-id: sentinel-degrade
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: degrade            #指定为熔断降级规则
  application:
    name: stock-server #服务命称

五、全局流控异常返回处理

@Component
public class SentinelConfig implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        Map map = new HashMap();
        if(e instanceof FlowException){
            map.put("code","900");
            map.put("msg","你被流控了!");
        }else if(e instanceof DegradeException){
            map.put("code","901");
            map.put("msg","你被降级了!");
        }else{
            map.put("code","902");
            map.put("msg",e.getMessage());
        }
        httpServletResponse.setHeader("content-type","application/json;charset=UTF-8");
        PrintWriter writer = httpServletResponse.getWriter();
        writer.print(map);
        writer.flush();
        writer.close();
    }
}

六、逻辑代码

  
    @RequestMapping("reduce")
    public String reduce(){
        return "库存减一 "+dateFormat.format(new Date());
    }

 
    @RequestMapping("reduce1")
    public String reduce1(@RequestParam("orderId")String orderId){
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "orderId="+orderId+",库存减一 "+dateFormat.format(new Date());
    }

七、访问访问后,可以在sentinel控制台看到我们在nacos中配置的流控、熔断规则已经配置好了,但是存在的一个问题就是,在sentinel控制台修改规则后,nacos不会更新,即下次启动sentinel还是读取nacos中的配置,而不是修改后的。要解决这个问题,就需要修改源码了。



版权声明:本文为chenguixu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。