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: 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其他内容。

原文地址:https://www.cnblogs.com/dzcWeb/p/14313750.html