目录
一、授权规则
1)授权规则
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
- 白名单:来源(origin)在白名单内的调用者允许访问
- 黑名单:来源(origin)在黑名单内的调用者不允许访问
例如,我们限定只允许从网关来的请求访问order-service,那么流控应用中就填写网关的名称
Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。
public interface RequestOriginParser { /** * 从请求request 对象中获取origin,获取方式自定义 * @param request * @return */ String parseOrigin(HttpServletRequest request); }
例如,我们尝试从request中获取一个名为origin的请求头,作为origin的值:
package com.cloud.order.config; import com.cloud.order.service.RequestOriginParser; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; /** * @author :jizhibing * @date :Created in 2022/4/26 * @description: */ @Component public class HeaderOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { String origin = request.getHeader("origin"); if(!StringUtils.isEmpty(origin)){ origin="blank" ; } return origin; } }
我们还需要在gateway服务中,利用网关的过滤器添加名为gateway的origin头:
gateway: default-filters: - AddRequestHeader=origin,gateway # 添加名为origin的请求头,值为gateway
给/order/{orderId} 配置授权规则:
2)自定义异常结果
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:
public interface BlockExceptionHandler { /** * 处理请求被限流、降级、授权拦截时抛出的异常:BlockException * @param request * @param response * @param e * @throws Exception */ void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception; }
而BlockException包含很多个子类,分别对应不同的场景:
异常
说明
FlowException
限流异常
ParamFlowException
热点参数限流的异常
DegradeException
降级异常