zoukankan      html  css  js  c++  java
  • 网关服务自定义路由规则(springcloud+nacos)

    1. 场景描述

    需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了

    2.解决方案

    2.1 解决思路

    新建总的监控总类,监控网关服务路由规则配置文件,然后每个路由配置文件再监控内容自己文件内容是否变化,动态加载到springclou gateway中。

    2.2 配置规则说明

    bc-ruanjianlaowang-all.yaml是需要加载的配置文件名称,创建的有监听,当新增新的自定义路由规则文件,会自动去刷自定义规则。

    gateways: bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json
    

    创建自定义路由规则文件,目前已经新建了两个网关服务的文件,bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json,只需配置自定义规则即可,后续有其他网关服务,需新增自定义规则json文件,然后在bc-ruanjianlaowang-all.yaml配置下文件名称即可,不用重启网关,会自动实时动态加载生效。

    2.2.1 规则示例说明
    [
        {
           "id": "demo-router3","uri":"lb://demo","order": 0,
           "filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],
           "predicates": 
           [{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}]
        } 
    ]
    i'm 软件老王 
    

    说明:

    (1) "id": "demo-router3",id尽量用本中心名称+router+序号,要唯一;

    (2)"uri":"lb://demo",这里可以是其他中心在注册中心的服务名称,假如有多个服务的话,默认负载均衡,轮询访问后面提供的对应服务;也可以这样配置:"uri":"http://10.192.168.10.:8010/",这样的配置是针对老服务没在注册中心注册,需要配置路径。

    (3)"filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],这里的含义是默认去掉第一层路径就相当于去掉demo进行访问

    (4) [{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}] 这里就是具体的自定义配置规则了,依照下面的规则进行配置。

    2.2.2 路径自定义规则说明

    因springcloud gateway使用的是spring的AntPathMatcher进行路径匹配,简单把自定义配置规则复制过来说明,也可以直接百度看下。

    (1)可以做URLs匹配,规则如下

    ?匹配一个字符

    *匹配0个或多个字符

    **匹配0个或多个目录

    (2)用例如下

    /trip/api/*x       匹配 /trip/api/x,/trip/api/ax,/trip/api/abx ;但不匹配 /trip/abc/x;
    /trip/a/a?x        匹配 /trip/a/abx;但不匹配 /trip/a/ax,/trip/a/abcx
    /**/api/alie       匹配 /trip/api/alie,/trip/dax/api/alie;但不匹配 /trip/a/api
    /**/*.htmlm        匹配所有以.htmlm结尾的路径
    
    /app/*.x	         匹配(Matches)所有在app路径下的.x文件
    /app/p?ttern	     匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
    /**/example	       匹配(Matches) /app/example, /app/foo/example, 和 /example
    /app/**/dir/file.  匹配(Matches) /app/dir/file.jsp,    /app/foo/dir/file.html,/app/foo
    									/bar/dir/file.pdf, 和 /app/dir/file.java
    /**/*.jsp	    匹配(Matches)任何的.jsp 文件
    i'm 软件老王 
    

    (3)另外说明

    springcloud或者说spring对路径匹配对正则支持的不是太好,但是也可以用,简单拿过来说一下。

    符号 {spring:[a-z]+}
    示例代码:
    @RequestMapping("/index/{username:[a-b]+}")
    @ResponseBody
    public String index(@PathVariable("username") String username){
        System.out.println(username);
        return username;
    }
    结果:
    
    index/ab        true  输出 ab
    index/abbaaa    true  输出 abbaaa
    index/a         false 404错误
    index/ac        false 404错误
    i'm 软件老王 
    

    网关原代码是默认开放全部服务,新代码后会按照自定义规则来,假如未配置,会禁止跳转。


    I’m 「软件老王」,如果觉得还可以的话,关注下呗,后续更新秒知!欢迎讨论区、同名公众号留言交流!

  • 相关阅读:
    二叉排序树(BST)创建,删除,查找操作
    Android中利用AIDL机制调用远程服务
    Android Studio更新升级方法
    C语言+ODBC+SQL 操作(向SQL里面添加数据)
    C语言+ODBC+SQL 连接
    macOS下 java+selenium+firefox 环境搭建
    php 上传二进制流图片 转存到图片格式 本地
    『工作の技术』突然想到的一些问题
    通过MySQL存储原理来分析排序和锁
    解析阿里开源混沌工程工具ChaosBlade是什么?
  • 原文地址:https://www.cnblogs.com/ruanjianlaowang/p/11713655.html
Copyright © 2011-2022 走看看