Sentionel流控授权规则

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

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

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

在这里插入图片描述

在这里插入图片描述
上面的【资源名】和【授权类型】不难理解,但是【流控应用】怎么填写呢?

其实这个位置要填写的是来源标识,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;
    }
}

在这里插入图片描述

第2步: 授权规则配置

这个配置的意思是只有serviceName=app不能访问(黑名单)
在这里插入图片描述
正常测试


异常测试:
在这里插入图片描述

在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;
    }
}
添加规则

在这里插入图片描述

正常请求
在这里插入图片描述
请求被拦截
在这里插入图片描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值