上一篇 <<<Sentinel的热点词限流
下一篇 >>>Sentinel策略的持久化方式
sentinel的限流方式包括手动硬编码限流、配置+注解限流,也可以直接在控制台上进行操作,支持对QPS和线程数进行控制。
1.限流配置
QPS:每秒钟请求数
线程数:类似于信号量,总共允许多少线程访问。
2.手动限流
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务保护包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<!--监控包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
server:
port: 8089
spring:
application:
name: sentinel-test
cloud:
nacos:
discovery:
server-addr: 10.211.55.16:8848
@RestController
public class ManualController {
private static final String GETORDER_KEY = "getOrder";
/**
* 限流规则,由于限流默认不支持持久化,可以将这段代码封装到ApplicationRunner实现类,即可完成启动即生效
* @return
*/
@RequestMapping("/initFlowQpsRule")
public String initFlowQpsRule() {
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule1 = new FlowRule();
rule1.setResource(GETORDER_KEY);
// QPS控制在2以内
rule1.setCount(1);
// QPS限流
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);
return "....限流配置初始化成功..";
}
/**
* 限流案例
* @return
*/
@RequestMapping("/getOrder")
public String getOrders() {
Entry entry = null;
try {
entry = SphU.entry(GETORDER_KEY);
// 执行我们服务需要保护的业务逻辑
return "getOrder接口";
} catch (Exception e) {
e.printStackTrace();
return "该服务接口已经达到上线!";
} finally {
// SphU.entry(xxx) 需要与 entry.exit() 成对出现,否则会导致调用链记录异常
if (entry != null) {
entry.exit();
}
}
}
}
3.注解限流@SentinelResource
/**
* 经过测试,限流都走到了blockHandler的方法中,异常类为:FlowException
*
* @param value 流量规则资源名称---和手动一样,规则必须要先创建并加载才起效果
* @param blockHandler 限流/熔断出现异常执行的方法
* @param fallback 服务的降级执行的方法
* @return
*/
@SentinelResource(value = "getOrder", blockHandler = "getOrderQpsException",fallback = "getOrderFallbackException")
@RequestMapping("/getOrderAnnotation")
public String getOrderAnnotation() {
return "getOrder接口";
}
public String getOrderQpsException(BlockException e) {
e.printStackTrace();
return "服务限流异常了!";
}
public String getOrderFallbackException(Exception e){
return "服务降级了";
}
4.控制台方式创建限流规则
spring:
application:
name: sentinel-test
cloud:
nacos:
discovery:
server-addr: 10.211.55.16:8848
###增加sentinel控制台的链接
sentinel:
transport:
dashboard: localhost:8718
eager: true
@RestController
public class DashboardController {
/**
* 注意情况:
* 1、Sentinel没有持久化功能,服务重启后,原有配置的流控信息均没了
*
* 2、只加@SentinelResource,后面参数不带任何参数
* a、value默认为请求方法名,带斜杠,eg:"/getOrderThrad"
* b、异常信息客户端展示:Blocked by Sentinel (flow limiting)
*
* 3、@SentinelResource 后面的value值一旦设置,则控制台的值必须和value一直,且不带斜杠
*
*/
@SentinelResource(value = "getOrderThrad",blockHandler = "getOrderQpsException")
@RequestMapping("/getOrderThrad")
public String getOrderThrad() {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (Exception e) {
}
return "getOrderThrad";
}
public String getOrderQpsException(BlockException e) {
e.printStackTrace();
return "服务限流异常了!";
}
}
推荐阅读:
<<<Hystrix功能介绍
<<<Sentinel功能介绍
<<<Sentinel与Hytrix区别
<<<Sentinel的熔断降级策略
<<<Sentinel的热点词限流
<<<Sentinel策略的持久化方式
<<<Sentinel整合nacos实现策略持久化
<<<Sentinel整合网关服务核心代码
<<<Sentinel环境搭建
网友评论