Sentinel授权规则
- 授权规则
- 自定义异常结果
一、授权规则
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
- 白名单:来源(origin)在白名单内的调用者允许访问
- 黑名单:来源(origin)在黑名单内的调用者不允许访问
例如,我们限定只允许从网关来的请求访问order-service,那么流控应用中就填写网关的名称
注意:Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。
配置授权规则步骤:
1.尝试从request中获取一个名为origin的请求头,作为origin的值
@Component
public class HeaderOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
// 1.获取请求头
String origin = request.getHeader("origin");
// 2.非空判断
if (StringUtils.isEmpty(origin)) {
origin = "blank";
}
return origin;
}
}
2.在gateway服务中,利用网关的过滤器添加名为gateway的origin头:
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=origin,gateway
3.给/order/{orderId} 配置授权规则:
4.测试
二、自定义异常结果
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:
public interface BlockExceptionHandler {
/**
* 处理请求被限流、降级、授权拦截时抛出的异常:BlockException
*/
void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception;
}
而BlockException包含很多个子类,分别对应不同的场景:
自定义异常结果代码:
我们在order-service中定义类,实现BlockExceptionHandler接口:
/**
* 自定义Sentinel异常结果类
*/
@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
String msg = "未知异常";
int status = 429;
if (e instanceof FlowException) {
msg = "请求被限流了";
} else if (e instanceof ParamFlowException) {
msg = "请求热点参数限流";
} else if (e instanceof DegradeException) {
msg = "请求被降级了";
} else if (e instanceof AuthorityException) {
msg = "没有权限访问";
status = 401;
}
// 设置响应结果为json字符串
response.setContentType("application/json;charset=utf-8");
// 设置状态码
response.setStatus(status);
// 将结果拼装成json字符串输出到前端页面
response.getWriter().println("{\"msg\": " + msg + ",\"status\":" + status + "}");
}
}
总结
获取请求来源的接口是什么?
- RequestOriginParser
处理BlockException的接口是什么?
- BlockExceptionHandler