SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
一、Sentinel简介
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
1、sentinel的特征
- 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
- 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况
-
广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel
-完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等
2、sentinel的主要特性
sentinel的开源生态
sentinel 的架构图
3、sentinel的主要优势和特性
- 轻量级,核心库无多余依赖,性能损耗小
- 方便接入,开源生态广泛
- 丰富的流量控制场景
- 易用的控制台,提供实时监控、机器发现、规则管理等能力
- 完善的扩展性设计,提供多样化的 SPI 接口,方便用户根据需求给 Sentinel 添加自定义的逻辑
4、sentinel与spring cloud Hystrix 对比
Sentinel | Hystrix | |
隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持慢启动、匀速器模式 | 不支持 |
系统负载保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
5、sentinel分为两个部分
- 核心库(Java 客户端): 不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
- 控制台(Dashboard): 基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器
二、Sentinel安装与使用
1、Sentinel控制台的下载
下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3
我们选择1.8.3版本,直接下载jar包
放到指定文件夹中
2、Sentinel控制台的启动
cmd 启动jar包
java -jar sentinel-dashboard-1.8.3.jar
2、访问
浏览器输入:localhost:8080
账号密码 默认都是 sentinel
3、为服务打开sentinel的监控
引入sentinel依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>${spring-cloud-alibaba.version}</version> </dependency>
专栏的上一篇文章已经为项目引入了sentinel的依赖,以及介绍了feign的使用 感兴趣的可以跳转
手把手教你搭建springcloud alibaba微服务–openfeign
yml文件添加sentinel相关配置
server: port: 9090 spring: application: name: mdx-shop-user cloud: nacos: discovery: server-addr: localhost:8848 namespace: mdx group: mdx sentinel: transport: dashboard: localhost:8080 #配置Sentinel dashboard地址 feign: sentinel: enabled: true
启动user服务并访问user服务的测试接口
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("getOrderNo") public String getOrderNo(String userId,String tenantId,HttpServletRequest request){ return userService.getOrderNo(userId,tenantId,request); } }
浏览器访问
http://localhost:9090/user/getOrderNo?userId=mdx123456&tenantId=123
然后查看sentinel控制台
发现已经监控到了我们服务的接口
三、Sentinel的控制规则
1、流控规则
1.1、流控规则的各个属性
- 资源名: 唯一名称,默认请求路径,表示对该资源进行流控
- 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
- 阈值类型/单击阈值:
QPS:(每秒钟的请求数量):当调用该api的QPS达到阈值时,进行限流
线程数:当调用该线程数达到阈值的时候,进行限流 - 是否集群:不需要集群
- 流控模式:
直接: api达到限流条件时,直接限流
关联: 当关联的资源达到阈值时,就限流自己
链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】 - 流控效果:
快速失败: 直接失败,抛异常
Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFctor,经过预热时长,才达到设置的QPS阈值
排队等待: 匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
1.2、新增流控规则
资源名称就是我们的接口访问路径
然后我们一秒一次访问一下接口(正常)
http://localhost:9090/user/getOrderNo?userId=mdx123456&tenantId=123
可以看到正常返回数据
接下来我们快速请求接口,一秒钟点击多次
发现已经被限流了
1.3、流控规则–关联流控模式
我们模拟一下流控模式中的关联模式
关联: 当关联的资源达到阈值时,就限流自己,也就是说关联的资源(接口),QPS为1时,一秒内被多次请求的时候,自己的接口就会被限流。
我们在user服务中创建一个关联接口 /user/sentinelB
@GetMapping("sentinelB") public String sentinelB(){ return "我是关联接口"; }
然后修改一下流控规则
我们用jmeter模拟一下请求sentinelB接口
一秒3个请求并循环
在这期间我们访问/user/getOrderNo接口
发现被限流了
推荐阅读
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
谈API网关和应用网关--从技术选型谈起:API网关的性能是第一指标,一般会选择Kong、Apisix等基于OpenResty+Lua的高性能网关(得益于Ngnix基于C++的高性能无阻塞网络IO模型),应用网关一般是结合自身业务的技术栈来选择,比如SpringCloud Gateway、Zuul等。当然,这也不是绝对的,如果你对 Kong 非常熟悉,用它来做应用网关也不是不可能。
一些开源网关项目的例子:
Kong
Apisix
特使
Traefik
SpringCloud 网关
Zuul / Zuul2
接下来,我们将重点介绍应用网关。在网格中,应用网关侧重于以下功能(与 API 网关不同)
动态路由
服务发现
服务聚合/协调
可观察性
如果您使用的是 Sping 技术栈,使用 SpringCloud Gateway 和 Zuul 可以轻松重用现有类库,如集成您的注册表,使用 Hystrix、resilience4j 完成熔断和限流功能等,快速完成一个生产级可用应用网关,如果引入新的复杂技术栈 成本将直线上升。根据使用场景的不同,性能有时并不是第一指标,但通常我们很容易陷入性能误区。