Sentinel介绍
介绍 · alibaba/Sentinel Wiki · GitHub
1、Sentinel是什么
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促销流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可应用等。
- 完备的实时监控:Sentinel同时提供实时监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的整合模块,例如SpringCloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
- 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2、sentinel能干什么?
3、sentinel生态
sentinel安装
下载地址:Release v1.8.1 · alibaba/Sentinel · GitHub
运行jar包即可。
java -jar sentinel-dashboard-1.8.1.jar
java -jar sentinel-dashboard-1.8.1.jar &后台运行
java -jar sentinel-dashboard-1.8.1.jar>out.logs&后台运行并且输出日志到当前目录的out.logs中。
sentinel默认的端口号是8080,所以在启动之前确保8080端口没被占用。
访问sentinel:http://localhost:8080
默认的用户名和密码都是sentinel
sentinel监控服务
1、pom
<!-- nacos依赖-->
<dependency><groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
</dependency>
2、yaml
server:
port: 8086
spring:
application:
name: server-sentinel
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 把服务注册到nacos
sentinel:
eager: true # 服务启动的时候把服务名称发送给sentinel-dashboard
transport:
dashboard: localhost:888 # 让sentinel监测这个服务
port: 8719 # 与dashboard通讯的端口
management:
endpoints:
web :
exposure:
include: '*'
这里需要注意:项目集成sentinel,会占用一个端口开启http服务,用来发送心跳检测以检测健康状态,sentinel控制台默认占用的是8719;集成的项目中,会在8719端口以后自动寻找一个可用的端口,比如8720,8720不可用就会找8721,以此顺序往下找。
3、controller
@RestController
public class HelloController {
@GetMapping("/hello1")
public string hello1(){
return "hello1";
}
@GetMapping("/hello2")
public string hello2() {
return "hello2";
}
}
4、启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(scanBasePackages = "com.qf")
@EnableDiscoveryClient
public class ServerSentinelApplication {
public static void main(string[] args) {
SpringApplication.run(ServerSentinelApplication.class, args);
}
}
5、调用接口
http://localhost:8006/hello1
6、sentinel查看
sentinel采用的懒加载的模式,先要调用接口,才能看到流量接口。
Sentinel流控原理
1、服务启动sentinel-client把服务信息注册到sentinel-dashborad上面(如果eager为false第一次访问的时候注册)
2、在本机启动一个端口号和sentinel-dashboard通讯,默认是8719,如果被占用自动寻找可用端口8720,8721。。
3、用户访问服务,接着把服务地址推送给sentinel-dashboard,sentinel-dashboard上面就可以服务地址了。
4、用户在sentinel-dashboard上面配置流控规则,dashboard就会把流控规则通过8719端口推送到sentinel-client,
5、用户再次访问服务接口sentinel-client根据流控规则开始做流控
6、sentinel-client和dashboard失去心跳后,dashboard中的流控规则自动删除sentinel-client没有做持久化的前提下)
流控规则
流量控制 (flow control) ,其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的闻值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
1、限流规则
资源名
其实就是我们请求的资源路径
针对来源
这个是此流控规则对应那些微服务进行流控管理,一般填写调用方的微服务名称,多个用",“分割
闯值类型
1、QPS: 每秒的最大请求数,超过这个数量进行限流(外部限流)
2、线程数: 调用接口的最大线程数,超过这个数量进行限流(接口内部限流)
案例: 接口内休眠指定的时间在返回,启动两个浏览器同 时调用接口。
单机闯值
单机状态下的最大限制值
是否集群
根据实际情况选择
流控模式
直连: 一般是对自己本身资源的限制。
关联
/hello1关联/hello2,如果/hello2超过阈值就限流/hello1,在微服务中会存在多个服务调用来完成一个业务。如果支付服务失败了,就限流下单服务,不要有太多的订单生成,举例:如果地铁站台排队的人已经很多了,就要从外面限制进来的人了。
案例:使用jemeter调用/hello2使其达到阈值,然后用浏览器调用/hello1发现被限制了。
链路
当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。
SpringCloudAlibaba2.1.0中演示链路功能会存在版本的问题,所以需要把SpringCloudAlibaba升级成2.1.1才可以。
1、升级版本
<version>2.1.1.RELEASE</version>
2、关闭默认的filter
spring:
cloud:
sentinel:
filter:
enabled: false
3、自定义Filter
@Configuration
public class SentinelFilterConfig (
@Bean
public FilterRegistrationBean sentinelFilterRegistration(){
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new CommonFilter());
registration.addUrlpatterns("/*");
registration.addInitParameter(CommonFilter.WEB CONTEXT UNIFY,"false");
registration.setName("sentineFilter”);
registration.setOrder(1);
return registration;
}
}
流控效果
快速失败
快速失败 (RuleConstant.CONTROL BEHAVIOR DEFAULT) 方式是默认的流量控制方式,当QPS超过任意规则的闽值后,新的请求就会被立即拒绝,拒绝方式为抛出
Warm Up
即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动”,让通过的流量缓慢增加,在一定时间内逐渐增加到闻值上限给冷系统一个预热的时间,避免冷系统被压垮。开始的闻值是最大QPS闽值的1/3,然后慢慢增长,直到最大闻值,适用于将突然增大的流量转换为缓步增长的场景。
案例:定义一个接口,刚开始频繁访问,阈值是3所以拒绝此时很多,4s后阈值变为10,拒绝次数就变少了。
排队等待
匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,即是让请求以均匀的速度通过,对应的是漏铜算法。
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
每秒处理一个请求,其余请求等待,如果等待时间超过5s才拒绝。
案例:没有设置流控情况下使用Jmeter发送10个请求,发现3s的时间都处理完了,设置流控后发现1s处理一个请求,部分请求等待超时被拒绝了。