本文主要是介绍阿里的Sentinel流量防卫兵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Sentinel是什么鬼?又要学习新的技术了。
请点击输入图片描述
每当看到这个图,我又开始学习之路了。
请点击输入图片描述
请点击输入图片描述
Sentinel
随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。 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: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
controller
@RestController
public 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其他内容。
这篇关于阿里的Sentinel流量防卫兵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!