网关维度(针对某一个微服务):
代表网关访问该服务时的限流规则;
粒度粗--全局的配置;
Api 分组维度(针对一系列url地址,这些url地址可以不在同一个微服务内):
代表网关访问该接口时的限流规则;
粒度细--局部配置;
要实现上述内容,首先需要在pom.xml文件内添加依赖(以来配置内容可以在网上找类似教程比较多);
通过网关来实现两种维度的限流,先进入resorce文件夹中对yml文件进行补充;
加入对于sentinel的扩写,补上内容datasource;
sentinel:datasource:ds1.file:file:classpath:gw-flow.json #网关+API分组的限流ruleType: gw_flowds2.file:file: classpath:api-group.jsonruleType: gw api _group
然后在gw-flow.json文件中写入限流规则,可以在yml文件中进行描写:
[{"resource":"资源的名称:网关时routes.id,api分组:api分组的名称""resourceMode":"@网关,1api分组""intervalsec":60, //秒为单位"count":5 //限流次数},{"resource":"资源的名称:网关时routes.id,api分组:api分组的名称""resourceMode":“@网关,1api分组”"intervalsec":60,'count": 5}
]
随后进行api分组内容,在同目录文档下写入api-group.json,当匹配到admin和login时,则自动启用该api分组栏目:
在测试效果前先进行接口的暴露,通过在GatewayServerApplication.java同目录下新建文件GatewayFlowRulesController.java,并在类上方标注注解@RestController,通过该java类完成网关维度限流策略以及api维度限流策略的获取;
@RestController注解是SpringMVC中的一个组合注解,用于标记一个类为控制器类。它实际上是@Controller和@ResponseBody注解的组合,表示该类中的所有方法都会返回JSON、XML等格式的数据,而不是视图页面。
list属于整个微服务架构,而login只属于api维度,当访问时,刚才存在网关维度的限流规则是60秒内5次,而api维度的限流规则是60秒内限制为1次;
场景题:现在list的限流规则为60秒内5次,而api维度的限流规则是60秒内限制为1次,list属于整个微服务架构,而login只属于api维度;请问当先访问list两次后再访问login一次还能请求到login吗,然后再访问list四次后再访问login一次,分别情况怎么样?
答:
访问
list
两次:
- 由于
list
接口在API维度没有特别的限流规则,且它没有涉及API限流规则,默认假设没有限制。所以list
的两次请求会被正常处理。- 网关维度的限流规则(60秒内5次)是跨所有接口的限制,因此网关维度限流规则目前使用了2次(两次
list
请求)。访问
login
一次:
- 根据API维度的限流规则,
login
接口的访问是 60秒内1次,由于你当前60秒内还没有请求过login
,因此此时可以访问login
接口。- 网关维度的限流规则是跨所有接口的,所以访问
login
后,网关的请求计数会增加到3次。
访问
list
四次:
- 网关限流:网关维度已有3次请求(包括之前的2次
list
和1次login
),现在访问list
四次,总共是 3 + 4 = 7次请求,已经超过了网关维度的5次限制。- 因此,网关限流会触发,所有在这4次
list
请求中的请求都会被拒绝,直到60秒过去。访问
login
一次:
- 网关限流:此时网关已经达到7次请求,超过了网关限流的5次限制,因此,无法请求到
login
。- API限流:
login
接口的API级别限流是60秒内1次,而在这个场景下,虽然API限流规则允许一次请求,但由于网关限流已经触发,所以login
请求会被拦截。