網關服務自定義路由規則(springcloud+nacos)
- 2019 年 10 月 21 日
- 筆記
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 軟體老王
網關原程式碼是默認開放全部服務,新程式碼後會按照自定義規則來,假如未配置,會禁止跳轉。
I』m 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流!