1. 程式人生 > >閘道器服務自定義路由規則(springcloud+nacos)

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