Sentinel官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html
注解支持,必看:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
下载Sentinel:https://github.com/alibaba/Sentinel/releases
sentinel控制台文档:https://sentinelguard.io/zh-cn/docs/dashboard.html
参考:https://www.cnblogs.com/ralgo/p/14152390.html
启动Sentinel命令:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar E:\download\sentinel-dashboard-1.8.8.jar
可以自由指定Sentinel端口,不指定直接启动默认就是8080,命令:java -jar E:\download\sentinel-dashboard-1.8.8.jar
浏览器访问 http://localhost:8080,登录账号密码都是sentinel
Nacos配置Sentinel规则JSON说明  https://www.cnblogs.com/xsj1989/p/18345057

基于之前的示例项目:https://www.cnblogs.com/xsj1989/p/18334504
父项目pom中引入依赖
<!--父pom管理的依赖-->
    <dependencyManagement>
        <dependencies>
            <!--Sentinel是Spring Cloud Alibaba提供的一个专门用于服务容错、服务熔断、服务限流的微服务组件-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                <version>2023.0.1.2</version>
            </dependency>
            <!--sentinel持久化依赖,采用Nacos作为规则配置数据源。-->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
                <version>1.8.8</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
子Module服务项目中pom引入依赖
        <!--Sentinel是Spring Cloud Alibaba提供的一个专门用于服务容错、服务熔断、服务限流的微服务组件-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--sentinel持久化依赖,采用Nacos作为规则配置数据源。-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

子Module服务项目中bootstrap.yaml配置Sentinel,红色部分为新增的Sentinel配置。这样在调用服务的时候会自动找到对应的nacos配置,同步到Sentinel流控规则中。

server:
  port: 8001 # 服务端口号,与application.yaml中的一致。
spring:
  application:
    name: cloud-order-service # cloud-order-service-dev.yaml
  profiles:
    active: dev # 环境配置 test dev pro
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos作为服务中心地址
      config:
        server-addr: localhost:8848 # Nacos作为配置中心地址
        file-extension: yaml # Nacos配置后缀
        group: DEFAULT_GROUP # Nacos配置分组
        namespace: public # Nacos配置命名空间
      username: nacos
      password: 123456
    sentinel:
      transport:
        web-context-unify: false # 默认true 将调用链路收敛, 导致链路流控效果无效
        dashboard: localhost:8080 # 配置sentinel dashboard地址,监控项目端口8001
        port: 8719 # 默认8719端口,如果被占用,则从8719递增检查未被占用的端口
      # sentienl 数据源配置 原文链接:https://blog.csdn.net/qq_42402854/article/details/127379403
      datasource:
        nacos-flow-rule1: # 自定义数据源名称,可以随便定义,保持唯一,可以配置多个,目的是为了区分出每条规则,无实际应用。
          nacos:
            server-addr: localhost:8848 # nacos地址
            username: nacos # nacos账户
            password: 123456 # nacos密码
            namespace: 8e23ce60-9f28-4fa7-875a-5e0d61b533d5 # nacos命名空间必须使用id
            dataId: cloud-order-service-flow # Nacos创建的配置DataId
            rule-type: flow # 规则类型 flow:流控规则;
            data‐type: json # 默认值json,可以不填。
feign:
  sentinel:
    enabled: true

Controller对应的代码

//@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu")
    //@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu",blockHandlerClass = CustomerBlockHandler.class)
    @SentinelResource(value = "cloud-order-service-TestController-getStu", fallback = "getStu", fallbackClass = CustomerFallback.class)
    @GetMapping("/getStu")
    public StuDto getStu() {
        return new StuDto() {{
            setAge(23);
            setName("jay111");
            setSn("111111");
        }};
    }
    //sentinel限流处理
    public static StuDto dealGetStu(BlockException ex) {
        return new StuDto() {{
            setAge(12);
            setName("TestController.dealGetStu");
            setSn("TestController.dealGetStu");
        }};
    }
    //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "dealQueryStu")
    //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandler = "dealQueryStu")
    @SentinelResource(value = "cloud-order-service-TestController-queryStu", fallback = "queryStu", fallbackClass = CustomerFallback.class)
    @PostMapping("/queryStu")
    public StuDto queryStu(@RequestBody StuDto dto) {
        return new StuDto() {{
            setAge(dto.getAge());
            setName("George111");
            setSn("111111");
        }};
    }
    //sentinel限流处理
    public static StuDto dealQueryStu(StuDto dto, BlockException ex) {
        return null;
    }

@SentinelResource的属性说明
==value==:作用指定资源名称,必填
==entryType==:entry类型,标记流量的方向,指明是出口流量,还是入口流量;取值 IN/OUT ,默认是OUT。非必填
==blockHandler==:处理BlockException的函数名称,函数要求为 必须是public 返回类型与原方法一致 参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数 默认需和原方法在同一个类中,如果希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法
==blockHandlerClass==:存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析。函数要求为: 必须是public 返回类型与原方法一致 参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
==fallback==:用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了execptionsToIgnore 里面排除掉的异常类型)进行处理,函数要求为: 返回类型与原方法一致 参数类型需要和原方法相匹配,Sentinel 1.6版本之后,也可在方法最后加上Throwable类型的参数 默认需和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法
==fallbackClass==:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
==defaultFallback==:用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求: 返回类型与原方法一致 方法参数列表为空,或者有一个Throwable类型的参数 默认需要和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackclass,并指定fallbackClass里面的方法。
==exceptionsToIgnore==:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出
==exceptionsToTrace==:需要trace的异常

Nacos新增配置,
命名空间:8e23ce60-9f28-4fa7-875a-5e0d61b533d5
Data Id:cloud-order-service-flow
配置格式:JSON
配置内容:如下

[
  {
    "resource": "cloud-order-service-TestController-getStu",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "clusterMode": false
  },
  {
    "resource": "cloud-order-service-TestController-queryStu",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "clusterMode": false
  }
]

配置说明:
resource:资源名称;
limitApp:来源应用;
grade:阈值类型;0表示线程数,1表示QPS;
count:单机阈值;
strategy:流控模式;0表示直接,1表示关联,2表示链路;
controlBehavior:流控效果;0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群。

Sentinel是懒加载,发起一次请求,再刷新Sentinel控制台就可以看到流控规则。
此种情况下,只能修改Nacos配置,然后同步到Sentinel。
而在Sentinel中修改规则,并不会同步回Nacos,有待后续研究。
参考:https://blog.csdn.net/u022812849/article/details/131206976
https://blog.csdn.net/qq_42402854/article/details/127379403
https://www.jb51.net/program/284986jxr.htm
https://www.zhihu.com/question/482422308/answer/3384468058
https://zhuanlan.zhihu.com/p/681044230
Nacos配置Sentinel各种规则说明:https://blog.csdn.net/ohh_lang/article/details/136384205

posted on 2024-08-02 15:56  邢帅杰  阅读(499)  评论(0编辑  收藏  举报