sentinel接入网关应用_sentinel集成网关流控

简介

使用网关代理服务请求是微服务架构下常见的做法,相比于对被网关代理的各个服务做限流服务,在网关进行统一的限流操作似乎是更好的做法,sentinel对java应用常用的两款网关框架spring-cloud-gateway和zuul1都做了适配。本文将以zuul为例,说明zuul网关接入senrtinel流控能力的步骤并对源码做简单解读

网关限流模块分析

sentinel中对应网关限流规则的实体为GatewayFlowRule,他有以下字段

resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。

resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。

grade:限流指标维度,同限流规则的 grade 字段。

count:限流阈值

intervalSec:统计时间窗口,单位是秒,默认是 1 秒。

controlBehavior:流量整形的控制效果,同限流规则的 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:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。(1.6.2 版本开始支持)

matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。(1.6.2 版本开始支持)

以zuul为例,sentinel的网关限流能力可以针对两种维度,网关本身配置的路由和我们自定义的路由分组。

网关本身配置的路由维度

下面是zuul的一段路由配置

#配置hello-service与feign-consumer服务的路由

zuul:

routes:

provider:

serviceId: HELLO-SERVICE

consumer:

serviceId: HELLO-CONSUMER

我们将路由provider和consumer分别分配给了注册在eureka上的HELLO-SERVICE和HELLO-CONSUMER服务,这样就可以通过网关的地址加上路由地址去访问不同微服务上暴露出来的接口,sentinel天然支持根据这种路由规则的限流。通过这种方式配置同一微服务所有的服务都将被同一条规则保护(即所有的服务被视为同一个资源),即所有服务的总qps是共享的,保证同一时间对服务的总请求量是稳定的,至于每个服务承担了多少流量其实并不关心,如果要针对不同的服务设置不同的流控规则,则需要使用下面这种维度

自定义分组的维度

自定义分组在sentinel中对应的实体为ApiDefinition,先看看官方对它的介绍

用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。

自定义分组支持通配符,我们可以通过这个维度对同一微服务下的不同服务做更细粒度的划分,例如一个题库微服务下可能有考试和练习两个服务模块,我们可以对这两个模块根据实际应用场景配置不同的限流规则(需要业务上保证同一模块的服务拥有相同的前缀)。这样两个模块下的服务将被视为两个不同的被保护的资源。

ApiDefinition有以下字段

apiName; 分组名

predicateItems; 分组规则集合

其中分组规则由url匹配内容和匹配模式两部分组成

pattern; 匹配内容

matchStrategy; 支持完全匹配,前缀匹配和正则匹配三种

和sentinel的其它限流规则相同,gatewayFlowRule由一个对应的GatewayRuleManager加载,而apiDefination由GatewayApiDefinitionManager负责加载。

使用示例

依赖

com.alibaba.cspgroupId>

sentinel-zuul-adapterartifactId>

x.y.zversion&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值