简介
使用网关代理服务请求是微服务架构下常见的做法,相比于对被网关代理的各个服务做限流服务,在网关进行统一的限流操作似乎是更好的做法,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&