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

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

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

END/往期推荐:




1.微服务实战系列

2.springboot从入门到精通

3.java入门到精通

4.中间件等

5.程序人生

原创不易,若是以为有点用的话,请绝不留情地素质三连吧,分享、点赞、在看,我不挑,由于这将是我写做更多优质文章的最强动力。

本文分享自微信公众号 - 软件老王(ruanjianlaowang_pub)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索