很多时候,我们需要根据调用方来判断该次请求是否放行,这时候可以使用Sentinel的来源访问控制功能。
- 若配置白名单,则只有请求来源位于白名单内时才可通过;
- 若配置黑名单,则请求来源位于黑名单时不允许通过,其余的请求来源可以通过。
流控应用
流控应用填写的是调用方标识,Sentinel提供了RequestOriginParser接口来处理标识信息。
只要Sentinel保护的接口资源被访问,Sentinel就会调用RequestOriginParser的实现类去解析调用者标识。
第一步:自定义调用方标识处理规则
package cn.jack.config;
import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
@Component // 交由spring管理,否则拿不到RequestOriginParser实现类,授权规则不生效
public class RequestOriginParserDefinition implements RequestOriginParser {
// 获取调用方标识信息并返回
@Override
public String parseOrigin(HttpServletRequest request) {
String serviceName = request.getParameter("serviceName");
StringBuffer url = request.getRequestURL();
if (url.toString().endsWith("favicon.ico")) {
// 浏览器会向后台请求favicon.ico图标
return serviceName;
}
if (StringUtils.isEmpty(serviceName)) {
throw new IllegalArgumentException("serviceName must not be null");
}
return serviceName;
}
}
第二步:配置授权规则
这个配置的意思是,serviceName=pc不能访问(黑名单)
第三步:访问http://localhost:8091/order/message2?serviceName=pc以及http://localhost:8091/order/message2?serviceName=app观察结果。