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?

相关推荐
uzong4 小时前
技术故障复盘模版
后端
GetcharZp4 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程4 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研5 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
一只爱撸猫的程序猿5 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋6 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy6 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack7 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt