随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。 Sentinel是强大的流控制组件,以“流”为切入点,涵盖多个领域,包括流控制,并发限制,熔断和自适应系统保护,以确保微服务的可靠性。
2012年,Sentinel诞生于阿里巴巴,其主要目标是流量控制。2013-2017年,Sentinel迅速发展,并成为阿里巴巴所有微服务的基本组成部分。 它已在6000多个应用程序中使用,涵盖了几乎所有核心电子商务场景。2018年,Sentinel演变为一个开源项目。2020年,Sentinel Golang发布。
Sentinel的生态圈
Sentinel 主要特性
Sentinel 的使用可以分为两个部分:
核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。控制台(Dashboard):控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。在这里我们看下控制台的使用
控制台安装
下载地址:https://github.com/alibaba/Sentinel/releases,sentinel-dashboard-1.7.2.jar
本地需要先安装好Java8环境,8080端口没被占用。
cmd安装目录,运行命令java -jar sentinel-dashboard-1.7.2.jar
访问http://localhost:8080/
默认账号密码都为sentinel,登陆进去,控制台安装完毕。
功能使用
还是以之前讲解Nacos的项目,讲解sentinel的使用,新建一个模块cloudalibaba-sentinel-8401。
引入依赖
<!-- 引入自己定义的通用包--> <dependency> <artifactId>springcloud-commom</artifactId> <groupId>com.learn.springcloud</groupId><version>1.0-SNAPSHOT</version> </dependency> <!--SpringCloud ailibaba nacos --> <dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--SpringCloud ailibaba sentinel --> <dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</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>
添加配置文件application.yml
server:port: 8401spring: application: name: cloudalibaba-sentinel-service cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 sentinel: transport: dashboard: localhost:8080 #配置Sentinel dashboard地址 port: 8719management: endpoints: web:exposure: include: '*'
controller
@RestControllerpublic class FlowLimitController {@GetMapping("/test") public String testA() { return "------hello sentinel-----------"; }}
启动类添加@EnableDiscoveryClient注解,先启动nacos,启动项目。
启动成功,服务已注册到nacos。
访问请求,http://localhost:8401/test。
刷新sentinel控制台,点击簇点链路。
点击流控,或下面的流控规则。那具体这些是干嘛用的?下面将一一介绍。
流控规则
资源名:唯一名称,默认请求路径
针对卡片:Sentinel可以针对调用者进行限流,填写微服务名,默认为default(不区分来源)
阈值类型/单机阈值:
1.QPS:每秒请求数,当前调用该api的QPS到达阈值的时候进行限流
2.线程数:当调用该api的线程数到达阈值的时候,进行限流
是否集群:是否为集群
流控模式:
1.直接:当api大达到限流条件时,直接限流
2.关联:当关联的资源到达阈值,就限流自己
3.链路:只记录指定路上的流量,指定资源从入口资源进来的流量,如果达到阈值,就进行限流,api级别的限流
举例,先看流控模式为直接
选择QPS,直接,快速失败,单机阈值为1。
频繁刷新请求,1秒访问1次请求,正常,超过设置的阈值,将报默认的错误。
再次的1秒访问1次请求,访问正常。
流控模式为关联
添加一个请求
@GetMapping("/testGualian")public String testGualian(){return "------testGualian-----------";}
选择QPS,单机阈值为1,选择关联,关联资源为/testGualian,这里用Jmeter模拟高并发,请求/testGualian。
在大批量线程高并发访问/testGualian,导致/test失效了
链路就不再演示了。多个请求调用同一微服务。
流控模式为Warm up(预热)
当流量突然增大的时候,我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓步的增多,经过预期的时间以后,到达系统处理请求个数的最大值。Warm Up(冷启动,预热)模式就是为了实现这个目的的。
默认 coldFactor 为 3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。
先在单机阈值10/3,3的时候,预热5秒后,慢慢将阈值升至10。刚开始刷/test,会出现默认错误,预热时间到了后,阈值增加,没超过阈值刷新,请求正常。
通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:
如秒杀系统在开启瞬间,会有很多流量上来,很可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。
流控模式为排队等待
匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。阈值必须设置为QPS。
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
总结
到这已经学习Sentinel的基本的使用,在很多的特性和Hystrix有很多类似的功能。以下是Sentinel和Hystrix的对比。
后续将介绍Sentinel其他内容。