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

1. 場景描述

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

2.解決方案

2.1 解決思路

新建總的監控總類,監控網關服務路由規則配置文件,而後每一個路由配置文件再監控內容本身文件內容是否變化,動態加載到springcloud gateway中。java

2.2 配置規則說明

bc-ruanjianlaowang-all.yaml是須要加載的配置文件名稱,建立的有監聽,當新增新的自定義路由規則文件,會自動去刷自定義規則。git

gateways: bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json

建立自定義路由規則文件,目前已經新建了兩個網關服務的文件,bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json,只需配置自定義規則便可,後續有其餘網關服務,需新增自定義規則json文件,而後在bc-ruanjianlaowang-all.yaml配置下文件名稱便可,不用重啓網關,會自動實時動態加載生效。github

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"}] } ]

說明:web

(1) "id": "demo-router3",id儘可能用本中心名稱+router+序號,要惟一;spring

(2)"uri":"lb://demo",這裏能夠是其餘中心在註冊中心的服務名稱,假若有多個服務的話,默認負載均衡,輪詢訪問後面提供的對應服務;也能夠這樣配置:"uri":"http://10.192.168.10.:8010/",這樣的配置是針對老服務沒在註冊中心註冊,須要配置路徑。json

(3)"filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],這裏的含義是默認去掉第一層路徑就至關於去掉demo進行訪問api

(4) [{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}] 這裏就是具體的自定義配置規則了,依照下面的規則進行配置。springboot

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]+}")@ResponseBodypublic String index(@PathVariable("username") String username){ System.out.println(username); return username;}結果:index/ab true 輸出 abindex/abbaaa true 輸出 abbaaaindex/a false 404錯誤index/ac false 404錯誤 

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

END/往期推薦:




1.微服務實戰系列

2.springboot從入門到精通

3.java入門到精通

4.中間件等

5.程序人生

原創不易,若是以爲有點用的話,請絕不留情地素質三連吧,分享、點贊、在看,我不挑,由於這將是我寫做更多優質文章的最強動力。

本文分享自微信公衆號 - 軟件老王(ruanjianlaowang_pub)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索