基本使用不需要下载Sentienl,直接用依赖即可
步骤:创建本地应用、搭建本地Sentienl控制台、本地接入控制台
先创建springboot项目,引入依赖
<dependencies>
<!--Sentienl依赖-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
创建控制层,测试
package com.lzq.controller;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@RestController
public class TestController {
@GetMapping("hello")
public String hello(){
try {
//限流入口
Entry entry = SphU.entry("Hello");{ //限流入口
return "hello";
}
} catch (BlockException e) {
e.printStackTrace();
return "系统繁忙"; //限流或者降级处理
}
}
//定义限流规则
@PostConstruct //当前类构造函数执行后执行
public void initRules(){
//创建存放限流规则的集合
List<FlowRule> rules= new ArrayList<>();
//创建限流规则
FlowRule rule = new FlowRule();
rule.setResource("Hello");//定义对那个资源生效
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//蒂尼限流类型
rule.setCount(2);//设置qps值
rules.add(rule); //将规则放在集合中
//加载限流规则
FlowRuleManager.loadRules(rules);
}
}
此时访问即可实现限流操作
使用开源控制台
官网下载好开源jar包,启动,cmd命令启动
java -Dserver.port=8080 -jar sentinel-dashboard-1.8.1.jar
浏览器输入网址即可进入
本地连接sentinel控制台,引入对应依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.1</version>
</dependency>
设置JVM启动参数:
-Dcsp.sentinel.dashboard.server=localhost:8080
此时访问控制层http://localhost:9090/hello就可以发现已经接入Sentinel
此时注释掉本地的限流规则,在控制台动态设置规则
sentinel定义资源的方式
1.抛出异常、2.返回布尔值、3.异步调用、4.注解、5.主流框架
抛出异常方式就是上面的例子
返回布尔值:
@RestController
public class TestController {
@GetMapping("boolean")
public boolean hello(){
if (SphO.entry("boolean")){
try{
System.out.println("boolean");
return true;
}finally {
SphO.exit();//限流出口
}
}else {
//限流或者降级
System.out.println("业务繁忙");
return false;
}
}
}
在控制台设置限流规则
异步调用
在主类加上注解,开启异步支持
@EnableAsync
创建service
@Service
public class AsyncService {
@Async
public void hello(){
System.out.println("异步开启");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("异步结束");
}
}
控制层
@RestController
public class TestController {
@Autowired
private AsyncService asyncService;
@GetMapping("async")
public void hello(){
//使用限流规则
AsyncEntry asyncEntry = null;
try {
SphU.asyncEntry("Sentinel_Async");
asyncService.hello();
} catch (BlockException e) {
System.out.println("系统繁忙");
}finally {
if (asyncEntry != null){
asyncEntry.exit();
}
}
}
}
注解定义
因为Sentinel中使用AspectJ的扩展自动定义资源、处理BlockException等,所以需要引入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.1</version>
</dependency>
创建对应配置类
@Configuration
public class SentinelAspect {
@Bean
public SentinelResourceAspect sentinelResourceAspect(){
return new SentinelResourceAspect();
}
}
控制层
@RestController
public class TestController {
//定义资源名称 设置限流处理函数
@SentinelResource(value = "Sentinel_Ann",blockHandler = "exceptionHandler")
@GetMapping("ann")
public String hello(){
return "ann";
}
public String exceptionHandler(BlockException e){
e.printStackTrace();
return "系统繁忙";
}
}
流控规则
流量控制原理是监控流量的qps或并发线程数等,当达到阈值是对流量进行控制,避免瞬时流量,保证高可用性
流控规则可设置:
resource:资源名、count:限流阈值、grade:阈值类型、limitApp:流控来源、strategy:调用关系
流量控制效果:直接拒绝、Warm Up(冷启动,在一定时间逐渐增加阈值到上线)、匀速排队
熔断降级实现
在某个资源出现不稳定状态时,对资源调用进行限制,让其快速失败,避免影响其他资源导致级联错误,在降级时间窗口内,对该资源的调用都自动熔断
属性:resource、count、grate:熔断策略、timeWindow:降级时间、rtAlowRequestAmount:每秒请求阈值、minRequestAmount:熔断触发最小请求数
熔断策略:
DEGRADE_GRADE_RT:平均响应时间超过阈值会自动熔断抛出异常
DEGRADE_GRADE_EXCEPTION_RATIO:异常比例,当请求量大于阈值异常超过阈值熔断
DEGRADE_GRADE_EXCEPTION_COUNT:分钟异常数,统计异常是分钟级别
自适应保护
从应用入口流量进行控制,结合Load、cpu使用率、平均RT、入口qps和并发线程数作为监控指标,通过自适应流控策略,让系统入口流量和负载达到一个平衡。
授权控制
设置访问来源,设置白名单与黑名单,若请求在黑名单时不予通过
属性:resource、limitApp:白名单/黑名单,多个用逗号分隔、strategy:限制模式,默认白名单模式
动态规则扩展
动态规则源动态设置规则,通过控制台设置规则推送到规则管理中心,客户端十点接口监听规则中心实时变更
拉取方式:客户端主动向规则管理中心拉取规则;继承AutoRefreshDataSource抽象类,实现readSource()方法
推送方式:客户端通过监听器监听变化,好处:实时性、一直性
熔断降级概念
Sentienl与Hystrix采用不一样的方法
Hystrix通过线程池隔离的方式,对依赖进行隔离,好处是资源和资源做到了彻底的隔离,但是增加线程切换的成本
Sentienl
:通过并发线程数进行限制,没有损耗,也不需要预先分配线程池的大小
:通过响应时间降级,当资源不稳定访问时间长进行降级,过了指定时间窗口才重新恢复
|