Sentinel服务限流、降级、热点规则
git地址:
中⽂⽂档:
sentinel实际和hystrix的作⽤⼀样,实现服务降级、熔断等。但是hystrix的不⾜之处⼤概有:1.需要程序员⼿⼯搭建监控平台;2.没有⼀套web界⾯可以给我们进⾏细粒度化的配置。Sentinel也是实现流量控制、速率控制、服务熔断、服务降级。Sentinel有的优点如下:1.单独的组件,可以独⽴出来。2.直接界⾯化的细粒度统⼀配置。
1.下载安装
1.下载jar包
到git 下载即可。例如我下载的是:
sentinel-dashboard-1.8.0.jar
2. 启动
直接以jar包的⽅式运⾏即可。
java -jar ./sentinel-dashboard-1.8.0.jar
3.访问即可
默认的端⼝是8080,启动后访问,登录: sentinel/sentinel
2. 新建项⽬使⽤sentinel初始化监控
新建⼀个项⽬,注册中⼼为nacos,端⼝8848;熔断流量监控使⽤sentinel,端⼝8080.
1.新建项⽬cloudalibaba-sentinel-service8401
2.修改pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud</artifactId>
<groupId>cn.qz.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-sentinel-service8401</artifactId>
<dependencies>
<!--引⼊⾃⼰抽取的⼯具包-->
<dependency>
<groupId>cn.qz.cloud</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>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>
</project>
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中⼼地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
# 默认就是8719端⼝,如果占⽤会依次+1开始扫描
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
4.主启动类
package cn.qz.cloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /**
* @Author: qlq
* @Description
* @Date: 22:06 2020/11/25
*/
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
5.测试Controller
package cn.qz.ller;
import cn.qz.cloud.utils.JSONResultUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: qlq
* @Description
* @Date: 22:07 2020/11/25
*/
@RestController
public class FlowLimitController {
@GetMapping("/testA")
public JSONResultUtil<String> testA() {
return JSONResultUtil.successWithData("testA");
}
@GetMapping("/testB")
public JSONResultUtil<String> testB() {
return JSONResultUtil.successWithData("testB");
}
}
6.启动后到nacos查看服务列表
7. 访问sentinel
需要注意sentinel采⽤的是懒加载,如果直接启动服务没有访问,sentinel是不会拦截到请求的。所以需要访问⼏次服务然后到sentinel中查看。sentinel控制台如下:
3. sentinel流控
1.实时监控
可以实时的查看每个请求的访问QPS情况。
2.簇点链路
和上⾯1差不多。展⽰最近的访问情况。
3.流控规则
新增流控规则的时候,界⾯如下:
概念性问题:
资源名:唯⼀名称,默认请求路径
针对来源:Sentinel可以针对调⽤者进⾏限流,填写微服务名,默认default(不区分来源)
阈值类型/单机阈值
(1)QPS(每秒钟的请求数):当掉该api达到阈值的时候,进⾏限流
(2)线程数:当调⽤该API的线程数达到阈值时,进⾏限流
是否集:不需要集
流控模式
(1)直接:直接限流
(2)关联:当关联的资源达到阈值时,限流⾃⼰
(3)链路:只记录指定链路上的流量(指定资源从⼊⼝资源进来的流量,如果达到阈值,就进⾏限流)【api级别的针对来源】
流控效果
(1)快速失败:直接失败,抛异常
(2)Warm up:根据code Factor(冷加载印⼦,默认3)的值,从阈值/cedeFactor,经过预热时长,才达到预设的QPS
(3)排队等待:匀速排队,让请求匀速的通过,阈值类型必须设置QPS。否则⽆效。
4. 流控模式使⽤
1. QPS 快速失败
多次访问查看结果如下:
2. 线程数直接失败
这个是接收请求,但是当处理的线程数超过1的时候报上⾯的【Blocked by Sentinel (flow limiting)】。和
上⾯不同的是这个允许请求进去,上⾯是达到阈值就不让请求进去。
3.关联流控
关联流控就是关联的资源达到阈值,限流⾃⼰。⽐如如下:当B超过QPS为1之后,A限流:
springcloud和springboot测试⽅法:
(1) 使⽤postman或者jmeter并发访问testB,如下:加到collections中,然后没300ms访问⼀次,访问30次
(2)访问A发现A阻塞
4. 链路流控规则
(1)查看簇点链路,/testA的资源⼊⼝是sentinel_web_servlet_context
(2) 对A进⾏链路流控
(3)频繁访问会报Blocked by Sentinel (flow limiting)
5. 流控效果
1.直接快速失败
默认的就是快速失败,抛出阻塞信息。实现类是 com.alibaba.csp.sentinel.slots.ller.DefaultController
2.warm up预热: com.alibaba.csp.sentinel.slots.ller.DefaultController.WarmUpController
根据code Factor(冷加载印⼦,默认3)的值,从阈值/cedeFactor,经过预热时长,才达到预设的QPS。⽐如下⾯规则表⽰:初始的时候阈值是10/3 = 3 ;5s的预热时间达到10。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论