1. 名词解释链路
介绍
链路是指调用路径, 假如某一个服务方法有多个调用来源, 如果我们只想限制来自于某一个来源的的调用路径, 就可以通过链路来限流,这个调用路径就是链路
比如在一个微服务中,两个接口都调用了同一个Service中的方法,并且该方法用SentinelResource(用于定义资源)注解标注了,然后对该注解标注的资源(方法)进行配置,则可以选择链路模式。
图解
2. 具体演示
1. 首先我们编写一个Service
@Service
public class TestService {
@SentinelResource("myService")
public String myService() {
return "test service";
}
}
2. 然后更改接口调用这个Service方法
@RestController
public class FlowLimitController {
@Autowired
private TestService testService;
@GetMapping("/testA")
public String testA() {
return "-----testA - " + testService.myService();
}
@GetMapping("/testB")
public String testB() {
return "-----testB - " + testService.myService();
}
}
3. 接下来配置流控规则
当我们运行项目,并访问/testA或/testB后就会在sentinel dashbord中看到簇点链路myService
这时候我们要对这个注解SentinelResource定义的簇点链路设置流控规则。
这里设置表示访问myService这个资源的入口资源是/testA时并且QPS超过1就会触发流控。
但是此时如果我们访问/testA会发现实际上是不会流控的,这是因为Sentinel 的 CommonFilter 的 web-context-unify 参数默认为true,表示要将调用链路收敛,会导致链路流控效果无效。 我们需要将这个参数设置成true才能取消链路收敛才会生效。
application.properties
server.port=8401
spring.application.name=sentinel-service
spring.cloud.nacos.discovery.server-addr=192.168.43.11:8848
# 配置Sentinel dashboard地址
spring.cloud.sentinel.transport.dashboard=192.168.43.11:31808
# 默认8719端口,被占用会自动从8719+1,直到找到未被占用的端口
spring.cloud.sentinel.transport.port=8719
# 默认为true,表示将调用链路收敛,会导致链路流控效果无效,需要改成false
spring.cloud.sentinel.web-context-unify=false
# 暴露所有端点,给dashboard用
management.endpoint.web.exposure.include=*
配置后重新启动应用,查看效果,这里需要注意,重新启动后sentinel dashboard就没有了,需要重新添加流控规则。
![](https://chyh741img.oss-cn-beijing.aliyuncs.com/typora/8/image_phXLWi2QJjRy5PoRcyFuMV.png)
3. 效果检验
最后这个时候我们再来频繁的访问/testA接口,就会出现异常的情况,这也是流量效果快速失败在链路上的体现,是直接抛出异常。