sentinel集成springcloud实现限流熔断

news2024/11/15 16:01:11

Sentinel 是由阿里巴巴开源的一款流量控制和熔断降级组件,旨在通过灵活的流量控制和熔断降级机制,帮助开发者保护微服务架构中的应用和服务。

官网:home | Sentinel (sentinelguard.io)

一、安装sentinel

1.方式一:用docker-compose 安装

docker-compose.yml 如下所示

# 参考链接:https://blog.51cto.com/chaim/4582366

# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"

# 定义服务
services:

# 为project定义服务
  sentinel:
    image: bladex/sentinel-dashboard:1.8.6
    ports:
      - 18858:8858
    environment:
# 是否开启登录鉴权,仅用于日常测试,生产上不建议关闭, 默认true
      auth.enabled: "true"
# 登录控制台的用户名,默认为 sentinel
      sentinel.dashboard.auth.username: znak
# 登录控制台的密码,默认为 sentinel
      sentinel.dashboard.auth.password: znak2020
# 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
      server.servlet.session.timeout: 7200
    restart: always
    container_name: sentinel
    privileged: true

2.方式二:离线下载jar包,手动构建镜像

从github上下载 1.8.6版本jar包

在这里插入图片描述

新建Dockerfile文件

#java 版本
FROM openjdk:8-jre
##挂载的docker卷
VOLUME /data/sentinel/tmp

# 定义jar包名称
# ENV JAR_FILE *.jar # 这里因为只有一个 jar 包,简便我就直接写 *.jar 了

# 拷贝 jar 包到容器内
ADD sentinel-dashboard-1.8.6.jar sentinel-dashboard.jar
# 定义时区参数
ENV TZ=Asia/Shanghai
# 设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
# 配置启动命令
ENTRYPOINT ["java", "-Dsentinel.dashboard.auth.username=znak", "-Dsentinel.dashboard.auth.password=znak2020", "-jar", "/sentinel-dashboard.jar"]

执行build-run.sh脚本,如下所示

# 构建镜像
docker build -t sentinel-dashboard:1.8.6 .

# 运行容器
docker run --name sentinel-dashboard -p 18080:8080 --restart=always --privileged=true -d sentinel-dashboard:1.8.6

3.验证

访问http://IP:18080/ 可以看到sentinel的控制台页面,账号密码为刚刚Dockerfile里或docker-compose.yml里设置的

在这里插入图片描述

二、集成Spring Cloud

1.添加依赖

集成Spring Cloud需要注意版本关系,可参考

版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

<!-- SpringCloud Alibaba Sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.0.5.0</version>
</dependency>

2.修改配置

yml:

spring:
  cloud:
    sentinel:
      transport:
        port: 20240 #任意,不冲突即可
        dashboard: 192.168.100.52:18080

3.初体验

启动sentinel,并且对某个微服务做好上述的配置后,启动微服务,并且对服务的接口进行访问(sentinel是懒加载机制),此时查看sentinel控制台,可看到已经监控到了流量

在这里插入图片描述

此时可以进入流控规则和熔断规则去手动添加流控规则和熔断规则

在这里插入图片描述

在这里插入图片描述

但是在这里添加的规则只是临时生效,重启了微服务就会清空了,所以后续我们需要还需要集成nacos将流控规则和熔断规则写在nacos配置文件里,实现规则永久化和可实时修改

1.限流降级

controller层

    @ApiOperation("分页查询危险作业信息列表")
    @PostMapping("/page")
    @SentinelResource(value = "constructionWorkSearchPage", blockHandlerClass = SentinelCommonService.class, blockHandler = "constructionWorkSearchPageBlock")
    public ResponseResult<PageResult<ConstructionWorkExcelVO>> page(@RequestBody @Validated ConstructionWorkDTO constructionWorkDTO) {
        return ResponseResult.success(constructionWorkService.searchPage(constructionWorkDTO));
    }

在接口上添加@SentinelResource注解,参数分别是value 资源名(注意不要和接口路径一样,听说是会导致走不到降级方法里);blockHandlerClass 降级方法所在类(写在本类则不用加该参数);blockHandler 降级方法名

@SentinelResource也可以加在service方法上(实现类),效果则是针对方法限流(熔断同理)

SentinelCommonService.java

public class SentinelCommonService {

    /**
     * 分页查询危险作业信息列表 降级方法,需包含限流方法的所有参数和BlockException参数,且返回值要保持一致
     * @param dto
     * @param e
     */
    public static ResponseResult<PageResult<ConstructionWorkExcelVO>> constructionWorkSearchPageBlock(ConstructionWorkDTO dto, BlockException e) {
        log.info("分页查询危险作业信息列表请求被限流:{}", dto);
        throw new ServicesException(ResultStatus.SENTINEL_FLOW_LIMIT);
    }
}
  • 注意限流降级方法(熔断同理)需要包含BlockException e参数,返回值也要保持一致
  • 参数列表中可以把限流方法(熔断同理)的参数加上,这样就可以在降级方法中获取原请求参数做日志等操作了
  • 注意如果降级方法写在与限流方法(熔断同理)不同的类里,需要加上static修饰符,否则会识别不到

效果

去sentinel控制台手动添加一个与上述资源对应的流控规则

在这里插入图片描述

如上图,表示当qps达到1(1次/秒)时,会快速失败,进入到降级方法中

在这里插入图片描述

在这里插入图片描述

还有其他的规则,例如warm up是预热,如下,则表示允许在10秒内达到qps是1,也就是至少10秒之后才会限流(适用于秒杀等瞬间高并发场景)

在这里插入图片描述

2.熔断降级

sentinel的熔断降级和feign的熔断降级类似,都是服务发生异常的时候,让他流量不在进入,而走向兜底方法;不过一个是针对外界访问的,一个是针对服务之间远程调用的

controller层

    /**
     * 测试熔断
     * @return
     */
    @Override
    @ApiOperation(value = "测试熔断", notes = "测试熔断", httpMethod = "GET")
    @GetMapping(ConstructionProviderConstant.TEST_FEIGN)
    @SentinelResource(value = ConstructionProviderConstant.TEST_FEIGN, fallbackClass = ConstructionProviderFallback.class, fallback = "testFeign")
    public ResponseResult<String> testFeign() {
        //线程休眠12500ms,模拟超时
        try {
            Thread.sleep(12500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return ResponseResult.success("---------------testFeign接口正常------------------");
    }

参数分别是value 资源名(同上);fallbackClass 降级方法所在类(同上);fallback 降级方法名

由于该项目对异常基本都做了全局捕获处理,所以测试熔断改用模拟超时来实现

ConstructionProviderFallback.java

public class ConstructionProviderFallback {
    public static ResponseResult<String> testFeign() {
        log.info("testFeign请求熔断");
        throw new ServicesException(ResultStatus.SENTINEL_DEGRADE);
    }
}

注意事项同上

效果
在这里插入图片描述

表示在1000ms(1秒)内达到1个请求以上,且响应超100ms的数量占比超过1(100%),就会触发熔断,熔断时长3秒【如果未配置降级方法,则会直接抛异常,配置了则会走自定义的降级方法】

在这里插入图片描述
在这里插入图片描述

三、集成Nacos

1.添加依赖

<!-- sentinel + nacos -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.6</version>
</dependency>

2.修改配置

spring:
  cloud:
    sentinel:
      datasource: #sentinel用nacos作为数据源的配置
        ds1: #流控规则管理(这个名称可以自定义)
          nacos: # 告诉sentinel用nacos作为数据源
            data-id: sentinel-spmp-gateway
            group-id: spmp-system
            server-addr: 192.168.100.53:8848
            username: nacos
            password: nacos
            rule-type: flow
            data-type: json
            namespace: 17a4ea5e-f549-4e4a-97a4-52ee2a9f466c
        degree: #熔断规则管理(同上)
          nacos:
            data-id: sentinel-spmp-degrade
            group-id: spmp-system
            server-addr: 192.168.100.53:8848
            username: nacos
            password: nacos
            rule-type: degrade
            data-type: json
            namespace: 17a4ea5e-f549-4e4a-97a4-52ee2a9f466c

注意这里的data-id、group-id、namespace,指定了nacos上的一个配置文件,如下,以限流规则为例:

在这里插入图片描述

[{
		"resource": "spmp-auth",
		"count": 500,
		"grade": 1,
		"limitApp": "default",
		"strategy": 0,
		"controlBehavior": 0
	},
	{
		"resource": "constructionWorkSearchPage",
		"limitApp": "default",
		"grade": 1,
		"count": 1,
		"strategy": 0,
		"controlBehavior": 0,
		"clusterMode": false
	}
]
resource:资源名称;

limitApp:来源应用;

grade:阈值类型;0表示线程数,1表示QPS;

count:单机阈值;

strategy:流控模式;0表示直接,1表示关联,2表示链路;

controlBehavior:流控效果;0表示快速失败,1表示Warm Up,2表示排队等待;

clusterMode:是否集群。

此时重新查看sentinel控制台,会读取nacos的配置文件获取流控规则了,如图所示:

在这里插入图片描述

熔断同理,配置json解释如下

// 资源名
"resource": "/test1",
"limitApp": "default",
// 熔断策略(0:慢调用比例,1:异常比率,2:异常计数)
"grade": 0,
// 最大RT、比例阈值、异常数
"count": 200,
// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
"slowRatioThreshold": 0.2,
// 最小请求数
"minRequestAmount": 5,
// 当单位统计时长(类中默认1000)
"statIntervalMs": 1000,
// 熔断时长
"timeWindow": 10

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回归预测|基于粒子群优化深度神经网络DNN的数据回归预测Python程序PSO-DNN 多特征输入单输出

回归预测|基于粒子群优化深度神经网络DNN的数据回归预测Python程序PSO-DNN 多特征输入单输出 文章目录 前言回归预测|基于粒子群优化深度神经网络DNN的数据回归预测Python程序PSO-DNN 多特征输入单输出 一、PSO-DNN模型1. 粒子群优化&#xff08;PSO&#xff09;简介2. 深度神经…

java版知识付费saas租户平台的核心功能设计:打造高效、个性化的学习体验

随着互联网技术的飞速发展&#xff0c;我国在线教育行业迎来了新的变革&#xff0c;知识付费平台应运而生。这种新兴的在线教育模式&#xff0c;以用户需求为导向&#xff0c;以优质内容为核心&#xff0c;通过互联网技术手段&#xff0c;为用户提供便捷、高效的学习渠道。知识…

基于PyTorch的MNIST手写数字GAN生成器

文章目录 前言小笔记关键特性技术栈使用场景贡献者&#xff1a; 完整代码代码解析1. 导入必要的库2. 设备配置3. 超参数设置4. 创建样本目录5. 图像处理6. 加载MNIST数据集7. 创建数据加载器8. 定义判别器&#xff08;Discriminator&#xff09;D9. 定义生成器&#xff08;Gene…

C语言(15)——顺序表的应用

目录 1.基于动态顺序表实现通讯录项⽬ 1.1功能要求 1.2代码实现 2. 顺序表经典算法 1.基于动态顺序表实现通讯录项⽬ 1.1功能要求 1&#xff09;⾄少能够存储100个⼈的通讯信息 2&#xff09;能够保存⽤⼾信息&#xff1a;名字、性别、年龄、电话、地址等 3&#xff09;…

生活垃圾填埋场污染监测:新标准下的技术革新与环境保护

随着城市化进程的加速&#xff0c;生活垃圾产生量急剧增加&#xff0c;如何有效处理并控制其带来的环境污染成为亟待解决的问题。近日&#xff0c;生态环境部发布了新修订的《生活垃圾填埋场污染控制标准》&#xff08;GB 16889-2024&#xff09;&#xff0c;将自2024年9月1日起…

【Redis】哈希类型详解及缓存方式对比:从命令操作到实际应用场景

目录 Hash 哈希命令命令⼩结内部编码使⽤场景缓存方式对比 Hash 哈希 ⼏乎所有的主流编程语⾔都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#xff0c;哈希类型是指值本身又是⼀个键值对结构&#xff…

万维网与HTTP协议:基础知识简明指南

引言 在当今的数字时代&#xff0c;了解万维网&#xff08;World Wide Web, WWW&#xff09;和HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;是至关重要的。本文将为基础小白们简明扼要地介绍万维网及其核心协议HTTP&#xff0c;并通过简单的例子和清晰的段落…

三级_网络技术_34_网络管理技术

1.在某主机上用浏览器无法访问到域名为www.tipu.edu.cn的网站&#xff0c;并且在该主机上执行tracert命令时有如下信息 分析以上信息&#xff0c;会造成这种现象的原因是 相关路由器上进行了访问控制 服务器 wwww.tjipu.edu.cn工作不正常 该计算机设置的DNS服务器工作不正常…

知行科技半年报显示商业化进展提速,下一个亮点在出海?

中国智驾落地竞速比拼愈演愈烈&#xff0c;让智驾公司陷入颇为紧张的竞争氛围。然而烈火出真金&#xff0c;这场角逐也成为领先企业脱颖而出的机会。 8月16日晚&#xff0c;智驾解决方案提供商知行科技(HK:01274)发布2024年上半年财报。数据显示&#xff0c;知行科技维持了营收…

SPI驱动学习一(协议原理)

目录 一、SPI协议介绍1. SPI 协议概述2. SPI 总线的主要组成部分3. SPI 协议的工作原理3. SPI 通信模式 二、SPI 协议的优点与缺点三、应用实例与常见问题1. 常用外设设备2. 常见问题3. 同时上电问题详细分析可能的原因解决方案 一、SPI协议介绍 1. SPI 协议概述 SPI&#xff…

【DP动态规划】学习笔记大全

-------------------------------------------------------本篇文章尚未完结&#xff0c;大家可以先看已有部分------------------------------------------------------- 【DP动态规划】学习笔记大全 Part 1 背包DP1.1 01背包1.1.1 题意解释1.1.2 为什么不使用贪心1.1.3 该如何…

【机器学习西瓜书学习笔记——规则学习】

机器学习西瓜书学习笔记【第十五章】 第十五章 规则学习15.1 基本概念15.2 序贯覆盖最简单的做法两种产生规则的策略 15.3 剪枝优化预剪枝后剪枝 15.4 一阶规则学习**FOIL算法** 15.5 归纳逻辑程序设计( I L P ILP ILP)最小一般泛化逆归结 第十五章 规则学习 15.1 基本概念 规…

干货|嵌入式分析产品选型指南

在当今数据驱动的商业环境中&#xff0c;业务系统的嵌入式分析能力正成为企业决策的关键能力。将数据分析能力嵌入到企业的核心业务流程中&#xff0c;能够帮助企业快速洞察业务趋势&#xff0c;做出更加明智的业务决策。随着市场对数据分析工具的需求日益增长&#xff0c;选择…

本地生活服务平台源码在哪里?2大获取渠道源码质量解析!

当前&#xff0c;本地生活赛道的发展潜力和收益前景已经日渐显化&#xff0c;本地生活服务商的数量也随之不断增长。不过&#xff0c;由于官方平台对于其本地生活服务商的申请条件并未放宽&#xff0c;因此&#xff0c;新增本地生活服务商中的绝大多数都会选择部署本地生活服务…

letcode 分类练习 654. 最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

letcode 分类练习 654. 最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 654. 最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654. 最大二叉树 class Solution { public:TreeNode* build(vector<int>& nums, int left, int…

Spring MVC中获取请求参数的方式

在Spring MVC中获取请求方式参数的主要方式有RequestParam&#xff0c;PathVariable&#xff0c;RequestBody&#xff0c;HttpServletRequest&#xff0c;RequestHeader等方式&#xff0c;接下来我们分别对其请求获取参数的方式进行相关介绍和使用。 RequestParam 用于获取请…

AMR 机器人底盘分析(补充中)

AMR 机器人底盘分析 1 介绍2 不同轮系底盘类型单舵轮双舵轮底盘四舵轮底盘麦克纳姆轮底盘两驱差速底盘四驱差速底盘单差速总成四差速总成底盘 3 行业专利分析CN220701198U -- 某柔CN110758038A谋星翼*菲谋工 参考 1 介绍 AGV 广泛应用于物流、制造业、安防巡检等领域&#xff…

C语言部分内存函数详解

C语言部分内存函数详解 前言1.memcpy1.1基本用法1.2注意事项**目标空间与原空间不能重叠****目标空间原数据会被覆盖****目标空间要够大****拷贝字节数需小于原空间大小** 1.3模拟实现 2.memmove2.1基本用法2.2注意事项2.3模拟实现 3.memset3.1基本用法 4.memcmp4.1基本用法4.2…

C#使用onnxruntime加载模型,部署到别人的PC上报错

C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错解决方案 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错&#xff1a; Sys…

Python Web 应用和数据处理任务库之Redis Queue (RQ) 使用详解

概要 在现代 Web 应用和数据处理任务中,后台任务处理是一个非常重要的部分。Redis Queue (RQ) 是一个使用 Redis 作为消息队列的简单 Python 库,专注于处理异步任务。RQ 易于设置和使用,适用于需要后台处理的 Web 应用或数据处理项目。本文将详细介绍 RQ 库,包括其安装方法…