微服务实战系列(八)-网关springcloud gateway自定义规则

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

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

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

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

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

  1. [
  2. {
  3. "id": "demo-router3","uri":"lb://demo","order": 0,
  4. "filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],
  5. "predicates":
  6. [{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}]
  7. }
  8. ]

说明:

(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”}] 这里就是具体的自定义配置规则了,依照下面的规则进行配置。

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

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

?匹配一个字符

*匹配0个或多个字符

**匹配0个或多个目录

  1. 如果你觉得文章对你有些帮助,欢迎微信搜索「软件老王」第一时间阅读或交流!

(2)用例如下

  1. /trip/api/*x 匹配 /trip/api/x,/trip/api/ax,/trip/api/abx ;但不匹配 /trip/abc/x;
  2. /trip/a/a?x 匹配 /trip/a/abx;但不匹配 /trip/a/ax,/trip/a/abcx
  3. /**/api/alie 匹配 /trip/api/alie,/trip/dax/api/alie;但不匹配 /trip/a/api
  4. /**/*.htmlm 匹配所有以.htmlm结尾的路径
  5. /app/*.x 匹配(Matches)所有在app路径下的.x文件
  6. /app/p?ttern 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
  7. /**/example 匹配(Matches) /app/example, /app/foo/example, /example
  8. /app/**/dir/file. 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo
  9. /bar/dir/file.pdf, /app/dir/file.java
  10. /**/*.jsp 匹配(Matches)任何的.jsp 文件

(3)另外说明

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

  1. 符号 {spring:[a-z]+}
  2. 示例代码:
  3. @RequestMapping("/index/{username:[a-b]+}")
  4. @ResponseBody
  5. public String index(@PathVariable("username") String username){
  6. System.out.println(username);
  7. return username;
  8. }
  9. 结果:
  10. index/ab true 输出 ab
  11. index/abbaaa true 输出 abbaaa
  12. index/a false 404错误
  13. index/ac false 404错误

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


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

版权声明:本文为ruanjianlaowang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ruanjianlaowang/p/13745297.html