我们在十一、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;@Servicepublic 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 "被限流了";}}
然后假设我们有两个请求都调用这个资源
@AutowiredUserService 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-sentinelcloud:sentinel:transport:dashboard: localhost:8084web-context-unify: false #默认将调用链路收敛,要用链路流控,这里需要改为false
启动后,访问test1和test2后可以看到链路效果
。
设置完规则后,尝试访问,会发现/order/test2会被限流,/order/test1不会。
ok!
