springboot框架项目实践应用十五(扩展sentinel区分来源)

1.引言

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

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

  • 默认值default表示不区分来源,即任何调用来源都限流
  • 如果需要指定来源进行限流,比如说调用端有:app、pc
  • 针对app调用要限流,针对pc调用不限流,该如何实现呢?
  • 需要注意:sentinel默认是只认default,其它不认识!!!

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

  • 配合选择白名单,表示流控应用中指定的应用,允许访问
  • 配合选择黑名单,表示流控应用中指定的应用,不允许访问
  • 需要注意:sentinel默认是不提供来源区分,因此授权规则默认情况下用不了
  • 那如果需要使用授权规则,该如何实现呢?

2.扩展RequestOriginParser

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

java 复制代码
public interface RequestOriginParser {
    String parseOrigin(HttpServletRequest var1);
}

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

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

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

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

java 复制代码
@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,禁止访问,提示没有授权!

shell 复制代码
{"status":500,"msg":"error,没有访问权限!"}

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

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

相关推荐
踏浪无痕38 分钟前
别再只会用 Feign!手写一个 Mini RPC 框架搞懂 Spring Cloud 底层原理
后端·面试·架构
NMBG2240 分钟前
外卖综合项目
java·前端·spring boot
小徐Chao努力1 小时前
Spring AI Alibaba A2A 使用指南
java·人工智能·spring boot·spring·spring cloud·agent·a2a
用户695619440371 小时前
前后端分离VUE3+Springboot项目集成PageOffice核心代码
后端
rannn_1111 小时前
【Git教程】概述、常用命令、Git-IDEA集成
java·git·后端·intellij-idea
我家领养了个白胖胖1 小时前
向量化和向量数据库redisstack使用
java·后端·ai编程
嘻哈baby1 小时前
NextCloud私有云盘完整部署指南
后端
Ray661 小时前
Linux 日志处理三剑客:grep、awk、sed
后端
苹果醋31 小时前
Java设计模式实战:从面向对象原则到架构设计的最佳实践
java·运维·spring boot·mysql·nginx
郑州光合科技余经理1 小时前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php