网关限流设计及实现
参考地址
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
1.增加maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
2.添加sentinel及路由规则
routes:
- id: route01
uri: lb://nacos-provider
predicates: ###匹配规则
- Path=/provider/echo/**
sentinel:
transport:
dashboard: localhost:8180 #Sentinel 控制台地址
port: 8719 #客户端监控API的端口
eager: true #取消Sentinel控制台懒加载,即项目启动即连接
3.启动网关项目,启动时添加sentinel的jvm参数
-Dcsp.sentinel.app.type=1
4.在sentinel面板中设置限流策略
5.此时是对该请求路径进行限流
对请求属性进行限流
通过postman进行测试分析
定义API维度限流
1.建立API分组
2.新建分组流控规则
3.访问流控路径是会被限流
定制限流异常处理
@Configuration
public class GatewayConfig {
public GatewayConfig(){
GatewayCallbackManager.setBlockHandler(
new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
//定义要响应的数据
Map<String,Object> map=new HashMap<>();
map.put("status", 429);
map.put("message", "too many request");
//将map对象转换为json格式字符串(借助alibaba的fastjson中的JSON对象实现)
String jsonStr=JSON.toJSONString(map);
//封装响应数据并返回
return ServerResponse.ok().body(
Mono.just(jsonStr),//将响应数据存储到一个响应序列中
String.class);//这里的String.class为响应到客户端的数据类型
}//基于 spring webflux
});
}
}