zoukankan      html  css  js  c++  java
  • 微服务实战系列(八)-网关springcloud gateway自定义规则

    1. 场景描述

    先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路由文件,动态加载路由文件中的路由规则。

    2.解决方案

    2.1 解决思路

    新建总的监控总类,监控网关服务路由规则配置文件,然后每个路由配置文件再监控内容自己文件内容是否变化,动态加载到springcloud 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"}]
        } 
    ]
    

    说明:

    (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 文件
    

    (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错误 
    

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


    更多知识请关注公众号:「软件老王」,IT技术与相关干货分享,回复关键字获取对应干货,java,送必看的10本“武功秘籍”;图片,送100多万张可商用高清图片;面试,送刚毕业就能月薪“20k”的java面试题,软考,送官方pdf书籍与通关论文,后续会不断更新,比如“工具”,“视频“等,已经在整理中。

    更多信息请关注公众号:「软件老王」,关注不迷路,IT技术与相关干货分享,回复关键字获取对应干货,本文版权归作者软件老王所有,转载需注明作者、超链接,否则保留追究法律责任的权利。
  • 相关阅读:
    FreeMarker 2.3.17 发布,千年等一回
    NetBeans 时事通讯(刊号 # 150 Jun 11, 2011)
    2011 端午后,杭州支付宝
    FreeMarker 2.3.17 发布,千年等一回
    2011 端午后,杭州支付宝
    NetBeans 时事通讯(刊号 # 149 Jun 08, 2011)
    用Python实现一个简单的文件传输协议
    Scrapinghub | About Us
    用python实现一个socket echo程序 && tcp socket的几个关闭状态
    纯C日志函数库 zlog
  • 原文地址:https://www.cnblogs.com/ruanjianlaowang/p/13745297.html
Copyright © 2011-2022 走看看