微服務實戰系列(八)-網關springcloud gateway自定義規則


1. 場景描述

先說明下項目中使用的網關是:springcloud gateway, 因需要給各個網關服務系統提供自定義配置路由規則,實時生效,不用重啟網關(重啟風險大),目前已實現:動態加載自定義路由文件,動態加載路由文件中的路由規則。

2.解決方案

2.1 解決思路

新建總的監控總類,監控網關服務路由規則配置文件,然后每個路由配置文件再監控內容自己文件內容是否變化,動態加載到springcloud 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"}]
    } 
]

說明:

(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 文件

(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錯誤 

網關原代碼是默認開放全部服務,新代碼后會按照自定義規則來,假如未配置,會禁止跳轉。


更多知識請關注公眾號:「軟件老王」,IT技術與相關干貨分享,回復關鍵字獲取對應干貨,java,送必看的10本“武功秘籍”;圖片,送100多萬張可商用高清圖片;面試,送剛畢業就能月薪“20k”的java面試題,軟考,送官方pdf書籍與通關論文,后續會不斷更新,比如“工具”,“視頻“等,已經在整理中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM