4、Sentinel与Gateway的整合
4.1、添加依赖
<!--gateway整合sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> <version>2021.0.4.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.5</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2021.0.4.0</version> </dependency>
sentinel: transport: # 配置Sentinel dashboard地址 dashboard: localhost:8080 # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口 port: 8719
4.2、详细配置
接下来对sentinel控制台中对gateway网关链路的流控配置项做详细的介绍,下图所示都是针对网关api附加的。
API类型
我们可以根据某个路由进行流控,也可以根据API分组进行流控,也就是请求访问地址来进行流控
首先创建API分组
选择API分组
然后在进行相应的流控规则。
针对请求属性
参数属性有五种:客户端ip、远程请求地址、请求头、请求url参数、Cookie
这里其实也就是对应的gateway中路由的匹配规则
匹配模式提供了三种:精确、子串、正则
子串匹配模式就是:我们指定127,它会自动再结尾加上%进行模糊匹配——127%
Client IP
测试
Remote Host
因为我们没有远程域名,所以这里就不进行测试了
Header
使用postman请求进行测试,如果请求头不为这个值就不会被限流
URL参数
测试
间隔
这个间隔的意思就是,以前1秒钟请求三次就会抛异常,而现在是两秒内请求三次才会抛异常,也就是说间隔从以前的一秒改变了。
Burst size
Burst size相当于是一个宽容次数,以前是1秒钟请求三次就会报异常,现在会宽容1次,也就是一秒钟请求大于三次才会抛异常
网关流控规则 GatewayFlowRule 的核心属性如下:
① resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。
② resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。
③ grade:限流指标维度,同限流规则的 grade 字段
④ count:限流阈值
⑤ intervalSec:统计时间窗口,单位是秒,默认是 1 秒
⑥ controlBehavior:流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败。
⑦ burst:应对突发请求时额外允许的请求数目。
⑧ maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。
⑨ paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:
parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。
fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。
pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。
matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。
降级规则
(resource、grade、count、slowRatioThreshold、timeWindow、minRequestAmount、statIntervalMs)
自定义异常返回结果:
sentinel: scg: fallback: mode: response response-status: 200 response-body: '{"code":"500","message": "系统忙,请稍候再试"}'
代码实现:
/** * 熔断、降级回调 */ @Configuration public class SentinelGatewayConfig { /** * 这里可以写降级逻辑 */ public SentinelGatewayConfig() { GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() { // 网关限制了请求,就会调用此回调 Mono Flux @Override public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) { ResponseDTO<Object> objectResponseDTO = new ResponseDTO<>(); objectResponseDTO.setCode(500); objectResponseDTO.setMessage("系统异常,请稍候重试"); String errJson = JSON.toJSONString(objectResponseDTO); Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errJson), String.class); return body; } }); } }
将路由、限流、降级规则持久化到nacos配置中心
spring: application: name: drp-gateway-service profiles: #开发环境dev,测试环境test,生产环境prod active: dev jackson: time-zone: GMT+8 cloud: loadbalancer: ribbon: enabled: false nacos: discovery: server-addr: localhost:8848 #Nacos server 的地址 #路由配置 config: server-addr: localhost:8848 name: gateway-router namespace: public group: DEFAULT_GROUP #file-extension: json #指定yaml格式的配置 refresh-enabled: true #支持刷新 #限流熔断配置 sentinel: transport: # 配置Sentinel dashboard地址 dashboard: localhost:8080 # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口 port: 8719 datasource: ds: nacos: server-addr: localhost:8848 data-id: user-sentinel group-id: DEFAULT_GROUP rule-type: flow