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