spring cloud gateway是spring cloud的一個全新項目,基于spring5.0 + spring boot2.0和project reactor等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的api路由管理方式
它基于webflux架構實作,而webflux架構底層則使用了高性能的reactor模式通信架構netty
其核心是一系列的過濾器,可以将用戶端的請求轉發到不同的微服務,是整個微服務api請求的入口,可以實作使用者的驗證登入、解決跨域、日志攔截、權限控制、限流、熔斷、負載均衡、黑名單與白名單機制等功能
具備一些網關的進階功能:動态路由、限流、路徑重寫等
工作原理:
用戶端向 spring cloud gateway 送出請求.如果網關處理程式映射确定請求與路由比對,則将其發送到網關 web 處理程式.此處理程式通過特定于請求的過濾器鍊運作請求.過濾器被虛線分隔的原因是過濾器可以在發送代理請求之前和之後運作邏輯.執行所有“預”過濾器邏輯.然後進行代理請求.發出代理請求後,将運作“post”過濾器邏輯
1.route(路由):路由是建構網關的基本子產品,它由id,目标uri,一系列的斷言和過濾器組成,如果斷言為true則比對該路由,目标uri會被通路.
2.predicate(斷言):這是一個java 8的predicate,可以使用它來比對來自http請求的任何内容,如:請求頭和請求參數.斷言的輸入類型是一個serverwebexchange.
3.filter(過濾器):指的是spring架構中gatewayfilter的執行個體,使用過濾器,可以在請求被路由前或者後對請求進行修改.
總結:web請求,通過一些比對條件,定位到真正的服務節點.并在這個轉發過程的前後,進行一些精細化控制.predicate就是比對條件,而filter,就可以了解為一個無所不能的攔截器.有了這兩個元素,再加上目标uri,就可以實作具體的路由了
每一個<code>predicate</code>的使用,你可以了解為:<code>當滿足這種條件後才會被轉發</code>,如果是多個,那就是都滿足的情況下被轉發,當<code>predicates</code>配置項隻配置了一個<code>predicate</code>且沒有配置<code>path</code>時,<code>path</code>的預設值為<code>/**</code>
當通路<code>http://localhost:8090/myblog.html</code>時就會被自動轉發到<code>https://blog.51cto.com/abcd</code>
當通路<code>http://localhost:8090/abcd/任意字元</code> 時會被自動轉發到<code>https://blog.51cto.com/abcd</code>,這裡隻要端口号後面的開始路徑比對<code>/abcd</code>就可以了
after:滿足請求時間在指定的時間之後
小技巧:可以使用代碼生成帶有時區的目前時間
before:滿足請求時間在指定的時間之前
between:滿足請求時間在指定的時間之間
示例一:
示例二:
相同的<code>predicate</code>也可以配置多個,請求的轉發是必須滿足所有的<code>predicate</code>後才可以進行路由轉發
首先參照《spring cloud alibaba入門一:建立maven依賴管理項目》建立一個子項目,然後參照《spring cloud alibaba入門二:nocas注冊中心》引入spring cloud和nacos依賴,下面來進行gateway子項目配置
gateway子項目、product子項目、nacos都要啟動
請求: http://127.0.0.1:8090/product/book/add?bookname=三體 實際請求位址: http://192.168.1.197:8011/book/add?bookname=三體 或者 http://192.168.1.197:8012/book/add?bookname=三體 因為采用了啟動了兩個執行個體,請求的時候采用了負載均衡機制
http://127.0.0.1:8090/testroute01
https://163.com
會直接跳轉到 https://163.com 這個網站