公司网站建设怎么入账,网站建设与制作,做响应式网站需要学哪些知识,一份完整的个人简历模板Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块#xff0c;此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑#xff1a;
GatewayFlowRule#xff1a;网关限流规则…Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑
GatewayFlowRule网关限流规则针对 API Gateway 的场景定制的限流规则可以针对不同 route 或自定义的 API 分组进行限流支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。ApiDefinition用户自定义的 API 定义分组可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。
其中网关限流规则 GatewayFlowRule 的字段解释如下
resource资源名称可以是网关中的 route 名称或者用户自定义的 API 分组名称。resourceMode规则是针对 API Gateway 的 routeRESOURCE_MODE_ROUTE_ID还是用户在 Sentinel 中定义的 API 分组RESOURCE_MODE_CUSTOM_API_NAME默认是 route。grade限流指标维度同限流规则的 grade 字段。count限流阈值intervalSec统计时间窗口单位是秒默认是 1 秒。controlBehavior流量整形的控制效果同限流规则的 controlBehavior 字段目前支持快速失败和匀速排队两种模式默认是快速失败。burst应对突发请求时额外允许的请求数目。maxQueueingTimeoutMs匀速排队模式下的最长排队时间单位是毫秒仅在匀速排队模式下生效。paramItem参数限流配置。若不提供则代表不针对参数进行限流该网关规则将会被转换成普通流控规则否则会转换成热点规则。其中的字段 parseStrategy从请求中提取参数的策略目前支持提取来源 IPPARAM_PARSE_STRATEGY_CLIENT_IP、HostPARAM_PARSE_STRATEGY_HOST、任意 HeaderPARAM_PARSE_STRATEGY_HEADER和任意 URL 参数PARAM_PARSE_STRATEGY_URL_PARAM四种模式。fieldName若提取策略选择 Header 模式或 URL 参数模式则需要指定对应的 header 名称或 URL 参数名称。pattern参数值的匹配模式只有匹配该模式的请求属性值会纳入统计和流控若为空则统计该请求属性的所有值。1.6.2 版本开始支持matchStrategy参数值的匹配策略目前支持精确匹配PARAM_MATCH_STRATEGY_EXACT、子串匹配PARAM_MATCH_STRATEGY_CONTAINS和正则匹配PARAM_MATCH_STRATEGY_REGEX。1.6.2 版本开始支持
用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送推荐方式。
Spring Cloud Gateway
从 1.6.0 版本开始Sentinel 提供了 Spring Cloud Gateway 的适配模块可以提供两种资源维度的限流
route 维度即在 Spring 配置文件中配置的路由条目资源名为对应的 routeId自定义 API 维度用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
使用时需引入以下模块以 Maven 为例
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-spring-cloud-gateway-adapter/artifactIdversionx.y.z/version
/dependency
使用时只需注入对应的 SentinelGatewayFilter 实例以及 SentinelGatewayBlockExceptionHandler 实例即可若使用了 Spring Cloud Alibaba Sentinel则只需按照文档进行配置即可无需自己加 Configuration。比如
Configuration
public class GatewayConfiguration {private final ListViewResolver viewResolvers;private final ServerCodecConfigurer serverCodecConfigurer;public GatewayConfiguration(ObjectProviderListViewResolver viewResolversProvider,ServerCodecConfigurer serverCodecConfigurer) {this.viewResolvers viewResolversProvider.getIfAvailable(Collections::emptyList);this.serverCodecConfigurer serverCodecConfigurer;}BeanOrder(Ordered.HIGHEST_PRECEDENCE)public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {// Register the block exception handler for Spring Cloud Gateway.return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);}BeanOrder(Ordered.HIGHEST_PRECEDENCE)public GlobalFilter sentinelGatewayFilter() {return new SentinelGatewayFilter();}
}
Demo 示例sentinel-demo-spring-cloud-gateway
比如我们在 Spring Cloud Gateway 中配置了以下路由
server:port: 8090
spring:application:name: spring-cloud-gatewaycloud:gateway:enabled: truediscovery:locator:lower-case-service-id: trueroutes:# Add your routes here.- id: product_routeuri: lb://productpredicates:- Path/product/**- id: httpbin_routeuri: https://httpbin.orgpredicates:- Path/httpbin/**filters:- RewritePath/httpbin/(?segment.*), /$\{segment}
同时自定义了一些 API 分组
private void initCustomizedApis() {SetApiDefinition definitions new HashSet();ApiDefinition api1 new ApiDefinition(some_customized_api).setPredicateItems(new HashSetApiPredicateItem() {{add(new ApiPathPredicateItem().setPattern(/product/baz));add(new ApiPathPredicateItem().setPattern(/product/foo/**).setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));}});ApiDefinition api2 new ApiDefinition(another_customized_api).setPredicateItems(new HashSetApiPredicateItem() {{add(new ApiPathPredicateItem().setPattern(/ahas));}});definitions.add(api1);definitions.add(api2);GatewayApiDefinitionManager.loadApiDefinitions(definitions);
}
那么这里面的 route ID如 product_route和 API name如 some_customized_api都会被标识为 Sentinel 的资源。比如访问网关的 URL 为 http://localhost:8090/product/foo/22 的时候对应的统计会加到 product_route 和 some_customized_api 这两个资源上面而 http://localhost:8090/httpbin/json 只会对应到 httpbin_route 资源上面。 注意有的时候 Spring Cloud Gateway 会自己在 route 名称前面拼一个前缀如 ReactiveCompositeDiscoveryClient_xxx 这种。请观察簇点链路页面实际的资源名。 您可以在 GatewayCallbackManager 注册回调进行定制
setBlockHandler注册函数用于实现自定义的逻辑处理被限流的请求对应接口为 BlockRequestHandler。默认实现为 DefaultBlockRequestHandler当被限流时会返回类似于下面的错误信息Blocked by Sentinel: FlowException。
注意
Sentinel 网关流控默认的粒度是 route 维度以及自定义 API 分组维度默认不支持 URL 粒度。若通过 Spring Cloud Alibaba 接入请将 spring.cloud.sentinel.filter.enabled 配置项置为 false若在网关流控控制台上看到了 URL 资源就是此配置项没有置为 false。若使用 Spring Cloud Alibaba Sentinel 数据源模块需要注意网关流控规则数据源类型是 gw-flow若将网关流控规则数据源指定为 flow 则不生效。
Zuul 1.x
Sentinel 提供了 Zuul 1.x 的适配模块可以为 Zuul Gateway 提供两种资源维度的限流
route 维度即在 Spring 配置文件中配置的路由条目资源名为对应的 route ID对应 RequestContext 中的 proxy 字段自定义 API 维度用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
使用时需引入以下模块以 Maven 为例
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-zuul-adapter/artifactIdversionx.y.z/version
/dependency
若使用的是 Spring Cloud Netflix Zuul我们可以直接在配置类中将三个 filter 注入到 Spring 环境中即可
Configuration
public class ZuulConfig {Beanpublic ZuulFilter sentinelZuulPreFilter() {// We can also provider the filter order in the constructor.return new SentinelZuulPreFilter();}Beanpublic ZuulFilter sentinelZuulPostFilter() {return new SentinelZuulPostFilter();}Beanpublic ZuulFilter sentinelZuulErrorFilter() {return new SentinelZuulErrorFilter();}
}
Sentinel Zuul Adapter 生成的调用链路类似于下面其中的资源名都是 route ID 或者自定义的 API 分组名称
-EntranceNode: sentinel_gateway_context$$route$$another-route-b(t:0 pq:0.0 bq:0.0 tq:0.0 rt:0.0 prq:0.0 1mp:8 1mb:1 1mt:9)
--another-route-b(t:0 pq:0.0 bq:0.0 tq:0.0 rt:0.0 prq:0.0 1mp:4 1mb:1 1mt:5)
--another_customized_api(t:0 pq:0.0 bq:0.0 tq:0.0 rt:0.0 prq:0.0 1mp:4 1mb:0 1mt:4)
-EntranceNode: sentinel_gateway_context$$route$$my-route-1(t:0 pq:0.0 bq:0.0 tq:0.0 rt:0.0 prq:0.0 1mp:6 1mb:0 1mt:6)
--my-route-1(t:0 pq:0.0 bq:0.0 tq:0.0 rt:0.0 prq:0.0 1mp:2 1mb:0 1mt:2)
--some_customized_api(t:0 pq:0.0 bq:0.0 tq:0.0 rt:0.0 prq:0.0 1mp:2 1mb:0 1mt:2)发生限流之后的处理流程
发生限流之后可自定义返回参数通过实现 SentinelFallbackProvider 接口默认的实现是 DefaultBlockFallbackProvider。默认的 fallback route 的规则是 route ID 或自定义的 API 分组名称。
比如
// 自定义 FallbackProvider
public class MyBlockFallbackProvider implements ZuulBlockFallbackProvider {private Logger logger LoggerFactory.getLogger(DefaultBlockFallbackProvider.class);// you can define route as service level Overridepublic String getRoute() {return /book/app;}Overridepublic BlockResponse fallbackResponse(String route, Throwable cause) {RecordLog.info(String.format([Sentinel DefaultBlockFallbackProvider] Run fallback route: %s, route));if (cause instanceof BlockException) {return new BlockResponse(429, Sentinel block exception, route);} else {return new BlockResponse(500, System Error, route);}}}// 注册 FallbackProviderZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider());
默认情况下限流后会返回 429 状态码返回结果为
{code:429,message:Sentinel block exception,route:/
}
注意
Sentinel 网关流控默认的粒度是 route 维度以及自定义 API 分组维度默认不支持 URL 粒度。若通过 Spring Cloud Alibaba 接入请将 spring.cloud.sentinel.filter.enabled 配置项置为 false若在网关流控控制台上看到了 URL 资源就是此配置项没有置为 false。若使用 Spring Cloud Alibaba Sentinel 数据源模块需要注意网关流控规则数据源类型是 gw-flow若将网关流控规则数据源指定为 flow 则不生效。
网关流控实现原理
当通过 GatewayRuleManager 加载网关流控规则GatewayFlowRule时无论是否针对请求属性进行限流Sentinel 底层都会将网关流控规则转化为热点参数规则ParamFlowRule存储在 GatewayRuleManager 中与正常的热点参数规则相隔离。转换时 Sentinel 会根据请求属性配置为网关流控规则设置参数索引idx并同步到生成的热点参数规则中。
外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter其中会依次进行 路由/API 分组匹配、请求属性解析和参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性并依照参数索引顺序组装参数数组最终传入 SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot专门用来做网关规则的检查。GatewayFlowSlot 会从 GatewayRuleManager 中提取生成的热点参数规则根据传入的参数依次进行规则检查。若某条规则不针对请求属性则会在参数最后一个位置置入预设的常量达到普通流控的效果。 网关流控控制台
Sentinel 1.6.3 引入了网关流控控制台的支持用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控管理网关规则和 API 分组配置。
在 API Gateway 端用户只需要在原有启动参数的基础上添加如下启动参数即可标记应用为 API Gateway 类型
# 注通过 Spring Cloud Alibaba Sentinel 自动接入的 API Gateway 整合则无需此参数
-Dcsp.sentinel.app.type1
添加正确的启动参数并有访问量后我们就可以在 Sentinel 上面看到对应的 API Gateway 了。我们可以查看实时的 route 和自定义 API 分组的监控和调用信息并针对其配置规则 网关规则动态配置及网关集群流控可以参考 AHAS Sentinel 网关流控。
转载自Sentinel官网