文章目录
- 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已经实现好了
外传
😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥