springboot sentinel 整合 规则详情和代码实现-分布式/微服务流量控制

文章目录

  • sentinel控制台安装
  • 目标
  • 版本说明
  • sentinel 规则整合验证
    • pom.xml
    • 配置注解拦截
    • 资源控制规则---内存模式
    • 测试controller
    • 客户端接入控制台
  • 测试
    • sentinel控制台
    • 接口调用
  • 下一篇:配置持久化策略规则
  • 外传

sentinel控制台安装

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

本次版本:1.8.6
上一篇文章已介绍

目标

我们先说目标,为各位看官节省不匹配的时间
6、使用sentinel流控中心
1、使用nacos做配置中心
2、使用nacos做注册中心
3、微服务模块化
4、使用dubbo作为服务管理
5、使用springboot做脚手架

版本说明

Dubbo :3.1.0
Springboot:2.3.1.RELEASE
sentinel:1.8.6
Nacos-config:0.2.10

sentinel 规则整合验证

官网地址:https://sentinelguard.io/zh-cn/docs/basic-api-resource-rule.html

在这里插入图片描述

pom.xml

<!-- 客户端核心包 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId></dependency><!-- 客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId></dependency><!-- 开启注解 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId></dependency><!-- 热点参数限流功能 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-parameter-flow-control</artifactId></dependency>

配置注解拦截

注解使用的话,必须要先初始化配置:

package org.lwd.microservice.boot.plat.controller;import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 注解方式配置** @author weidong* @version V1.0.0* @since 2023/7/14*/
@Configuration
public class SentinelConfig {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
}

资源控制规则—内存模式

资源控制规则–在项目中配置规则
sentinel控制台可以修改规则,但是仅限于临时使用,当项目重启后,临时规则消失

package org.lwd.microservice.boot.plat.controller;import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreakerStrategy;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 资源控制规则---内存模式* @author weidong* @version V1.0.0* @since 2023/7/17*/
//@Configuration
//为什么不用这种方式加载,我门使用的是纯springboot的整合方式,现在,是在application启动后,再初始化sentinel连接sentinel,所以启动过程中加载,是不能初始化到控制台
public class SentinelRule {public SentinelRule(){initFlowQpsRule();initDegradeRule();initSystemProtectionRule();}/*** 流量控制规则** Field        说明                          默认值* resource     资源名,资源名是限流规则的作用对象* count        限流阈值* grade        限流阈值类型,QPS 或线程数模式       QPS 模式* limitApp     流控针对的调用来源               default,代表不区分调用来源* strategy     调用关系限流策略:直接、链路、关联   根据资源本身(直接)* controlBehavior  流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流     直接拒绝*/
//    @PostConstructprivate void initFlowQpsRule() {List<FlowRule> rules = new ArrayList<>();FlowRule flowRule = new FlowRule();flowRule.setResource("sayHello");// Set max qps to 20flowRule.setCount(5);flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);flowRule.setLimitApp("default");rules.add(flowRule);FlowRuleManager.loadRules(rules);}/*** 熔断降级规则** Field        说明                                                                                  默认值* resource     资源名,即规则的作用对象* grade        熔断策略,支持慢调用比例/异常比例/异常数策略                                                 慢调用比例* count        慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值* timeWindow   熔断时长,单位为 s* minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)            5* statIntervalMs   统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)                              1000 ms* slowRatioThreshold   慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)*/private void initDegradeRule() {List<DegradeRule> rules = new ArrayList<>();DegradeRule rule = new DegradeRule("circuitBreaker").setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType()).setCount(0.1) // Threshold is 70% error ratio.setMinRequestAmount(5).setStatIntervalMs(5000) // 5s.setTimeWindow(10);rules.add(rule);DegradeRuleManager.loadRules(rules);}/*** 系统保护规则 (SystemRule)* Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,* 通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。** Field                说明                              默认值* highestSystemLoad    load1 触发值,用于触发自适应控制阶段   -1 (不生效)* avgRt                所有入口流量的平均响应时间               -1 (不生效)* maxThread            入口流量的最大并发数                  -1 (不生效)* qps                  所有入口资源的 QPS                 -1 (不生效)* highestCpuUsage      当前系统的 CPU 使用率(0.0-1.0)      -1 (不生效)*/private void initSystemProtectionRule() {List<SystemRule> rules = new ArrayList<>();SystemRule rule = new SystemRule();rule.setHighestSystemLoad(10);rules.add(rule);SystemRuleManager.loadRules(rules);}/*** 来源访问控制(黑白名单)** 我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。* 黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;* 若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。** 调用方信息通过 ContextUtil.enter(resourceName, origin) 方法中的 origin 参数传入。** 黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:** resource:资源名,即限流规则的作用对象* limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB* strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式**/private void initAuthorityRule(){AuthorityRule rule = new AuthorityRule();rule.setResource("test");rule.setStrategy(RuleConstant.AUTHORITY_WHITE);rule.setLimitApp("appA,appB");AuthorityRuleManager.loadRules(Collections.singletonList(rule));}}

测试controller

可适应controller或者service,关键字在于资源

package org.lwd.microservice.boot.plat.controller;import com.alibaba.csp.sentinel.EntryType;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 流量控制-测试控制器** @author weidong* @version V1.0.0* @since 2023/7/14*/
@Slf4j
@RestController
@RequestMapping("/sentinel/")
@CrossOrigin
public class SentinelController {@SentinelResource(value = "sayHello",fallback = "circuitBreakerFallback", blockHandler = "sayHelloExceptionHandler", entryType = EntryType.IN)@GetMapping(value = "/sayHello")public String testInterGet(String name) {log.info("----hello sentinel---:{}", name);return JSON.toJSONString(name);}/*** 熔断降级* @return*/@SentinelResource(value = "circuitBreaker", fallback = "circuitBreakerFallback", blockHandler = "sayHelloExceptionHandler")@GetMapping(value = "/circuitBreaker")public String circuitBreaker(String name){if ("lwd".equals(name)){return "hello,"+ name;}throw new RuntimeException("发生异常");}public String circuitBreakerFallback(String name){log.info("----熔断降级处理---:{}",name);return "服务异常,熔断降级, 请稍后重试!";}public String sayHelloExceptionHandler(String name, BlockException ex){log.info("----限流降级处理---:{}",name);return "访问过快,限流降级, 请稍后重试!";}}

客户端接入控制台

启动时加入 JVM 参数-Dcsp.sentinel.dashboard.server=consoleIp:port指定控制台地址和端口。更多的参数参见启动参数文档。

或者我们使用在java中设置启动参数
启动类

package org.lwd.microservice.boot.plat;import com.alibaba.csp.sentinel.init.InitExecutor;
import org.lwd.microservice.boot.middle.runtime.util.YmlUtils;
import org.lwd.microservice.boot.plat.controller.SentinelRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author weidong* @version V1.0.0* @description* @since 2023/4/7*/
@SpringBootApplication
public class PlatApplication {public static void main(String[] args) {System.setProperty("project.name", YmlUtils.getApplicationName());ConfigurableApplicationContext context = SpringApplication.run(PlatApplication.class, args);// 连接到控制台,与sentinel控制台通信//System.setProperty("project.name", context.getEnvironment().getProperty("spring.application.name", "sentinel"));//System.setProperty("csp.sentinel.dashboard.server", context.getEnvironment().getProperty("sentinel.dashboard.server", "localhost:7080"));//System.setProperty("sentinel.dashboard.app.hideAppNoMachineMillis", "60000");//dashboard 地址System.setProperty("csp.sentinel.dashboard.server", "localhost:7080");//API端口System.setProperty("csp.sentinel.api.port", "localhost:8719");InitExecutor.doInit();new SentinelRule();}}

测试

sentinel控制台

控制台会在左侧显示启动的项目,并新增控制策略【控制台新增策略,生命周期只在客户端项目运行,一旦重启就没有了】
控制台:http://localhost:7080/

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

接口调用

测试限流接口:http://localhost:8022/sentinel/sayHello?name=lwd
在这里插入图片描述

测试熔断接口:http://localhost:8022/sentinel/circuitBreaker?name=zhansan
http://localhost:8022/sentinel/circuitBreaker?name=lwd

在这里插入图片描述

在这里插入图片描述

过设定的时间访问:
在这里插入图片描述

下一篇:配置持久化策略规则

使用nacos配置--自己实现
使用springcloudalibaba-sentinel已经实现好了

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

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

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

相关文章

Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

GO协程初识 package mainimport ("fmt""sync""time" )func read() {defer wg.Done()fmt.Println("read start")time.Sleep(time.Second * 3)fmt.Println("read end") }func listenMusci() {defer wg.Done()fmt.Println(&qu…

vue 下拉框显示从后端请求的数据

下拉框<!-- 给产品添加推广人员弹出框 --><el-dialog :title"titlePerson" :visible.sync"openAddPerson" width"1000px" append-to-body><el-select v-model"this.bindingProductPerson.recommendId" filterable plac…

【C++】-list的具体使用

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

HTML学习 第一部分(前端学习)

参考学习网站: 网页简介 (w3schools.com) 我的学习思路是&#xff1a;网站实践视频。 视频很重要的&#xff0c;因为它会给你一种开阔思路的方式。你会想&#xff0c;噢&#xff01;原来还可以这样。这是书本或者网站教程 所不能教给你的。而且&#xff0c;对一些教程&#…

Ubuntu搭建docker+laradock

使用Ubuntu搭建dockerlaradock windows 下载Ubuntu工具二选一 链接&#xff1a;https://pan.baidu.com/s/154K6MKdFZxWqaTn2q-6MSQ 提取码&#xff1a;06lc https://www.jianshu.com/p/b7e11d0dbe8c借鉴地址&#xff1a;https://zhuanlan.zhihu.com/p/547169542 备注&#x…

没有人能真正精通C++

目录 1、C的“双峰”特性 2、没人能真正精通C 3、世界仍然需要C 任何说自己很懂C的人可能都是在夸大其词。 我想你可能已经注意到了&#xff0c;是的&#xff0c;今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C等古老的编…

微信加粉计数器后台开发

后台包括管理后台与代理后台两部分 管理后台 管理后台自带网络验证卡密系统,一个后台可以完成对Pc端的全部对接,可以自定义修改分组名称 分享等等代理后台 分享页 调用示例 <?php$request new HttpRequest(); $request->setUrl(http://xxxxxxx/api); $request->…

Spingboot 多模块引入第三方jar包

1. 在需要的模块中引入jar包 2. 在此模块中的pom.xml 中引用 3. 要想打包部署服务器&#xff0c;需要在启动模块中添加配置信息 ps&#xff1a;启动模块要引用此模块才能将此一起jar打包部署 <build><plugins><plugin><groupId>org.springframework.…

基于阿里云微信小程序语音识别

页面效果 其中采用阿里云语音识别&#xff1a;阿里云一句话语音识别 语音识别页面 <template><view><view class"chat_list"><view v-for"v in chatList" :class"v.type right ? type_right : type_left"><chat …

Nautilus Chain 更换全新测试网,主网即将在不久上线

目前&#xff0c;Nautilus Chain 正在为主网上线前的最后阶段做准备&#xff0c;据悉该链更新了全新的测试网&#xff0c;在此前版本的测试网的基础上进行了全新的技术升级&#xff0c;最新测试网版本与生态发展的技术规划更为贴近。本次测试网升级将会是最后一次测试网版本的迭…

MacOS上安装Portainer

Portainer介绍 Portainer 是一个很方便的 Docker 可视化管理工具。主要的功能包括: 管理 Docker 主机,可以添加和删除 Docker 主机管理容器,可以启动、停止、删除等容器管理镜像,可以搜索、拉取、删除镜像管理卷,可以查看、删除卷管理网络,可以创建 Docker 网络管理用户和角色…

Redis数据持久化

Redis数据持久化 redis一共提供了两种数据持久化的方式RDB和AOF。 RDB ​ RDB全称为Redis Database Backup file&#xff08;数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是将内存中的全部数据都记录到磁盘中&#xff0c;当redis发生宕机或是一些…

VSCode种git rebase分支冲突解决无法继续rebase

情景&#xff1a; 常规来说我们git开分支开发完新功能之后&#xff0c;提交之前rebase dev分支&#xff0c;然后合并到dev上算是开发完成。 问题还原&#xff1a; 在开发完之后执行如下指令&#xff1a; 1.执行变基操作&#xff1a;git rebase dev。 //这一步出现冲突vscode上…

微信小程序基于Promise封装发起网络请求

1.创建一个request.js // 相当于域名 const baseURL ***************; // 暴露一个request函数 export function request(parms) {// 路径拼接const url baseURL parms.url;// 请求体&#xff0c;默认为{}const data parms.data || {};// 请求方式&#xff0c;默认为GETco…

HTTPS详解

1 概述 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密&#xff0c;而加密过程是使用了非对称加密实现。但其实&#xff0c;HTTPS 在内容传输的加密上使用的是对称加密&#xff0c;非对称加密只作用在证书验证阶段。 2 HTTPS请求过程 HTTPS的整体过程分为…

【FAQ】API6低代码开发问题汇总

参考文档&#xff1a; 低代码开发参考文档&#xff1a; 文档中心:使用低代码进行开发 基于景区模板开发元服务&#xff1a; 文档中心:模板简介 使用API6低代码开发遇到的问题汇总情况如下&#xff1a; 1、低代码环境下&#xff0c;如何实现box-shadow阴影效果的配置&#…

Angular 调试工具(Augury)

目录 1、简介 2、检验代码 3、Angury 本地构建和安装 3.1 添加到Chrome 浏览器&#xff1a; 3.2 添加到Firefox浏览器 4、项目中对应的Npm脚本 5、Augury 三大主要功能 5.1 组件树&#xff08;Component Tree&#xff09; 5.1.1 Component Tree 5.2 路由树&#xff0…

带记忆的Transformer模块

MEMORIZING TRANSFORMERS 返回论文和资料目录 论文地址 1.导读 谷歌去年做的一个工作。内容很简单&#xff0c;在Transformer模块中加入了一层记忆层&#xff0c;结果表明这个方法可以帮助模型提高在NLP任务上的表现&#xff1a;generic webtext (C4), math papers (arXiv),…

Generative Adversarial Network

Goodfellow,2014年 文献阅读笔记--GAN--Generative Adversarial NetworkGAN的原始论文-组会讲解_gan英文论文_Flying Warrior的博客-CSDN博客 启发:如何看两个数据是否来自同一个分布? 在统计中,two sample test。训练一个二分类的分类器,如果能分开这两个数据,说明来自…

数据库复习

select 查询 字段别名用 as (可以为中文) 例如 select distinct 关键字 去重复值 例如select distinct deptno from test where 条件过滤 and or 和 not运算符 and同时成立 or有一个成立就可以了 优先级and>or>not不符合&#xff08;!&#xff09; in 匹配多个值 selec…