java springcloud熔断降级组件sentinel基础应用及nacos持久化处理

sentinel

阿里开源的一套服务容错方案,消息削峰填谷,集群流量控制,实时熔断下游不可用应用等,提供了实时监控功能

复制代码
​不同于redis的一种集群模式-sentinel-哨兵模式,redis集群有主从模式[当有服务器不好用时,需要人为干预选择]和哨兵模式[一种自动选举的模式]

所需依赖

xml 复制代码
<!-- SpringCloud Alibaba Sentinel - Sentinel 核心 Starter -->
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 </dependency>
 <!-- 可选:如果需要使用 Nacos 进行规则持久化,需额外引入数据源依赖 -->
 <dependency>
     <groupId>com.alibaba.csp</groupId>
     <artifactId>sentinel-datasource-nacos</artifactId>
 </dependency>

启动sentinel控制台

这里使用的是1.8.5版本,控制台默认端口8080

启动命令:

java 复制代码
java -jar sentinel-dashboard-1.8.5.jar --server.port=8080 --csp.sentinel.dashboard.server=localhost:8080 --project.name=sentinel-dashboard

如图所示,sentinel控制台可以操作的功能有:热点控制、熔断降级、流量控制、授权操作等等

sentinel容错维度

  • 流量控制:控制有限的请求接入
  • 熔断降级:请求异常时,让请求快速失败
  • 系统负载保护:针对服务器进行设定

sentinel规则种类

  • 流控:每秒限流

    ​ qps-每秒极限值 线程数-同一时刻线程数

    ​ 三种模式:直接(默认)、关联(当关联资源达到限流,开启限流)、链路(

    复制代码
     //是否合并接口上下文 默认true
     spring:cloud:sentinel:web-context-unify:false//不进行合并

    )

    ​ 三种效果:快速失败(抛异常)、Warm Up(预热机制-预热时长-秒为单位-也是抛异常)、排队等待(超时时间-单位毫秒)

  • 降级:设置熔断时长,当超过时长进行熔断处理

  • 热点:热点参数限流(让热点商品不能占用全部流量),高并发,

  • 系统:cpu使用率等限定

  • 授权:有权限才可以访问

sentinel中的资源:(在sentinel控制台中能被识别到)

  • controller中的接口默认就是资源
sentinel降级

​ 三种衡量条件:(越来越严格的降级要求:慢调用-异常比例-异常数)

  • 慢调用比例:需要设置允许的慢调用RT(即最大的响应时间)

  • 异常比例

  • 异常数(同异常比例)

sentinel热点
sentinel授权
java 复制代码
//请求解析类,当访问指定资源时,会判断是否符合要求
@Component
public class MyRequestParser implements RequestOriginParser {

    //解析请求目标的方法
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {

        //通过request对象取参数
        String serviceName = httpServletRequest.getParameter("serviceName");
        if (serviceName == null || "".equals(serviceName)) {
            return "error";
        }
        //返回给sentinel 和黑/白名单进行比对
        return serviceName;
    }
}
sentinel自定义异常返回

sentinel异常的父类:BlockException

  • FlowException 限流异常
  • DegradeException 降级异常
  • ParamFlowException 参数限流异常
  • AuthorityException 授权异常
  • SystemBlockException 系统负载异常

热点或是链路的错误 显示500 是不能在BlockException中进行捕获的

java 复制代码
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

//异常捕获类
@RestControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(BlockException.class)
    public Object handleBlockException(HttpServletRequest request, HttpServletResponse response,BlockException e) {
        Map<String, String> map = new HashMap<>();

        //把异常对象进行比对
        if (e instanceof FlowException){
            map.put("code", "500");
            map.put("message", "限流异常");
        }else if (e instanceof DegradeException){
            map.put("code", "500");
            map.put("message", "降级异常");
        }else if (e instanceof ParamFlowException){
            map.put("code", "500");
            map.put("message", "热点异常");
        }else if (e instanceof AuthorityException){
            map.put("code", "500");
            map.put("message", "授权异常");
        }else{
            map.put("code", "500");
            map.put("message", "系统异常");
        }
        return map;
    }
}

nacos - sentinel持久化

在nacods中添加配置文件,用于存储sentinel持久化资源内容,设置资源访问限制。

yaml 复制代码
[
    {
        "resource": "资源名",
        "count": 500,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    },
    {....}
]

参数解析

参数名 含义说明
‌resource‌ 资源名称‌。这是限流规则作用的目标对象
‌count‌ 限流阈值‌。表示允许通过的最大数量
‌grade‌ 阈值类型‌。• 0:基于线程数(并发线程数限流)。• 1:‌基于 QPS‌(每秒查询率限流)
‌limitApp‌ 流控针对的调用来源‌。• "default":不区分调用来源,所有来源的请求共享该阈值。• 若填写特定微服务名(如 order-service),则仅对该来源的请求进行限流。
‌strategy‌ 调用关系限流策略‌。• 0:‌直接模式‌。当资源自身的 QPS 超过阈值时,直接触发限流。• 1:关联模式(关联资源超阈值时限流本资源)。• 2:链路模式(只统计指定入口的流量)。
‌controlBehavior‌ 流控效果(行为)‌。• 0:‌快速失败‌(Default)。超过阈值后,新请求立即被拒绝,抛出 FlowException。• 1:Warm Up(预热/冷启动)。• 2:排队等待(匀速器模式)。• 3:预热 + 排队等待。

本地在网关中进行sentinel相关配置

yaml 复制代码
spring: 
  application:
    # 应用名称
    name: 
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置 Spring Boot 的环境变量 动态加载配置文件
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
    sentinel:
      # 取消控制台懒加载
      eager: true
      transport:
        # 控制台地址
        dashboard: 127.0.0.1:8718
      # nacos配置sentinel持久化
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: 与nacos中控制台配置文件内容文件名一致
            # 配置分组,默认分组DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            # 数据格式,通常为 json
            data-type: json
            # 规则类型:网关流控规则
            rule-type: gw-flow
相关推荐
SimonKing1 小时前
Apache Fory JSON或许可以替代FastJson
java·后端·程序员
程序员良辰1 小时前
【TongWeb7的M11】 首次登录密码修改 & 开启控制台远程访问
java·中间件·tomcat
吴声子夜歌1 小时前
Java面试——设计模式(四)
java·设计模式·面试
paopaokaka_luck1 小时前
基于springboot3+vue3+uniapp的剧本杀预约小程序(AI角色对话、协同过滤算法、地图Api、Echarts图形化分析)
java·前端·spring boot·学习·echarts
一嘴一个橘子1 小时前
idea 的 双击Shift 全局搜索
java·ide·intellij-idea
nvvas1 小时前
最新版 IntelliJ IDEA 全面介绍:面向现代 Java 开发者的智能 IDE
java·ide·intellij-idea
aikopen1 小时前
高可用 API 网关限流与微服务过载保护实战:从 Sentinel 动态阈值到 DB 连接池舱壁
数据库·微服务·sentinel
circuitsosk1 小时前
Python 文件读写与上下文管理器:with 语句为什么是最佳选择
java·服务器·python·文件操作·上下文管理器·contextlib