链路模式
A B C 三个服务
A 调用 C
B 调用 C
C 设置流控 ->链路模式 -> 入口资源是 A
A、B 服务
package com.learning.springcloud.order.controller;
import com.learning.springcloud.order.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 链路模式:
* 条件:
* - A —> C; B -> C
* - C 设置流控规则 入口资源是A
*/
@RestController
@RequestMapping("/lianlu")
public class LianLuController {
@Autowired
BaseService baseService;
@RequestMapping("/A")
public Object A() {
String s = baseService.queryC();
return "hi, A;" + s;
}
@RequestMapping("/B")
public Object B() {
String s = baseService.queryC();
return "hi, B;" + s;
}
}
C 服务
package com.learning.springcloud.order.service;
public interface BaseService {
public String queryC();
}
package com.learning.springcloud.order.service.impl;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.learning.springcloud.order.service.BaseService;
import org.springframework.stereotype.Service;
@Service
public class BaseServiceImpl implements BaseService {
@Override
@SentinelResource(value = "queryC")
public String queryC() {
return "查询C";
}
}
控制台
设置链路收集
server:
port: 8061
spring:
application:
name: order-sentinel
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
web-context-unify: false # 默认请求链路进行收敛
设置流控规则
- 链路 入口 A
访问
问题:为啥没有流控处理的消息而是访问报错???
问题解决
分析:
1. 使用 注解 @SentinelResource 则无法使用全局异常处理
2. 增加注解 blockHandler 属性以及方法
package com.learning.springcloud.order.service.impl;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.learning.springcloud.order.service.BaseService;
import org.springframework.stereotype.Service;
@Service
public class BaseServiceImpl implements BaseService {
@Override
@SentinelResource(value = "queryC", blockHandler = "blockHandlerForQueryC")
public String queryC() {
return "查询C";
}
public String blockHandlerForQueryC(BlockException be) {
return "queryC 被流控了!!!";
}
}
- 再次访问 可以正常返回流控处理消息