扩展sentinel之区分来源

1.简介

在sentinel的流控规则,与授权规则中,都提供了来源区分。

比如流控规则:这里的针对来源,表示针对哪些调用来源进行限流

  • 默认值default表示不区分来源,即任何调用来源都限流

  • 如果需要指定来源进行限流,比如说调用端有:app、pc

  • 针对app调用要限流,针对pc调用不限流,该如何实现呢?

  • 需要注意:sentinel默认是只认default,其它不认识!!!

比如授权规则:这里流控应用,表示针对哪些应用调用需要授权,或者禁止

  • 配合选择白名单,表示流控应用中指定的应用,允许访问

  • 配合选择黑名单,表示流控应用中指定的应用,不允许访问

  • 需要注意:sentinel默认是不提供来源区分,因此授权规则默认情况下用不了

  • 那如果需要使用授权规则,该如何实现呢?

2.扩展RequestOriginParser

要想实现流控规则中的针对来源,以及授权规则中指定流控应用。sentinel给我们提供了一个接口

public interface RequestOriginParser {
    String parseOrigin(HttpServletRequest var1);
}

我们只需要扩展RequestOriginParser接口,即可实现区分来源的业务场景需求,要实现区分来源,得有来源标识,这里我有两个建议

  • http请求参数中,传递来源标识

  • http请求头中,传递来源标识

在实际项目中,我建议从http请求头中,传递来源标识,这样会让请求更加优雅一些!放到请求参数中,会使得请求参数稍微难堪!比如这样的:http://ip:port/shop/add?origin=app,非要加【?origin=app】这一段来传递来源标识,丑陋,非常丑陋!

但是在我的这个案例中,为了演示方便,我还是选择丑陋的方式了,小伙伴们谅解谅解!

@Component
public class MyRequestOriginParser implements RequestOriginParser {

    /**
     * 解析来源
     * @param request
     * @return
     */
    public String parseOrigin(HttpServletRequest request) {
        // 1.这里从请求参数中获取origin(实际应用中,建议从http请求头获取更佳!)
        String origin = request.getParameter("origin");

        return origin;
    }
}

3.测试效果

启动应用,分别测试流控规则针对来源,以及授权规则,看看效果吧!

3.1.流控规则

配置流控规则,指定流控规则来源app

访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=app,疯狂刷新,流控了!

访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,疯狂刷新,没有发生流控!

3.2.授权规则

配置授权规则,指定流控应用:app,并选择白名单,表示只允许app端访问

访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=app,可以正常访问!

访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,禁止访问,提示没有授权!

{"status":500,"msg":"error,没有访问权限!"}

提前友情提示:原计划我们下一篇要分享【扩展sentinel之支持restful url】,因在sentinel新的版本中,已经支持了restful 风格url,那么该篇文章我们就省略了。

有小伙伴可能会有疑问,什么是restful风格url?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章