1. 场景描述
先说明下项目中使用的网关是:springcloud gateway, 因须要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路由文件,动态加载路由文件中的路由规则。html
2.解决方案
2.1 解决思路
新建总的监控总类,监控网关服务路由规则配置文件,而后每一个路由配置文件再监控内容本身文件内容是否变化,动态加载到springcloud gateway中。java
2.2 配置规则说明
bc-ruanjianlaowang-all.yaml是须要加载的配置文件名称,建立的有监听,当新增新的自定义路由规则文件,会自动去刷自定义规则。git
gateways: bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json
建立自定义路由规则文件,目前已经新建了两个网关服务的文件,bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json,只需配置自定义规则便可,后续有其余网关服务,需新增自定义规则json文件,而后在bc-ruanjianlaowang-all.yaml配置下文件名称便可,不用重启网关,会自动实时动态加载生效。github
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"}] } ]
说明:web
(1) "id": "demo-router3",id尽可能用本中心名称+router+序号,要惟一;spring
(2)"uri":"lb://demo",这里能够是其余中心在注册中心的服务名称,假若有多个服务的话,默认负载均衡,轮询访问后面提供的对应服务;也能够这样配置:"uri":"http://10.192.168.10.:8010/",这样的配置是针对老服务没在注册中心注册,须要配置路径。json
(3)"filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],这里的含义是默认去掉第一层路径就至关于去掉demo进行访问api
(4) [{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}] 这里就是具体的自定义配置规则了,依照下面的规则进行配置。springboot
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]+}")@ResponseBodypublic String index(@PathVariable("username") String username){ System.out.println(username); return username;}结果:index/ab true 输出 abindex/abbaaa true 输出 abbaaaindex/a false 404错误index/ac false 404错误
网关原代码是默认开放所有服务,新代码后会按照自定义规则来,假如未配置,会禁止跳转。
1.微服务实战系列
4.中间件等
原创不易,若是以为有点用的话,请绝不留情地素质三连吧,分享、点赞、在看,我不挑,由于这将是我写做更多优质文章的最强动力。
本文分享自微信公众号 - 软件老王(ruanjianlaowang_pub)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。