首页 > 其他分享 >SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化

SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化

时间:2024-08-02 15:54:50浏览次数:18  
标签:持久 SpringCloud nacos sentinel TestController Sentinel fallback cloud

Sentinel官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html
下载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

基于之前的示例项目: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配置。

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
  }
]

Sentinel是懒加载,发起一次请求,再刷新Sentinel控制台就可以看到流控规则。
参考: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

标签:持久,SpringCloud,nacos,sentinel,TestController,Sentinel,fallback,cloud
From: https://www.cnblogs.com/xsj1989/p/18338930

相关文章

  • Java/SpringCloud/RabbitMq/无感实现消息携带用户信息 --- 逻辑讲解、代码实现、图形
    一、需求:依据黑马商城hmall为例,用户下单创建订单后,交易服务trade-service向交换机topic发送消息,交换机topic路由到队列,购物车服务cart-service监听此队列,实现自动清空购物车。改造下单功能,将基于OpenFeign的清理购物车同步调用,改为基于RabbitMQ的异步通知:定义t......
  • SpringCloud+Vue3主子表插入数据(芋道)
    目的:多表联查获取到每个班级里面所有的学生上课的信息。点击消课插入到消课主表和消课子表,主表记录班级信息,消课人员信息,上课时间。子表记录上课学员的信息,学员姓名、手机号、班级名称、班级类型、上课时间、老师名称前端:<template><Dialog:title="dialogTitle"v-mode......
  • sentinel中的扩展
    为什么优秀的框架总是提供用户扩展的能力?我想这是因为业务逻辑是千变万化的,框架中能抽象的只是部分的公共逻辑,在应用接入框架时,难免需要做一些本地化调整。框架一般通过接口(interface)的形式来提供扩展(用户通过实现这些接口来获得某些能力或完成某些逻辑),那么框架如何知道这......
  • SpringCloud示例项目,使用的SpringBoot3.3.2
    先启动nacos:https://www.cnblogs.com/xsj1989/p/18323636特别注意,SpringBoot、SpringCloud、Openfeign等依赖的版本必须相匹配,不然会报各种错。具体版本对应关系看官网。或者看:https://start.spring.io/actuator/info父pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmln......
  • Sentinel - 滑动窗口算法分析
    文章目录前言一、StatisticSlot1、StatisticNode2、Metric3、ArrayMetric4、LeapArray5、WindowWrap6、MetricBucket二、FlowSlot1、FlowRuleChecker2、DefaultController总结前言前序文章介绍了常见的限流算法,包括滑动窗口,并且简单地进行了实现。对于更复杂的场......
  • 使用Seata XA模式的全局事务管理在SpringCloud电商订单系统中的应用
    在开发电商系统的过程中,订单创建是一项非常关键的功能。本文将介绍如何在订单创建过程中,结合SpringCloud和Seata的XA模式来实现全局事务管理,以确保数据的一致性和完整性。订单创建过程详解在这段代码中,我们通过@GlobalTransactional注解来声明一个全局事务。以下是具体的......
  • redis持久化
    除了正常服务以外,数据量的扩容,数据安全也属于高可用的范畴之内。实现redis高可用的方式1.持久化 最简单的高可用方法,主要功能就是备份数据。即把内存当中的数据保存到硬盘当中。2.主从复制3.哨兵模式4.redis的集群持久化概念是把内存当中的数据保存到硬盘当中。开启持......
  • 聊聊在springcloud gateway如何获取请求体
    前言在我们扩展scg时,获取requestbody也是一个挺常见的需求了,比如记录日志,我们要获取请求体里面的内容。在HTTP协议中,服务器接收到客户端的请求时,请求体(RequestBody)通常是以流的形式传输的。这个流在设计上是只读且不可重复读取的。即requestbody只能读取一次,但我们很多时候是更......
  • Unity数据持久化——序列化/二进制/Json/PlayerPrefs
    序列化序列化是指把对象转换为字节序列的过程,而反序列化是指将字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。在Unity中保存和加载、prefab、Scene、Inspector窗口、实例化预制体等都使用了序列化和反序列化。下面是一个序列化和反序列化的例子......
  • 基于EasyTcp4Net开发一个功能较为完善的去持久化聊天软件
    之前自己写了一篇介绍TCP的一些常用的功能介绍和特征,并且用代码做了示例,最终开发了一个EasyTcp4Net的TCP工具库,其最大的特色就是使用了微软提供的高性能库中的一些数据结构来处理TCP数据。最近辞职待业在家,也没啥事做,就利用自己写的TCP通讯库基础上开发了一个示例的聊天程序,功能......