閘道器服務自定義路由規則(springcloud+nacos)
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 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流