随着微服务的流行,服务和服务之间的稳定性变得越来来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel主要特征
Sen分为两个部分:
下载Sentinel:https://github.com/alibaba/Sentinel/releases/tag/1.7.0
运行命令
java -jar sentinel-dashboard-1.7.0.jar
在浏览器中运行localhost:8080
用户名和密码是:sentinel
运行成功
创建子项目(cloudalibaba-sentinel-service8401)
pom.xml
<dependencies>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- SpringBoot整合Web组件+actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
创建配置文件application.yml
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719 #默认8719端口,如果被占用会自动从8719开始依次+1,直到找到未被占用的端口
#8719端口是应用和Sentinel控制台交互的端口
management:
endpoints:
web:
exposure:
include: ‘*‘
创建主启动类MainApp8401
@SpringBootApplication
@EnableDiscoveryClient
public class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class,args);
}
}
创建业务类FlowLimitController
@RestController
@RefreshScope
public class FlowLimitController {
@GetMapping("/testA")
public String testA() {
return "***************testA*****************";
}
@GetMapping("/testB")
public String testB() {
return "***************testB*****************";
}
}
运行
在此页面
新增流控规则
表示1s内查询一次就是正常,若超过一次,就直接快速失败,报默认错误
新增流控规则
模拟线程休息时间FlowLimitController
@RestController
@RefreshScope
public class FlowLimitController {
@GetMapping("/testA")
public String testA() {
try {
TimeUnit.MILLISECONDS.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "***************testA*****************";
}
@GetMapping("/testB")
public String testB() {
return "***************testB*****************";
}
}
当两个同时多次访问的时候就会报异常。
当关联的资源达到阈值是,就限流自己。
当与A关联的资源B达到阈值后,A就会限流
当关联资源/testB的qps阈值超过1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名。
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值。
Warm Up方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮
在5s之前阈值为3,5s后阈值为10
匀速排队,让请求以匀速的速度通过,阈值类型必须设置成QPS,否则无效
匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏铜算法。
这种方式主要用于处理间隔突发的流量,例如消息队列。假如在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多与请求。
/testA每秒1次,超过的话就排队等待,等待的超时时间为20000毫秒。
原文:https://www.cnblogs.com/striver20/p/13966807.html