Sentinel
- Sentinel前期准备
- 一. Sentinel限流入门
- 1. 添加依赖
- 2.修改配置文件
- 3.创建限流操作的Controller对象
- 4.访问服务
- 5.设置流控
- 二. Sentinel流控规则
- 设置限流模式
- 1. 关联限流
- 2. 链路限流
- 三. Sentinel降级规则
- 1.编写慢调用方法
- 2. 配置降级
- 3. 测试
- Sentinel异常处理
- 1. 创建拦截器对象
- 2.配置拦截器
- 3 . 检测拦截器的执行
- 四. Sentinel热点数据限流
- 五. Sentinel系统规则应用
- 五. sentinel授权规则应用
Sentinel前期准备
- 下载地址:
https://github.com/alibaba/Sentinel/releases
注意:要下载Jar包
- 在sentinel的jar目录下cmd执行如下命令:
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
**注意:**根据自己的jar版本号执行命令
- 访问Sentinal服务
默认网址:
http://localhost:8180
默认账户和密码:sentinel
一. Sentinel限流入门
1. 添加依赖
<!--sentinel依赖,添加了此依赖以后,会在项目中添加一个拦截器对象,这个对象会对
向此服务发出的请求,进行拦截,拦截到请求以后会与sentinel控制台定义的限流规则进行比对,
假如在允许范围之内,则继续访问,否则进行限流或降级等操作-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.修改配置文件
- 在提供方添加配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8180 #这里描述的n是sentinel控制台的地址
eager: true #服务启动以后,就会sentinel控制台发送一个心跳消息
3.创建限流操作的Controller对象
- 在提供方添加
package com.jt.provider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderSentinelController {
@GetMapping("/sentinel01")
public String doSentinel01(){
return "sentinel 01 test ...";
}
}
4.访问服务
- 启动sca-provider服务,然后对指定服务进行访问
- 刷新sentinel 控制台,实时监控信息,如图
5.设置流控
- 在对应路径下,选流控
- 设置限流策略:直接先流(默认)
- 反复刷新访问消费端端服务,检测是否有限流信息输出,如图所示
二. Sentinel流控规则
设置限流模式
1. 关联限流
- 在ProviderSentinelController中添加一个方法
@GetMapping("/sentinel02")
public String doSentinel02(){
return "sentinel 02 test ...";
}
- 在sentinel中做限流设计,如下
3. 打开两个测试窗口,对/provider/sentinel02进行访问,检查/provider/sentinel01的状态(手速要快啊!)
2. 链路限流
- 在指定包创建一个ResourceService类
package com.jt.provider.service;
@Service
public class ResourceService{
@SentinelResource("doGetResource")
public String doGetResource(){
return "doGetResource";
}
}
- 在ProviderSentinelController中添加一个方法
@Autowired
private ResourceService resourceService;
@GetMapping("/sentinel03")
public String doSentinel03() throws InterruptedException {
resourceService.doGetResource();
return "sentinel 03 test";
}
- 在sentinel中配置限流规则,如图
设置模式和参数 - 设置链路流控规则后,再频繁对限流链路进行访问,检测是否会出现500异常
- 添加配置
**说明:**流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在application.yml添加如下语句来关闭URL PATH聚合,如下:
三. Sentinel降级规则
1.编写慢调用方法
- 在ProviderController 类中添加doSentinel04方法,基于此方法演示慢调用过程下的限流
//AtomicLong 类支持线程安全的自增自减操作
private AtomicLong atomicLong=new AtomicLong(1);
@GetMapping("/sentinel04")
public String doSentinel04() throws InterruptedException {
//获取自增对象的值,然后再加1
long num=atomicLong.getAndIncrement();
if(num%2==0){//模拟50%的慢调用比例
Thread.sleep(200);
}
return "sentinel 04 test";
}
**说明:**我们在此方法中设置休眠,目的是为了演示慢调用(响应时间比较长).
2. 配置降级
选择要降级的链路
**提示:**这里表示熔断策略选择"慢调用比例",表示请求数超过3时,假如平均响应时间超过200毫秒的有30%,则对请求进行熔断,熔断时长为10秒钟,10秒以后恢复正常。
3. 测试
对指定链路进行刷新,多次访问测试,检测页面上是否会出现 Blocked By Sentinel (flow Limiting)内容即可.
Sentinel异常处理
1. 创建拦截器对象
- 基于Spring MVC中的拦截器实现对控制方法进行时间访问控制?
package com.jt.provider.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalTime;
/**
* Spring MVC 中的拦截器对象,
* 此对象可以在你执行目标Controller方法之前执行
*/
public class TimeInterceptor implements HandlerInterceptor {
/**
* 此方法在你执行的目标Controller方法之前执行
* @return 返回值true表示放行,可以继续执行request的后续业务
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("===preHandle===");
//业务:允许在8点之后,晚9点之前可访问
LocalTime now = LocalTime.now();//获取当前时间,
int hour = now.getHour();//获取当前时间的小时单位
if(hour<8||hour>=21)
throw new RuntimeException("请在规定时间访问8~21");
return true;
}
}
2.配置拦截器
package com.jt;
import com.jt.provider.interceptor.TimeInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TimeInterceptor())
.addPathPatterns("/provider/sentinel01");
}
}
3 . 检测拦截器的执行
对/provider/sentinel01路径按时间段进行访问,检测拦截器的执行.
四. Sentinel热点数据限流
五. Sentinel系统规则应用
五. sentinel授权规则应用