SpringCloud--Sentinel使用

一、快速开始

Sentinel 的使用可以分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
1.1、客户端引入 Spring Cloud Alibaba Sentinel 依赖

在客户端 Spring Boot 项目的pom.xml文件中添加Sentinel的依赖。

	<!-- Sentinel 核心依赖 -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
        <version>最新版本号</version>
    </dependency>
    <!-- Spring Boot 集成 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        <version>最新版本号</version>
    </dependency>
1.2、启动 Sentinel Dashboard

Sentinel Dashboard是一个可视化的控制台,用于查看流量数据和管理规则。可以从GitHub上下载最新版本的控制台 jar 包再通过命令将其启动。或者也可以下载 Sentinel 控制台源码自行构建运行。

1.下载地址:
https://github.com/alibaba/Sentinel/releases

2.启动命令,-Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

3.启动成功后,在浏览器中输入 http://localhost:8080 打开控制台。

4.输入默认的用户名和密码都是 sentinel进行登录。
1.3、配置客户端连接到 Sentinel Dashboard

在客户端项目的application.properties或application.yml配置文件中设置Sentinel Dashboard的地址。

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080
1.4、定义资源

在客户端代码中,可以通过编程的方式调用 Sentinel 的 API 来定义资源。也可以通过@SentinelResource注解对某个方法进行标注成资源。
(1)API 方式:

@GetMapping("/example")
public String example() {
    // 定义资源名称
    String resource = "example";
    // 调用Sentinel API进行流量控制
    SphU.entry(resource, () -> {
        // 这里是你的业务逻辑
        return "Hello Sentinel";
    });
    return "success";
}

(2)注解方式:

@SentinelResource(value = "productDetails", blockHandler = "blockHandler")
public ProductDetails getProductDetails(String productId) {
    // 业务逻辑
}
1.5、配置规则

在Sentinel Dashboard控制台中进行图形化配置规则。进入控制台后,选择左侧菜单栏的具体规则菜单,然后点击右上方"新增"按钮来定义规则。也可以通过编程方式动态添加GatewayFlowRule到Sentinel的规则仓库中。
(1)控制台图形化配置:
在这里插入图片描述
(2)编程式动态添加:

public class RuleConfig {
    public static void main(String[] args) {
        // 创建一个限流规则
        FlowRule rule = new FlowRule();
        rule.setResource("product_route"); // 设置资源名称
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置限流策略等级为QPS
        rule.setCount(10); // 设置每秒最大请求数为10

        // 将规则添加到内存中
        GatewayRuleManager.loadRules(Collections.singletonList(rule));
    }
}

二、简单使用实例

通过@SentinelResource注解将需要使用 Sentinel 进行控制的方法定义成资源,后续对该方法的访问都会受到Sentinel 所配置的相关规则控制。

@RestController
public class TestController {

    @Autowired
    private TestService service;

    @GetMapping(value = "/hello/{name}")
    public String apiHello(@PathVariable String name) {
        return service.sayHello(name);
    }
}

@Service
public class TestService {

    @SentinelResource(value = "sayHello")
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}
2.1 @SentinelResource 注解

@SentinelResource 注解用来标识资源是否被限流、降级。该注解有如下属性:

  • value:资源名称,必需项(不能为空)。
  • entryType:entry 类型,可选项(默认为 EntryType.OUT)。
  • blockHandler:blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数签名和位置要求:
    • 函数访问范围需要是 public,返回类型需要与原方法相匹配;
    • 方法参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException;
    • blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析;
  • fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
    • 函数访问范围需要是 public,返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常;
    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析;
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求与fallback一样。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

示例:

public class TestService {
    // 原函数
    @SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")
    public String hello(long s) {
        return String.format("Hello at %d", s);
    }
    
    // Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
    public String helloFallback(long s) {
        return String.format("Halooooo %d", s);
    }

    // Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.
    public String exceptionHandler(long s, BlockException ex) {
        // Do some log here.
        ex.printStackTrace();
        return "Oops, error occurred at " + s;
    }
}
2.2 注解埋点使用限制
  • 确保项目引入了 Spring AOP(或相关 starter)
  • 确保注解方法所在的类已注册为 Spring bean,非 Spring bean 不支持
  • 注意注解埋点不支持 private 方法,不支持内部调用
  • static 方法受 AOP 限制,无法进行代理,暂不支持
  • 若 blockHandler/fallback 不生效,则排查函数签名是否符合要求
  • 如果是不支持 AOP 的场景(比如 javax WebSocket),则无法使用注解方式埋点,需要使用 SphU 方式埋点

三、Spring Cloud Gateway 支持

3.1 引入相关依赖

若想让Spring Cloud Gateway 跟 Sentinel Starter 配合使用,需要加上 spring-cloud-alibaba-sentinel-gateway 依赖,同时需要添加 spring-cloud-starter-gateway 依赖来让 spring-cloud-alibaba-sentinel-gateway 模块里的 Spring Cloud Gateway 自动化配置类生效。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3.2 Sentinel 对 Spring Cloud Gateway 进行限流

在Spring Cloud Gateway中,SentinelGatewayFilter作为一个全局过滤器被集成进来,用于拦截流经网关的请求,并应用Sentinel的流量控制规则。Sentinel 提供了 Spring Cloud Gateway 两种资源维度的限流,默认的粒度是 route 维度以及自定义 API 分组维度。默认不支持 URL 粒度,所以需要将 spring.cloud.sentinel.filter.enabled 配置项置为 false。

  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

使用时首先需引入以下模块:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>

然后再注入对应的 SentinelGatewayFilter 实例以及 SentinelGatewayBlockExceptionHandler 实例即可。

@Configuration
public class GatewayConfiguration {

    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        // Register the block exception handler for Spring Cloud Gateway.
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    @Bean
    @Order(-1)
    public GlobalFilter sentinelGatewayFilter() {
        return new SentinelGatewayFilter();
    }
}
3.3 自定义SentinelGatewayFilter

如果需要自定义流量控制逻辑,可以创建一个自定义的SentinelGatewayFilter实现类。通常涉及以下步骤:

  1. 添加依赖:首先,确保你的项目中已经加入了Sentinel的相关依赖。
  2. 启用Sentinel:在你的Spring Boot应用中添加@EnableSentinel注解来开启Sentinel。
  3. 创建自定义过滤器:创建一个实现GlobalFilter接口的类。这个接口用于定义过滤器的名称、描述和执行逻辑。
  4. 注入SentinelGatewayFilter:在你的自定义过滤器中注入SentinelGatewayFilter,以便能够调用Sentinel的处理逻辑。
  5. 实现过滤逻辑:在实现类中,覆盖apply方法,在其中编写具体的过滤逻辑。
  6. 注册过滤器:将自定义的GlobalFilter实现类作为Bean注册到Spring应用上下文中。

示例:

/**
 * 创建自定义过滤器
 **/
@Component
public class CustomSentinelGatewayFilter implements GlobalFilter, Ordered {

    private final SentinelGatewayFilter sentinelGatewayFilter;
	
	// 注入SentinelGatewayFilter
    public CustomSentinelGatewayFilter(SentinelGatewayFilter sentinelGatewayFilter) {
        this.sentinelGatewayFilter = sentinelGatewayFilter;
    }

	/**
 	* 实现自定义过滤逻辑
 	**/
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        try {
            // 在执行Sentinel的过滤逻辑之前,可以添加自定义的预处理逻辑
            // ...

            // 执行Sentinel的过滤逻辑
            return sentinelGatewayFilter.filter(exchange, chain);

        } catch (BlockException ex) {
            // 当Sentinel拦截请求时,可以在这里添加自定义的处理逻辑
            // ...
            return Mono.empty();
        }
    }

    @Override
    public int getOrder() {
        // 设置过滤器的执行顺序,数值越小越先执行
        return SentinelGatewayFilter.ORDER - 1;
    }
}

在Spring Boot的配置类中注册自定义过滤器。

@Configuration
public class GatewayConfig {

    @Bean
    public GlobalFilter customFilter() {
        return new CustomSentinelGatewayFilter(new SentinelGatewayFilter());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/446226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenFeign相关配置(超时,重试,HttpClient5,日志)

1.超时控制 默认OpenFeign客户端等待60秒钟&#xff0c;但是服务端处理超过规定时间会导致Feign客户端返回报错。 yml文件对应配置: connectTimeout&#xff1a;连接超时时间 readTimeout:请求处理超时时间 1.yml配置 server:port: 80spring:application:name: cloud-consu…

F - Earn to Advance

解题思路 由于对于一点不知道后面得花费&#xff0c;所以无法决策当前是否要停下赚钱或要停下多久考虑一点&#xff0c;可以由其左上方的所有点到达所以从往前推&#xff0c;得出到的总花费然后考虑从之后不赚钱直接到最终所用次数和剩余钱若存在&#xff0c;在后面点赚钱更优…

面试经典150题 -- 图的广度优先遍历 (总结)

总的链接 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 909 . 蛇梯棋 链接 : . - 力扣&#xff08;LeetCode&#xff09; 题意 &#xff1a; 直接bfs就好了 &#xff0c; 题意难以理解 : class Solution:def snakesA…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示&#xff0c;所以迟到得来速学一下mockjs。 参考视频&#xff1a;mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料&#xff0c;先是看了下EasyMock&#xff0c…

分享几个Google Chrome谷歌浏览器历史版本下载网站

使用selenium模块的时候&#xff0c;从官网下载的谷歌浏览器版本太高&#xff0c;驱动不支持&#xff0c;所以需要使用历史的谷歌浏览器版本 &#xff0c;这里备份一下以防找不到了。 驱动下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathchromedriver 文…

Windows C++ 实现远程虚拟打印机(远程共享打印机)

编译错误已经修改完后的工程修改后的下载地址 https://download.csdn.net/download/2403_83063732/88928550 1、下载clawpdf&#xff08;0.8.7版本&#xff09; https://github.com/clawsoftware/clawPDF 2、打开clawpdf工程开始编译C#工程&#xff0c;出现如下错误&#xf…

利用YOLOv5模型进行锥桶识别

目录 1. YOLOv5模型简介 2. 准备数据集 3. 训练模型 4. 模型评估 5. 模型部署与应用 6. 注意事项 在计算机视觉领域&#xff0c;目标检测是一项重要的任务&#xff0c;它可以帮助我们识别图像或视频中的特定物体并进行定位。而YOLOv5是一种高效的目标检测模型&#xff0c…

栈与队列的故事

​​​​​​​ 目录 ​编辑​​​​​​​ 一、栈 1.1栈的概念及结构 1.2栈的实现 1、实现支持动态增长的栈 2、初始化栈 3、入栈 4、出栈 5、获取栈顶元素 6、检测栈是否为空 7、获取栈中有效元素个数 8、销毁栈 9、测试 1.3源码 二、队列 2.1队列的概念及结构…

【AI辅助研发】-开端:未来的编程范式

编程的四种范式 面向机器编程范式 面向机器编程范式是最原始的编程方式&#xff0c;它直接针对计算机硬件进行操作。程序员需要了解计算机的内部结构、指令集和内存管理等细节。在这种范式下&#xff0c;编程的主要目标是编写能够直接控制计算机硬件运行的机器代码。面向机器…

Babel:现代JavaScript的桥梁

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Prometheus】PromQL

数据类型 即时向量&#xff08;instant vector&#xff09; node_cpu_seconds_total{instance"ahoj-dev-ubuntu-virtualbox",mode"idle"} 区间向量&#xff08;range vector&#xff09; node_cpu_seconds_total{instance"ahoj-dev-ubuntu-virtu…

java正则表达式概述及案例

前言&#xff1a; 学习了正则表达式&#xff0c;记录下使用心得。打好基础&#xff0c;daydayup! 正则表达式 什么是正则表达式 正则表达式由一些特定的字符组成&#xff0c;代表一个规则。 正则表达式的功能 1&#xff1a;用来校验数据格式是否合规 2&#xff1a;在一段文本…

针对娃哈哈和农夫山泉,AI是如何看待的

娃哈哈和农夫山泉事件是中国饮料行业的两个重要事件。娃哈哈和农夫山泉都是中国知名的饮料品牌&#xff0c;两者之间的竞争一直存在。以下是对这两个事件的介绍&#xff1a; 1. 娃哈哈事件&#xff1a;娃哈哈是中国最大的饮料生产企业之一&#xff0c;也是中国最具影响力的品牌…

.Net6使用JWT认证和授权

文章目录 目的实现案例一.项目所需包&#xff1a;二.配置项目 appsettings.json 文件&#xff1a;三.创建Model文件夹&#xff0c;添加AppConfig类和UserRole类1.AppConfig类获取appsettings.json文件中的值2.UserRole类用于区分用户信息和权限 四.主体代码案例&#xff1a;1.L…

C++的类与对象(三):构造函数、析构函数、对象的销毁顺序

目录 类的6个默认成员函数 构造函数 语法 特性 析构函数 特性 对象的销毁顺序​​​​​​​​​​​​​​ 类的6个默认成员函数 问题&#xff1a;一个什么成员都没的类叫做空类&#xff0c;空类中真的什么都没有吗&#xff1f; 基本概念&#xff1a;任何类在什么都不…

[MRCTF2020]Transform1

a[33]"9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14" b[33]"103,121,123,127,117,43,60,82,83,121,87,94,93,66,123,45,42,102,66,126,76,87,121,65,107,126,101,60,92,69,111,98,77" python代码 a3 [103…

three.js 射线Ray,三维空间中绘制线框

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div> <div>{{ res1 }}</div> <div>{{ res2 }}</div><…

一图看懂Redis持久化机制!

持久化策略 Redis 提供了两种持久化策略&#xff1a; RDB (Redis Database Snapshot) 持久化机制&#xff0c;会在一段时间内生成指定时间点的数据集快照(snapshot) AOF&#xff08;Append Only File&#xff09; 持久化机制&#xff0c;记录 server 端收到的每一条写命令&am…

nmcli绑定bond双网卡(active-backup模式)

安装包 apt-get install network-manager apt install net-tools当前网卡mac地址IP都不一样 创建名为“jbl”的新连接&#xff0c;并将其模式设置为“active-backup” nmcli connection add type bond ifname jbl mode active-backup添加物理网卡到bond(JBL),两个物理网卡添加…

linux操作系统虚拟机的环境配置

目录 一、虚拟机安装&#xff08;类似硬件的安装&#xff09; &#xff08;1&#xff09;创建虚拟机 &#xff08;2&#xff09;创建虚拟机 二、IP和主机名称配置 1、设置VM上的IP 2、设置我们电脑上VMnet8的IP 3、设置虚拟机上的IP 主机名称映射 以下是设置主机名映射…
最新文章