网关服务自定义路由规则(springcloud+nacos)

279 阅读3分钟

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 软件老王 

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


更多知识请关注公众号:「软件老王」,IT技术与相关干货分享,回复关键字获取对应干货,java,送必看的10本“武功秘籍”;图片,送100多万张可商用高清图片;面试,送刚毕业就能月薪“20k”的java面试题等。