前提概述
大家都知道,Sentinel是一款阿里的开源限流工具,不过目前没有持久化功能,每次配好的参数,重启后,就会丢失,所以本次集成Gateway+Sentinel+nacos,通过nacos配置中心读取参数,来单向持久化。
nacos持久化方案有多中 方案一:sentinel持久化到nacos。 方案二:nacos持久化推送到sentinel。
单向持久化方案
思路是直接从nacos中获取配置参数,适配到sentinel中。如果把改造当做是做手术,从sentinel持久化到nacos,就像是开膛破肚的大手术,本次改造就是一个无创手术。
方案一网上有很多案例,这里就不多做赘述。本次重点是方案二中的参数。
网关配置文件
spring:
application:
# 应用名称
name: iuv-gateway
profiles:
# 环境配置
active: dev
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
# 认证中心
- id: iuv-auth
uri: lb://iuv-auth
predicates:
- Path=/auth/**
# 系统模块
- id: iuv-system
uri: lb://iuv-system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
nacos:
discovery:
# 服务注册地址
server-addr: ${NACOS_HOST:node29}:${NACOS_PORT:8848}
service: ${spring.application.name}
namespace: public
username: nacos
password: nacos
config:
# 配置中心地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
namespace: ${spring.cloud.nacos.discovery.namespace}
username: ${spring.cloud.nacos.discovery.username}
password: ${spring.cloud.nacos.discovery.password}
sentinel:
# 取消控制台懒加载
eager: true
transport:
# 控制台地址
dashboard: ${NACOS_HOST:node29}:8686
# nacos配置持久化
datasource:
ds1:
nacos:
server-addr: ${NACOS_HOST:node29}:8848
username: ${spring.cloud.nacos.discovery.username}
password: ${spring.cloud.nacos.discovery.password}
dataId: sentinel-iuv-gateway
groupId: DEFAULT_GROUP
data-type: json
rule-type: gw-flow
SentinelFallbackHandler
/**
* 自定义限流异常处理
*/
public class SentinelFallbackHandler implements WebExceptionHandler
{
private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
{
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
}
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
{
if (exchange.getResponse().isCommitted())
{
return Mono.error(ex);
}
if (!BlockException.isBlockException(ex))
{
return Mono.error(ex);
}
return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
}
private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
{
return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
}
}
限流规则
根据网关中配置的dataId: sentinel-iuv-gateway,配置限流规则
[
{
"resource": "iuv-auth",//限流资源
"count": 501,//限流大小
"grade": 1,//1为qps,0为线程数
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0,//流控方式0快速失败2匀速排队
"paramItem": {
"parseStrategy": 2,//参数属性2是Header
"fieldName": "interfaceNO",//属性名称
"pattern": "BT002",//匹配内容
"matchStrategy": 3//匹配模式3子串0精准2正则
}
},
{
"resource": "iuv-system",
"count": 1002,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}
]
| 参数 | 说明 |
|---|---|
| parseStrategy | Client IP为0,Remote Host为1,Header为2,URL 参数为3,Cookie为4 |
| matchStrategy | 匹配模式3子串0精准2正则 |
| fieldName | 属性名称 |
| pattern | 匹配内容 |
配置中心改后生效。官网和帖子上都没有这些参数配置,因此,本次主要提供了带参数的配置方法。这只是一个讨巧的方式解决方式。谢谢大家,记得一键三连!
本文由博客一文多发平台 OpenWrite 发布!