springcloud alibaba整合sentinel并结合dashboard控制面板设置规则

目录

  • 一、springcloud alibaba整合sentinel
  • 二、采用代码方式设置流控规则
  • 三、结合dashboard控制面板设置规则
    • 3.1、准备工作
    • 3.2、设置全局异常处理
    • 3.3、编写测试接口
    • 3.4、结合dashboard控制面板设置规则
      • 3.4.1、流控规则设置并测试——QPS
      • 3.4.2、流控规则设置并测试——线程数
      • 3.4.3、流控规则设置并测试——关联模式
      • 3.4.4、流控规则设置并测试——链路模式

一、springcloud alibaba整合sentinel

首先创建父maven项目springcloudalibaba,在pom文件中引入如下依赖,需要注意版本对应关系

	<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.11.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version><name>springcloudalibaba</name><description>springcloudalibaba</description><modules><module>Order-sentinel</module></modules><properties><java.version>1.8</java.version><spring.cloud.alibaba.version>2.2.5.RELEASE </spring.cloud.alibaba.version><spring.cloud.version>Hoxton.SR8</spring.cloud.version></properties><dependencies>
<!--        springboot场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!--    依赖放在dependencyManagement中,子项目引用前需要声明,依赖不在dependencyManagement中,子项目默认直接继承--><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

随后在父maven项目下创建子maven项目Order-sentinel,pom文件如下

	<parent><groupId>com.example</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>org.example</groupId><artifactId>Order-sentinel</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies>

二、采用代码方式设置流控规则

创建一个Controller控制器

@RestController
@Slf4j
public class HelloController {private static final String RESOURCE_NAME = "hello";private static final String USER_RESOURCE_NAME = "user";private static final String DEGRADE_RESOURCE_NAME = "degrade";// 进行流控@RequestMapping("/hello")public String hello(){Entry entry = null;try {// 通过接口路径定义资源名称,sentinel是通过资源进行限制的entry = SphU.entry(RESOURCE_NAME);// 被保护的业务逻辑String str = "hello world";log.info("========="+str+"===========");return str;}catch (BlockException e1){// 资源阻止访问,被限制或者被降级// 进行相应的处理操作log.info("block!");return "被流控了";}catch (Exception e2){// 若需要配置降级规则,需要通过这种方式记录业务异常Tracer.traceEntry(e2,entry);}finally {if(entry!=null){entry.exit();}}return null;}/*** @description 改善接口中资源定义和被流控后降级的处理方法* 使用步骤:1、引入依赖*          2、配置bean*          value 定义资源*          blockHandler 设置流控降级后的处理方法(默认该方法声明在同一个类中)*          如果不在同一个类中可以通过 blockHandlerClass 设置,且方法需要用static修饰* @return: com.tuling.sentineldemo.entity.User*/@RequestMapping("/user")@SentinelResource(value = USER_RESOURCE_NAME,blockHandler = "blockHandlerForGetUser")public User getUser(String id){return new User("测试");}/*** 注意 :*  1、一定要public*  2、返回值一定要和源方法一样,包含源方法参数,可以在参数最后加上异常类**/public User blockHandlerForGetUser(String id,BlockException e){e.printStackTrace();return new User("被流控了!");}@PostConstructprivate static void initFlowRules(){// 流控规则List<FlowRule> rules = new ArrayList<>();// 流控FlowRule rule = new FlowRule();// 设置受保护的资源rule.setResource(RESOURCE_NAME);// 设置流控规则(QPS)rule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置受保护的资源阈值rule.setCount(2);rules.add(rule);// 流控FlowRule rule1 = new FlowRule();// 设置受保护的资源rule1.setResource(USER_RESOURCE_NAME);// 设置流控规则(QPS)rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置受保护的资源阈值rule1.setCount(1);rules.add(rule1);// 加载配置好的规则FlowRuleManager.loadRules(rules);}}

启动项目,浏览器快速访问user和hello接口,会看到被流控的字样,表明流控规则设置生效了

三、结合dashboard控制面板设置规则

3.1、准备工作

先下载安装好对应版本的dashboard,dashboard控制面板下载安装教程请看这篇《sentinel控制面板dashboard的下载安装教程》
随后在项目yml配置文件中进行相应的配置

server:port: 8860
spring:application:name: order-sentinelcloud:sentinel:transport:dashboard: 127.0.0.1:8080web-context-unify: false # 打开调用链路

order-sentinel是对应的服务名,127.0.0.1:8080为dashboard程序对应的访问ip和端口号

3.2、设置全局异常处理

@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {System.out.println("BlockExceptionHandler ========="+e.getRule());String r = null;if(e instanceof FlowException){r = "被流控了";}else if(e instanceof DegradeException){r = "被降级处理了";} else if (e instanceof ParamFlowException) {r = "热点参数限流了";} else if (e instanceof SystemBlockException) {r = "触发了系统保护规则";} else if (e instanceof AuthorityException) {r = "授权规则不通过";}response.setStatus(500);response.setCharacterEncoding("utf-8");response.setContentType(MediaType.APPLICATION_JSON_VALUE);new ObjectMapper().writeValue(response.getWriter(),r);}
}

配置了全局BlockException异常处理后,当某个接口被流控或者降级处理导致异常会通过该方法进行处理
当前整个项目目录结构如下
在这里插入图片描述

3.3、编写测试接口

controllert层

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate IOrderService orderService;@GetMapping("/addOrder")public String addOrder(){System.out.println("下单成功");return "下单成功";}@GetMapping("/getOrder")public String getOrder(){System.out.println("查询订单成功");return "查询订单成功";}@GetMapping("/flow")
//    @SentinelResource(value = "flow",blockHandler = "flowBlockHandler")public String flow(){return "返回成功";}@GetMapping("/flowThread")@SentinelResource(value = "flowThread",blockHandler = "flowBlockHandler")public String flowThread() throws InterruptedException {Thread.sleep(5000);return "返回成功";}public String flowBlockHandler(BlockException e){return "被流控了";}@RequestMapping("/test1")public String test1(){return orderService.getUser();}@RequestMapping("/test2")public String test2(){return orderService.getUser();}
}

service层

public interface IOrderService {String getUser();
}

service实现类

@Service
public class OrderServiceImpl implements IOrderService {@Override@SentinelResource(value = "getUser",blockHandler = "blockExceptionGetUser")public String getUser() {return "查询用户";}public String blockExceptionGetUser(BlockException e) {return "流控";}
}

最后,启动项目,依次访问各个接口,让各个接口能被dashboard识别并注册到控制面板中

3.4、结合dashboard控制面板设置规则

进入dashboard控制面板,点击簇点链路,可以看到各个接口并能做出相应的规则设置
在这里插入图片描述

3.4.1、流控规则设置并测试——QPS

在这里插入图片描述
在这里插入图片描述
对/order/addOrder资源进行流控规则设置,输入以上对应的值点击新增按钮,随后请求order/addOrder接口,只要在一秒内请求超过两次后会出现流控效果。QPS就表示为每秒请求数
在这里插入图片描述

3.4.2、流控规则设置并测试——线程数

在这里插入图片描述
在这里插入图片描述
同样为flowThread设置流控规则,由于flowThread接口设置了让线程睡眠5秒,让该接口积攒了超过两条线程后会出现流控效果

3.4.3、流控规则设置并测试——关联模式

在这里插入图片描述
在这里插入图片描述
现有下单接口addOrder和查询订单接口getOrder,当下单接口请求量高于一定阈值,为了节省服务器性能,保障下单接口正常可用,可以对查询订单接口进行限流,此时可以用到关联模式。对查询订单接口设置如上流控规则,当下单接口每秒请求数超过2次,则查询订单接口不可用。

3.4.4、流控规则设置并测试——链路模式

链路模式是当两个不同的接口调用一个公用的方法,可以对该方法设置流控规则。当公用的方法每秒请求超过一定限制可以通过链路模式对某个调用它的接口进行限流。
在这里插入图片描述
这里也可以对test1下的getUser设置规则,效果一样
在这里插入图片描述

当getUser请求数每秒超过2次,则/order/test1被流控,/order/test2正常调用

---------待更新------------

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

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

相关文章

【Unity嵌入Android原生工程】

Unity嵌入Android原生工程 本章学习,Unity模块嵌入Android## 标题Unity导出Android工程创建Android Studio工程Unity嵌入到Andorid StudioAndroid原生代码跳转到Unity场景工作需要嵌入原生工程,并实现热更,记录一下 工具,Unity2023.3.14,Android Studio 2022.3.1 patch3 Un…

《JVM由浅入深学习【四】 2023-12-24》JVM由简入深学习提升分享

JVM由简入深学习提升分享四 1.JVM中java堆的特点及作用2. JVM中对象如何在堆内存中分配3. JVM堆内存中的对象布局 1.JVM中java堆的特点及作用 是线程共享的一块区域虚拟机启动时就创建了是虚拟机中内存占用很大的一块存放所有的实例对象和数组GC主要的作用区域可分为新生代&am…

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的&#xff0c;共有734份文件&#xff0c;包括PDF&#xff0c;PPT&#xff0c;表格&#xff0c;图片&#xff0c;音频等多种格式&#xff0c;可以作为初级日语的学习教材&#xff0c;也是非常适合初学者入门的&#xff0c;可以帮助大家快速的…

Nginx(十三) 配置文件详解 - 反向代理(超详细)

本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。 1. 代理请求 proxy_pass 1.1 proxy_pass 代理请求 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 设置代理服务器的协议和地址以…

使用Redis进行搜索

文章目录 构建反向索引 构建反向索引 在Begin-End区域编写 tokenize(content) 函数&#xff0c;实现文本标记化的功能&#xff0c;具体参数与要求如下&#xff1a; 方法参数 content 为待标记化的文本&#xff1b; 文本标记的实现&#xff1a;使用正则表达式提取全小写化后的…

初识Java并发,一问读懂Java并发知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

数据库索引、三范式、事务

索引 索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树&#xff08;B-tree&#xff09;。 常见索引原则有 选择唯一性索引&#xff1a;唯一性索引的值是唯…

树与二叉树笔记整理

摘自小红书 ## 树与二叉树 ## 排序总结

eclipse中更改jdk版本

文章目录 步骤1&#xff1a;installed JREs步骤2&#xff1a;选择已安装的jdk步骤3&#xff1a;项目配置 步骤1&#xff1a;installed JREs 在eclipse上方工具栏找到Window -->Preferences,如下图所示&#xff1a; 选择Installed JREs 点击 Add 按钮&#xff0c; 选择Stand…

【字典树Trie】LeetCode-139. 单词拆分

139. 单词拆分。 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode&q…

MySQL是如何保证数据一致性的?

文章目录 前言MySQL保证的一致性MySQL发生不一致环节并发冲突redolog不完整binlog&redolog不一致 MySQL解决不一致方案加锁解决并发冲突undolog解决redolog不完整XA两阶段提交解决binlog和redolog的不一致 总结 前言 通过上文《MySQL是如何保证数据不丢失的&#xff1f;》…

Ubuntu安装CUDA出在三个cuda相关文件夹?

按照网上的教程&#xff0c;在/usr/local中操作cuda文件夹&#xff0c;但是发现这里会出现不止一个cuda文件夹&#xff1a; 可以看大这里有cuda、cuda-11、cuda-11.8三个文件夹&#xff0c;实际上我安装的是11.8的cuda&#xff0c;那么第三个文件是好理解的&#xff0c;就是我…

Django Web框架

1、创建PyCharm项目 2、安装框架 pip install django4.2.0 3、查看安装的包列表 4、使用命令创建django项目 django-admin startproject web 5、目录结构 6、运行 cd web python manage.py runserver7、初始化后台登录的用户名密码 执行数据库迁移生成数据表 python man…

【Redis交响乐】Redis中的数据类型/内部编码/单线程模型

文章目录 一. Redis中的数据类型和内部编码二. Redis的单线程模型面试题: redis是单线程模型,为什么效率之高,速度之快呢? 在上一篇博客中我们讲述了Redis中的通用命令,本篇博客中我们将围绕每个数据结构来介绍相关命令. 一. Redis中的数据类型和内部编码 type命令实际返回的…

【MATLAB】EMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EMD-LSTM神经网络时序预测算法是一种结合了经验模态分解&#xff08;EMD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 EMD是一种处理非平稳信号的…

Linux的引导过程与服务控制

一.开机启动的完整过程 引导过程&#xff1a; 1.bios加电自检 检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 服务器主机开机以后&#xff0c;将根据主板BIOS中的设置对CPU、内存、显卡、键盘灯设备进行初步检测&#xff0c;检测成功后根…

stable diffusion 基础教程-图生图

界面 图生图大概有以下几个功能: 图生图涂鸦绘制局部绘制局部绘制(涂鸦蒙版)其常用的也就上面四个,接下来逐步讲解。 以图反推提示词 图生图可以根据反推提示词来获取相应图片的提示词,目前3种主流方式,如下: CLIP反推提示词:推导出的文本倾向于自然语言的描述方式,…

openmediavault(OMV) (26)网络(1)ddns-go

简介 "ddns-go" 是一个动态域名解析(Dynamic DNS)工具,用于更新域名的IP地址。它可以自动检测你的公共IP地址,并将其更新到指定的域名解析服务商,以确保你的域名始终与最新的IP地址相匹配。 安装 hub.docker.com上下载ddns-go镜像 配置compose文件 --- versio…

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群&#xff0c;在 sealos 上可以点点鼠标就搞定&#xff1a; 简单两步&#xff0c;redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可&#xff1a; 链接信息在数据库的…

STM32MP157/linux驱动学习记录

1. uboot烧录 2.linux安装nfs服务 sudo apt-get install nfs-kernel-server rpcbind安装nfs服务 在用户根目录下创建一个名为“linux”的文件夹&#xff0c;以后所有的东西都放到这个“linux”文件夹里面&#xff0c;在“linux”文件夹里面新建一个名为“nfs”的文件夹&#…