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.hqwc.cn/news/318634.html

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

相关文章

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重、写入json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

用通俗易懂的方式讲解大模型:在 CPU 服务器上部署 ChatGLM3-6B 模型

大语言模型&#xff08;LLM&#xff09;的量化技术可以大大降低 LLM 部署所需的计算资源&#xff0c;模型量化后可以将 LLM 的显存使用量降低数倍&#xff0c;甚至可以将 LLM 转换为完全无需显存的模型&#xff0c;这对于 LLM 的推广使用来说是非常有吸引力的。 本文将介绍如何…

C# windows服务程序开机自启动exe程序

我们使用传统的Process.Start(".exe")启动进程会遇到无法打开UI界面的问题&#xff0c;尤其是我们需要进行开启自启动程序设置时出现诸多问题&#xff0c;于是我们就想到采用windows服务开机自启动来创建启动一个新的exe程序&#xff0c;并且是显式运行。 首先是打开…

【一文入门】Git常用命令集锦--分支操作和版本管理篇

前言 Git 是一种分布式版本控制系统&#xff0c;可以帮助团队协作开发、管理和维护代码&#xff0c;提高代码质量和效率&#xff0c;掌握常用版本管理命令可以帮助我们更好地管理代码变更和历史记录。下面我将介绍开发中常用的一些Git分支操作和版本管理命令 1 分支操作 1.1 …

centos7安装nacos

一、前言 centos 7.9上部署nacos 2.0.3 二、部署步骤 1、下载nacos wget -P /opt/software/ https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz 2、解压并改变nacos部署目录 cd /opt/software/ tar -zxf nacos-server-2.0.3.tar.gz mv…

Sam Altman的一天被曝光!每天15小时禁食、服用小剂量安眠药,尽可能避免开会

Sam Altman在经历了几天混乱的管理重组后&#xff0c;重新回到了OpenAI的CEO位置。在日常生活中&#xff0c;奥特曼与许多科技行业高管一样&#xff0c;痴迷于延长自己的寿命。 据报道&#xff0c;他还为应对末日场景&#xff08;致命合成病毒的释放、核战争和人工智能攻击等&…

静态代理、JDK动态代理、CGLIB动态代理以及JDK和CGLIB动态代理的区别

代理 什么是代理&#xff1f;两个设计原则三要素 静态代理静态代理的实现定义接口-定义行为静态代理 -> 目标角色静态代理-> 代理角色静态代理测试 特点 JDK动态代理newProxyInstance获取代理对象通过代理对象实现目标对象的功能特点 Java动态代理类中的invoke是怎么调用…

复试 || 就业day03(2024.01.03)项目一

文章目录 前言scikit-learn实现简单线性回归scikit-learn实现多元线性回归&#xff08;二元&#xff09;总结 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容来自某机构网课&#xff0c;是我为复试准备的第一个项…

生活中危险的气体:一氧化碳与二氧化碳中毒的症状及安全预防措施

一氧化碳和血红蛋白亲和力超过氧气&#xff0c;会占用血红蛋白&#xff0c;导致缺氧。 二氧化碳会和血浆结合&#xff0c;导致血液pH值不正常&#xff0c;抑制呼吸&#xff0c;导致窒息。 通俗点说&#xff1a;一氧化碳是中毒&#xff0c;二氧化碳则是窒息。 一氧化碳中毒 …

栈实现后缀表达式的计算

后缀表达式计算 过程分析 中缀表达式 &#xff08;15&#xff09;*3 > 后缀表达式 153* (可参考这篇文章&#xff1a;中缀转后缀) 第一步&#xff1a;我们从左至右扫描 后缀表达式(已经存放在一个字符数组中)&#xff0c;遇到第一个数字字符 ‘1’ 放入栈中第二步&#xf…

Java 类型转换

自动 1 短的变长的 2 表达式的自动类型转换 多种数据类型参与运算&#xff0c;其结果以大的数据类型为准byte, short, char 三种类型数据在和其他类型数据运算时&#xff0c;都会转换为int类型再运算&#xff08;byte byte也会是int int&#xff09; 强制 前面我们学习了自…