这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
学习视频(B站):www.bilibili.com/video/BV1Mt…
GitHub 源码地址:github.com/tyronczt/sp…
简介
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
雪崩效应
如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住。堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。
解决方案
- 设置线程超时
- 设置限流
- 熔断器 Sentinel、Hystrix
- 降级:在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)
- 限流:服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶,计数器也可以进行粗暴限流实现。
- 熔断:熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。
集成Sentinel
- provider 的 pom.xml 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
- application.yml 配置
# 配置限流路径
management:
endpoints:
web:
exposure:
include: "*"
# sentinel的控制面板路径
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
复制代码
- 下载 Sentinel 控制台,解压,启动,下载地址:github.com/alibaba/Sen…
用户名/密码:sentinel/sentinel
实时监控
当访问provider项目中index接口时 [http://localhost:3333/index],sentinel会将流量实时记录,每十秒刷新:
簇点链路
流控规则
一般阈值类型选择QPS(Query Per Second每秒查询率)
直接限流
选择单机阈值为1时,即表示每秒查询超过1时,即被流量限制,默认提示:Blocked by Sentinel (flow limiting)
关联限流
流控模式为 **关联 **时,输入关联资源,如list,即效果为:当list超过阈值时,index限制访问
模拟访问list接口:
public static void main(String[] args) throws InterruptedException {
RestTemplate restTemplate = new RestTemplate();
for (int i = 0; i < 1000; i++) {
restTemplate.getForEntity("http://localhost:3333/list",String.class);
Thread.sleep(200);
}
}
复制代码
效果:
链路限流
主要对service或dao层的接口进行限流保护。
pom.xml 添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>1.7.1</version>
</dependency>
复制代码
修改配置文件application.yml
spring:
cloud:
sentinel:
filter:
enabled: false
复制代码
添加配置类
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new CommonFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
registrationBean.setName("sentinelFilter");
return registrationBean;
}
}
复制代码
Service层
@Service
public class ProviderService {
@SentinelResource("provider")
public String provider(){
return "ProviderService";
}
}
复制代码
Controller层
@Autowired
private ProviderService providerService;
@GetMapping("/provider1")
public String provider1() {
return providerService.provider();
}
@GetMapping("/provider2")
public String provider2() {
return providerService.provider();
}
复制代码
配置规则