Sentinel实现接口限流
一、Sentinel 简介
Sentinel的官方解释:分布式系统的流量防卫兵。从名字上来看,很容易就能猜到它是用来作服务稳定性保障的。对于服务稳定性保障组件,如果熟悉Spring Cloud的用户,第一反应应该就是Hystrix。但是比较可惜的是Netflix已经宣布对Hystrix停止更新。那么,在未来我们还有什么更好的选择呢?除了Spring Cloud官方推荐的resilience4j之外,目前Spring Cloud Alibaba下整合的Sentinel也是用户可以重点考察和选型的目标。
管理平台安装包:https://github.com/alibaba/Sentinel/releases
Sentinel的使用分为两部分:
- sentinel-dashboard:与hystrix-dashboard类似,但是它更为强大一些。除了与hystrix-dashboard一样提供实时监控之外,还提供了流控规则、熔断规则的在线维护等功能。
- 客户端整合:每个微服务客户端都需要整合sentinel的客户端封装与配置,才能将监控信息上报给dashboard展示以及实时的更改限流或熔断规则等。
二、部署Sentinel Dashboard
管理平台安装包:https://github.com/alibaba/Sentinel/releases
本次下载的版本是最新的:V1.8.0
它是一个标准的springboot项目,可以通过以下命令进行启动:
java -jar sentinel-dashboard-1.8.0.jar
同时,可以通过在启动命令中添加【 -D+参数名称=参数值 】 进行参数指定调整,比如:-Dserver.port=8888。
默认情况下,sentinel-dashboard以8080端口启动,所以可以通过访问:localhost:8080来验证是否已经启动成功,如果一切顺利的话,可以看到如下页面:
默认用户名和密码都是sentinel。对于用户登录的相关配置可以在启动命令中增加下面的参数来进行配置:
-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 分钟;
启动界面:
登录界面:
输入账户密码登录后,可以看到如下页面:
三、客户端整合Sentinel
3.1 在Spring Cloud应用的pom.xml中引入Spring Cloud Alibaba的Sentinel模块:
<!--Sentinel分布式系统的流量防卫兵-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
</dependency>
3.2 在Spring Cloud应用中通过spring.cloud.sentinel.transport.dashboard参数配置sentinel dashboard的访问地址,如下所示:
spring:
application:
name: order-service
cloud:
sentinel: # Sentinel配置
transport:
#port: 8719
dashboard: 127.0.0.1:8080 #Sentinel 地址
#取消Sentinel控制台懒加载
eager: true
3.3 启动应用,然后通过浏览器访问 127.0.0.1:8100
此时,在上一节启动的Sentinel Dashboard中就可以当前我们启动的alibaba-sentinel-rate-limiting这个服务以及接口调用的实时监控了。具体如下图所示:
四、配置限流规则
在完成了上面的两节之后,我们在order-service服务下,点击簇点链路菜单,可以看到如下界面:
我们可以配置接口的流控、降级等内容,例如通过点击流控按钮,来为该接口设置限流规则,比如:
配置:
阈值类型选择:QPS
单机阈值:2
综合起来的配置效果就是,该接口的限流策略是每秒最多允许2个请求进入。
点击新增按钮之后,可以看到如下界面:
其实就是左侧菜单中流控规则的界面,这里可以看到当前设置的所有限流策略。
五、验证限流规则
在完成了上面所有内容之后,我们可以尝试一下快速的调用这个接口,看看是否会触发限流控制,比如:
可以看到,快速调用接口,可以看到调用被限流了。
六、结合openfeign实现限流提示
6.1 在库存服务中集成
参考上面 三、客户端整合Sentinel
在配置文件中开启 sentinel 对 feign 的支持:
feign:
sentinel:
enabled: true
6.2 配置库存服务中的扣库存限流规则
6.3 编写openfeign client的失败处理
/**
* @ClassName: StockOpenFeignClient 服务容错
* @Description: StockOpenFeignClientFallback
* @Author oyc
* @Date 2021/2/4 10:06
* @Version 1.0
*/
@Component
@Slf4j
public class StockOpenFeignClientFallback implements StockOpenFeignClient {
@Override
public String hello() {
return "调用库存服务-hello失败";
}
@Override
public String sale() {
return "调用库存服务-sale失败";
}
}
6.4 配置openfeign client的失败处理
主要添加 fallback = StockOpenFeignClientFallback.class
/**
* @ClassName: StockOpenFeignClient
* @Description: StockOpenFeignClient
* @Author oyc
* @Date 2021/2/4 9:05
* @Version 1.0
*/
@FeignClient(value = "stock-service",fallback = StockOpenFeignClientFallback.class)
public interface StockOpenFeignClient {
@GetMapping("/")
String hello();
/**
* 扣库存方法
* @return
*/
@GetMapping("/stock/allocation")
String sale();
}