1、前言
这是《Spring Cloud 进阶》专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。
文章目录如下:
2、什么是sentinel?
sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
-
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
-
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
-
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
-
完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性如下图:
Sentinel 分为两个部分:
-
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
-
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
3、sentinel和Hystrix有何区别?
具体区别如下图:
4、sentinel版本如何选择?
这里选择的spring-cloud-alibaba-dependencies
的版本是2.2.1.RELEASE
,因此sentinel版本选择1.7.1
,大家可以根据自己的版本选择对应sentinel的版本,版本对应关系如下图:
注意:一定要按照官方推荐的版本适配,否则出现意想不到的BUG追悔莫及.........
5、Sentinel 控制台如何安装?
sentinel和nacos一样,都有一个控制台,但是这里不用自己手动搭建一个微服务,官方已经搭建好了,只需要下载对应得jar包运行即可。下载地址:https://github.com/alibaba/Sentinel/tags
选择对应得版本下载即可,我这里选择1.7.1
版本,下载的jar包如下图:
当然你可以通过源码构建:mvn clean package
注意:JDK版本必须>=1.8
此时我们只需要运行这个jar包即可,命令如下:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar
上述参数含义如下:
-
-Dserver.port
:指定启动的端口,默认8080
-
-Dproject.name
:指定本服务的名称 -
-Dcsp.sentinel.dashboard.server
:指定sentinel控制台的地址,用于将自己注册进入实现监控自己
启动成功之后,浏览器访问:http://localhost:8080,登录页面如下图:
默认的用户名和密码:sentinel/sentinel
登录成功之后页面如下:
可以看到目前只有一个服务sentinel-dashboard
被监控了,这个服务就是自己。
注意:上述参数都是可选的,没必要可以不填。
那么问题来了:默认的用户名和密码在生产环境上肯定不能用,如何修改呢?
从 Sentinel 1.6.0 起sentinel已经支持自定义用户名和密码了,只需要在执行jar命令时指定即可,命令如下:
java -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123 -jar sentinel-dashboard-1.7.1.jar
用户可以通过如下参数进行配置:
-
-Dsentinel.dashboard.auth.username=sentinel
用于指定控制台的登录用户名为sentinel
; -
-Dsentinel.dashboard.auth.password=123456
用于指定控制台的登录密码为123456
;如果省略这两个参数,默认用户和密码均为sentinel
; -
-Dserver.servlet.session.timeout=7200
用于指定 Spring Boot 服务端 session 的过期时间,如7200
表示 7200 秒;60m
表示 60 分钟,默认为 30 分钟;
注意:部署多台控制台时,session 默认不会在各实例之间共享,这一块需要自行改造。
除了用户名密码相关的配置,sentinel控制台还提供了其他的可配置选项,如下图:
6、微服务如何接入sentinel控制台?
微服务为什么要集成sentinel控制台,sentinel不是提供了相关的API吗?
其实Spring Boot 官方一直提倡约定>配置>编码的规则,能够不硬编码何乐而不为呢?
因此本文后续内容主要还是结合sentinel控制台进行讲解,关于API的使用大家可以按照官方文档学习,讲解的非常清楚。
好了,言归正传,微服务如何接入sentinel控制台呢?
1、新建微服务模块注册进入Nacos
新建一个微服务模块:sentinel-service9008
相关配置如下:
server:
port: 9008
spring:
application:
## 指定服务名称,在nacos中的名字
name: sentinel-service
cloud:
nacos:
discovery:
# nacos的服务地址,nacos-server中IP地址:端口号
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
2、添加依赖
除了Nacos的依赖,还需要添加一个sentinel的依赖:
<!--sentinel的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3、添加配置集成控制台
只需要添加如下配置即可集成sentinel控制台:
spring:
cloud:
sentinel:
transport:
## 指定控制台的地址,默认端口8080
dashboard: localhost:8080
4、新建一个测试接口
下面新建一个测试接口,用于测试相关规则,如下:
@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {
@GetMapping("/test")
public String test(){
return "接收到一条消息--------";
}
}
5、启动微服务
启动9008这个微服务,然后浏览器输入:http://localhost:9008/sentinel/test
,此时查看sentinel控制台,将会看见sentinel-service这个服务已经被监控了,如下图:
注意:sentinel是懒加载机制,只有访问过一次的资源才会被监控。
不过可以通过配置关闭懒加载,在项目启动时就连接sentinel控制台,配置如下:
spring:
sentinel:
# 取消控制台懒加载,项目启动即连接Sentinel
eager: true
7、流量控制如何配置?
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
QPS:每秒请求数,即在不断向服务器发送请求的情况下,服务器每秒能够处理的请求数量。
并发线程数:指的是施压机施加的同时请求的线程数量。
同一个资源可以创建多条限流规则,一条限流规则由以下元素组成:
-
resource:资源名,即限流规则的作用对象。
-
count: 限流阈值
-
grade:限流阈值类型(1:QPS 0:并发线程数),默认值QPS
-
limitApp:流控针对的调用来源,若为
default
则不区分调用来源,默认值default -
strategy:判断的根据是资源自身**(0),还是根据其它关联资源 (1),还是根据链路入口(2)**,默认值根据资源本身。
-
controlBehavior: 流控效果(直接拒绝(0) / 排队等待(2) / 预热冷启动(1)),默认值直接拒绝。
以上元素限流元素对应的类是com.alibaba.csp.sentinel.slots.block.flow.FlowRule
,各元素如下图:
注意:各个元素的取值以及默认值一定要记住,后续配置将会用到。
以上几个元素在sentinel控制台对应规则如下图:
1、三种流控效果
流控效果总共分为三种,对应元素controlBehavior
,分别如下:
快速失败
默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException
。
warm up
即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
注意:这一效果只针对QPS流控,并发线程数流控不支持。
预热底层是根据令牌桶算法实现