Spring Cloud 整合 Sentinel 限流熔断降级热点等功能实现
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
安装 Sentinel 服务
Win 环境
-
打开 Sentinel 下载地址:
https://github.com/alibaba/Sentinel/releases/tag/1.8.2
目前 Sentinel 最新版本是 1.8.2,若不放心稳定性可选择较为成熟的 1.8.0 或 1.8.1版本来使用。
直接下载下面的 sentinel-dashboard-1.8.2.jar 即可。
-
在解压的 Sentinel 对应目录下,打开命令提示符 cmd,启动运行 sentinel 服务:
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.2.jar
-
启动以后有 Spring Boot 的大图标显示即为成功。
访问 Sentinal 服务
若 Sentinal 启动ok,通过浏览器进行访问测试 http://localhost:8180/#/login
如图所示:
Sentinel 的默认用户名密码均为 Sentinel,登录后如下图所示:
Sentinel 限流
我们系统中的数据库连接池,线程池,nginx的瞬时并发等在使用时都会给定一个限定的值,这本身就是一种限流的设计。限流的目的防止恶意请求流量、恶意攻击,或者防止流量超过系统峰值。
Sentinel 应用于服务提供方 (sca-provider),在消费方添加依赖如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
打开服务消费方配置文件 bootstrap.yml,添加 sentinel 配置,代码如下:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8180 # 指定sentinel控制台地址。
创建一个用于演示限流操作的 Controller 对象,例如:
package com.jt.provider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderSentinelController {
@GetMapping("/sentinel01")
public String doSentinel01(){
return "sentinel 01 test ...";
}
}
启动sca-provider服务,然后对指定服务进行访问,如图所示:
http://localhost:8083/provider/sentinel01
刷新sentinel 控制台,实时监控信息,如图所示:
Sentinel 限流实践
我们可以设置一下指定接口的流控(流量控制),QPS(每秒请求次数)单机阈值为1,代表每秒请求不能超出1次,要不然就做限流处理,处理方式直接调用失败。
第一步:选择要限流的链路,如图所示:
第二步:设置限流策略,如图所示:
QPS 代表每秒请求数,后面的单机阈值表示每秒允许的最大请求次数。
第三步:反复刷新访问消费端端服务,检测是否有限流信息输出,如图所示:
若有 Blocked by Sentinel (flow limiting) 字样表示该服务已被流控规则限制。
设置限流模式
Sentinel的流控模式代表的流控的方式,默认【直接】,还有关联,链路。
直接模式
Sentinel默认的流控处理就是【直接->快速失败】。
关联模式
当关联的资源达到阈值,就限流自己。
例如设置了关联资源为 /ur2 时,假如关联资源/url2 的 QPS 阀值超过 1 时,就限流 /url1接口
- 第一步:在ProviderSentinelController中添加