Sentionel流控授权规则

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过:

  • 若配置白名单,则只有请求来源位于白名单内时才可通过;
  • 若配置黑名单,则请求来源位于黑名单时不通过,其余的请求通过。

例如:活动和订单都会调用用户系统获取用户信息,我们可以将活动设置为黑名单

Sentionel流控授权规则_第1张图片

Sentionel流控授权规则_第2张图片
上面的【资源名】和【授权类型】不难理解,但是【流控应用】怎么填写呢?

其实这个位置要填写的是来源标识,Sentinel提供了RequestOriginParser 接口来处理来源。
只要Sentinel保护的接口资源被访问,Sentinel就会调用RequestOriginParser 的实现类去解析访问来源。

第1步: 自定义来源处理规则

 @GetMapping("/test")
    public String threads1(){
    try{
           System.out.println(System.currentTimeMillis());
            Thread.sleep(3000);
           System.out.println(System.currentTimeMillis());
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return "测试流控效果===授权规则test";
    }
@Component
public class RequestOriginParserDefinition implements RequestOriginParser{
    @Override
    public String parseOrigin(HttpServletRequest request) { 
        String serviceName = request.getParameter("serviceName"); 
        return serviceName;
    }
}

Sentionel流控授权规则_第3张图片

第2步: 授权规则配置

这个配置的意思是只有serviceName=app不能访问(黑名单)
Sentionel流控授权规则_第4张图片
正常测试

Sentionel流控授权规则_第5张图片
异常测试:
Sentionel流控授权规则_第6张图片

在feign中将参数设置进去

openFeign的应该,涉及到拦截器
当我们请求的时候,对服务消费者进行拦截,将项目名称或者拦截参数设置到请求头中,在服务消费者中做授权规则限制。

服务消费者添加拦截器

添加拦截器

public class FeignAuthRequestInterceptor  implements RequestInterceptor {
    private String serviceName;

    public FeignAuthRequestInterceptor(String serviceName) {
        this.serviceName = serviceName;
    }
    @Override
    public void apply(RequestTemplate template) {
        template.header("serviceName",serviceName);
    }
}

注册拦截器

@Configuration
public class FeignConfig {
    @Value("${spring.application.name}")
    private String serviceName;

    /**
     * 自定义拦截器
     * @return
     */

    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
        return new FeignAuthRequestInterceptor(serviceName);
    }
}
spring
 application:
     name: msb-order

服务提供者设置规则

@Component
public class RequestOriginParserDefinition implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String serviceName =httpServletRequest.getHeader("serviceName");

        return serviceName;
    }
}

添加规则

Sentionel流控授权规则_第7张图片

正常请求
Sentionel流控授权规则_第8张图片
请求被拦截
Sentionel流控授权规则_第9张图片

这个请求的异常对于实际应用非常的不友好,我们应该做统一的异常处理

你可能感兴趣的:(sentinel,python,数据库,开发语言)