我们在十一、springCloudAlibaba-sentinel流控规则之关联流控 简单使用了下关联流控,这里来实时链路流控,链路流控是什么意思呢?
链路流控
我们的流控不仅仅可以在请求上,还可以在service上,如果流控在service上,那么我们要用SentinelResource来发布到setinel控制台。
package com.suibibk.springCloud.order;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
@Override
@SentinelResource(value = "getUser", blockHandler = "exceptionHandler")
public String getUser() {
return "返回用户";
}
//自定义返回
public String exceptionHandler(BlockException ex) {
// Do some log here.
ex.printStackTrace();
return "被限流了";
}
}
然后假设我们有两个请求都调用这个资源
@Autowired
UserService userService;
@RequestMapping("/test1")
public String test1(){
return userService.getUser();
}
@RequestMapping("/test2")
public String test2(String id){
return userService.getUser();
}
可以看到/order/test1和/order/test2都调用了getUser资源
那么假设我们只想要对/order/test2调用getUser资源进行限流要怎么做呢?此时我们可以用链路模式进行流控
入口资源就是指要对哪个入口进行限流,这里配置的是/order/test2.
注意,我们需要开启链路,也就是配置要加上web-context-unify
spring:
application:
name: order-sentinel
cloud:
sentinel:
transport:
dashboard: localhost:8084
web-context-unify: false #默认将调用链路收敛,要用链路流控,这里需要改为false
启动后,访问test1和test2后可以看到链路效果
。
设置完规则后,尝试访问,会发现/order/test2会被限流,/order/test1不会。
ok!