文章目录
参考尚硅谷
1.为什么要有Sentinel?
之前我们对微服务进行监控,速率控制,服务熔断,服务降级等等都是通过Hystrix来进行的,而Hystrix需要我们程序员自己手工搭建监控平台没有一套Web界面来给我们进行更加细粒度化的配置流控速率控制,服务熔断,服务降级。。。。。现在Sentinel的出现解决了这些问题,它提供了直接界面化的细粒度统一配置。
2.Sentinel下载安装运行
到他的官网github上下载,https://github.com/alibaba/Sentinel/releases/tag/1.7.0,找到那个jar包,下载到本地,然后在命令行中输入java -jar sentinel-dashboard-1.7.0.jar,运行
然后再浏览器中输入http://localhost:8080
看到这个说明安装运行成功。输入用户名密码(sentinel,sentinel)即可登录
3.Sentinel监控
3.1初始化
首先我们新建一个Module,新开一个微服务,并且把这个微服务注册到Nacos中,然后用Sentinel监控他。
在pom中必须导入这三个依赖
<!-- SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud ailibaba sentinel-datasource-nacos 后续sentinel做持久化用到 -->
<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>
新建yml
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${
spring.application.name}
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
management:
endpoints:
web:
exposure:
include: '*'
这个微服务的端口号是8401,然后我要把他注册进Nacos中,所以要配一个nacos,然后将它用Sentinel进行监控,所以要配一个sentinel的配置。最后那段management是暴露监控端点的。
然后新建主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class CloudalibabaSentinelService8401Application {
public static void main(String[] args) {
SpringApplication.run(CloudalibabaSentinelService8401Application.class, args);
System.out.println("启动成功");
}
}
controller
@RestController
@Slf4j
public class FlowLimitController {
@GetMapping("/testA")
public String testA() {
return "------testA";
}
@GetMapping("/testB")
public String testB() {
return "------testB";
}
}
然后启动这个微服务,启动之后登录Nacos查看服务管理能看到这个服务已经被注册到Nacos中
然后看看他能不能被Sentinel监控到登录Sentinel
发现空空如也,这是因为Sentinel采用了懒加载,你访问一下接口他就会出来
然后我们就能在Web界面上看到这个接口的监控效果。
3.2 Sentinel流控规则
3.2.1 QPS直接限流
这个流控模式有三种
1.直接:api达到限流条件直接限流
2.关联:当关联的阈值达到阈值时就限流自己
3.链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)。
资源名就是那个接口的地址,QPS是每秒点击的次数,我配的是1说明我每秒钟最多访问1次,超过了这个阈值就会被限流(如下图所示)。
3.2.2线程数直接限流
我们在流控配置界面里选择的阈值类型改成线程数,然后阈值改为1,当调用api的线程数达到阈值的时候,进行限流。为了测试我们可以在那个接口中加一些延迟。
@GetMapping("/testA")
public String testA() {
// 测试阈值类型:线程数
try {
TimeUnit.MILLISECONDS.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "------testA";
}
我们先点一下这个接口然后他会阻塞,在这个过程中我们另起一个访问该接口这就意味着有两个线程同时访问了这个接口,我们配置的阈值数是1现在有两个线程所以就是有一个能访问一个被限流。
3.2.3流控模式之关联
首先一点何为关联当流控达到阈值的时候就限流自己, 这个就相当于连坐,比如说你和你同桌打架,明明这事儿不赖你,其实是赖他,但是呢老师在认定责任的时候会认定为这是一起互殴的“刑事案件”,你也得跟着挨说,就相当于B惹事A挂了。这个主要应用在这样一种情形,有一个支付接口它挂了,下订单接口跟着一块挂。
然后我们在sentinel的web界面上配置一下关联模式的流控。
这个说明当B资源每秒钟点击数大于1A就会被限流。一会我们密集访问B,最后你会发现A居然挂了。我们用postman来模拟这个过程,
首先新建一个collection输上url,然后配置一下具体几个线程多长时间访问一次。
这里我们设置成20个线程每隔0.3秒访问一次。然后我们看一下结果
B满了A就挂了。
3.2.4流控效果之预热
Warm up方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能把整个系统压垮。通过冷启动,让通过的流量缓慢增加,在一定时间内增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。来看一个例子
Warm up有一个默认的coldFactor为3,即请求QPS从(threshold/3)开始,这个案例就是阈值为10预热时长设置为5s,系统初始化的阈值就是3