微服務平臺之網關架構與應用
前言:
API 網關出現的原因是微服務架構的出現,不同的微服務一般會有不同的網絡地址,而外部客戶端可能需要調用多個服務的接口才能完成一個業務需求,如果讓客戶端直接與各個微服務通信,會有以下的問題:
1、客戶端會多次請求不同的微服務,增加了客戶端的復雜性。
2、存在跨域請求,在一定場景下處理相對復雜。
3、認證復雜,每個服務都需要獨立認證。
4、難以重構,隨著項目的迭代,可能需要重新劃分微服務。例如,可能將多個服務合并成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通信,那么重構將會很難實施。
5、某些微服務可能使用了防火墻 / 瀏覽器不友好的協議,直接訪問會有一定的困難。
以上這些問題可以借助 API 網關解決。API 網關是介于客戶端和服務器端之間的中間層,所有的外部請求都會先經過 API 網關這一層。也就是說,網關的角色是作為一個 API 架構,用來保護、增強和控制對于 API 服務的訪問。
目錄:
1、API網關的定義
2、為什么選擇Gateway
3、部分Predicate的實現
4、普元EOS 8 網關架構
5、普元EOS 8 網關應用
6、未來展望
1.API網關的定義
網關的角色是作為一個 API 架構,用來保護、增強和控制對于 API 服務的訪問。API 網關是一個處于應用程序或服務(提供 REST API 接口服務)之前的系統,用來管理授權、訪問控制和流量限制等,這樣 REST API 接口服務就被 API 網關保護起來,對所有的調用者透明。因此,隱藏在 API 網關后面的業務系統就可以專注于創建和管理服務,而不用去處理這些策略性的基礎設施。
網關的職能
- 請求接入:作為所有API接口服務請求的接入點。
- 業務聚合:作為所有后端業務服務的聚合點。
- 中介策略:實現安全,驗證,路由,過濾等策略。
- 統一管理:對所有API服務和策略進行統一管理。
主要功能
主要功能大致分為穩定與安全,提供更好的服務兩方面:
穩定與安全:
- 全局性流控
- 日志統計
- 防止SQL注入
- 防止Web攻擊
- 屏蔽工具掃描
- 黑白IP名單
- 證書/加密處理
提供更好的服務:
- 服務級別流控
- 服務降級與熔斷
- 路由與負載均衡,灰度策略
- 服務過濾,聚合發現
- 權限驗證與用戶等級策略
- 業務規則與參數校驗
- 多級緩存策略
2.為什么選擇Gateway
Spring Cloud Gateway 可以看做是一個 Zuul 1.x 的升級版和代替品,比 Zuul 2 更早的使用 Netty 實現異步 IO,從而實現了一個簡單、比 Zuul 1.x 更高效的、與 Spring Cloud 緊密配合的 API 網關。
Spring Cloud Gateway 里明確的區分了 Router 和 Filter,并且一個很大的特點是內置了非常多的開箱即用功能,并且都可以通過 SpringBoot 配置或者手工編碼鏈式調用來使用。
比如內置了 10 種 Router,使得我們可以直接配置一下就可以隨心所欲的根據 Header、或者 Path、或者 Host、或者 Query 來做路由。
比如區分了一般的 Filter 和全局 Filter,內置了 20 種 Filter 和 9 種全局 Filter,也都可以直接用。當然自定義 Filter 也非常方便。
幾個重要概念:
路由:Gateway的基礎構建模塊。它包括一個ID,一個目標URL,一個斷言集合和一個過濾器集合。如果斷言判斷為真,則路由匹配。
斷言:這是Java8的新增功能,輸入的類型為Spring框架的ServerWebExchange。它可以匹配HTTP請求中的任何東西,比如:請求頭或者參數。
過濾器:是Spring框架的GatewayFilter,請求和響應都可以被Filter修改。
3.部分Predicate的實現
Predicate 來源于 Java 8,是 Java 8 中引入的一個函數,Predicate 接受一個輸入參數,返回一個布爾值結果。該接口包含多種默認方法來將 Predicate 組合成其他復雜的邏輯(比如:與,或,非)。可以用于接口請求參數校驗、判斷新老數據是否有變化需要進行更新操作。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實現了各種路由匹配規則,有通過 Header、請求參數等不同的條件來進行作為條件匹配到對應的路由。
這邊就列舉幾個匹配的轉發實例:
1、通過時間匹配
Predicate 支持設置一個時間,在請求進行轉發的時候,可以通過判斷在這個時間之前或者之后進行轉發。比如我們現在設置只有在 2020 年 1 月 1 日才會轉發到我的網站,在這之前不進行轉發,我就可以這樣配置:
Spring 是通過 ZonedDateTime 來對時間進行的對比,ZonedDateTime 是 Java 8 中日期時間功能里,用于表示帶時區的日期與時間信息的類,ZonedDateTime 支持通過時區來設置時間,中國的時區是:Asia/Shanghai。
After Route Predicate 是指在這個時間之后的請求都轉發到目標地址。上面的示例是指,請求時間在 2020 年 1 月1 日 6 點之后的所有請求都轉發到地址http://www.primeton.com。+08:00是指時間和 UTC 時間相差八個小時,時間地區為Asia/Shanghai。添加完路由規則之后,訪問地址http://網關IP:PORT會自動轉發到http:// www.primeton.com。
Before Route Predicate 剛好相反,在某個時間之前的請求的請求都進行轉發。我們把上面路由規則中的 After 改為 Before,如下:
就表示在這個時間之前可以進行路由,在這時間之后停止路由,修改完之后重啟項目再次訪問地址http://網關IP:PORT,頁面會報 404 沒有找到地址。
在時間之前或者之后外,Gateway 還支持限制路由請求在某一個時間段范圍內,可以使用 Between Route Predicate 來實現:
2、通過 Cookie 匹配
Cookie Route Predicate 可以接收兩個參數,一個是 Cookie name , 一個是正則表達式,路由規則會通過獲取對應的 Cookie name 值和正則表達式去匹配,如果匹配上就會執行路由,如果沒有匹配上則不執行。
使用 curl 測試,命令行輸入:
則會返回頁面代碼,如果去掉--cookie "primeton=eos.primeton",后臺會提示 404 錯誤
Header Route Predicate 和 Cookie Route Predicate 一樣,也是接收 2 個參數,一個 header 中屬性名稱和一個正則表達式,這個屬性值和正則表達式匹配則執行。
使用 curl 測試,命令行輸入:
則返回頁面代碼證明匹配成功。將參數-H "X-Request-Id:88888"改為-H "X-Request-Id:zero"再次執行時返回 404 證明沒有匹配。
3、通過 Host 匹配
Host Route Predicate 接收一組參數,一組匹配的域名列表,這個模板是一個 ant 分隔的模板,用.號作為分隔符。它通過參數中的主機地址作為匹配規則。
使用 curl 測試,命令行輸入:
經測試以上兩種 host 均可匹配到 host_route 路由,去掉 host 參數則會報 404 錯誤。
4.普元EOS 8網關架構
EOS 8網關架構圖
1. 在微服務治理平臺中, 一個系統將部署一套網關。系統內部應用的前端訪問后端, 或者其它系統的應用需要訪問此系統內的應用提供的接口, 請求必須走網關。
2. 網關對外提供治理數據的 rest 接口, 治理平臺通過此接口將治理數據發送至網關。
3. 網關可以部署多個對等實例, 以擴充其性能。
4. 網關收到治理數據之后, 由統一存儲接口保持至持久存儲之中,然后由存儲的通知機制,通知所有網關實例。
5. 為了提升性能,避免頻繁從持久存儲中查詢數據,網關內部設計了基于內存的高速緩存。它們在網關啟動時,將自動從持久存儲加載治理數據。
6. 網關緩存也支持通過懶加載的方式, 按需加載所需治理數據。
7. 經歷各filter之后, 請求發往應用的哪些實例, 將在 LBPredicate 之中決定, 它會根據請求頭中帶的應用實例組編碼對應用實例進行過濾。
8. EOS8的網關將不在和Coframe共用一個持久化存儲,轉而使用應用自己本身的存儲,大大降低接入成本。
9. 認證業務插件化改造,只需實現網關提供的認證接口,即可快速完成認證和鑒權,用戶也可以逐步實現按需擴展的需求。
EOS 8網關設計要點
1. EOS8的網關將不在和Coframe共用一個持久化存儲,轉而使用應用自己本身的存儲,大大降低接入成本。
2. 認證業務插件化改造,只需實現網關提供的認證接口,即可快速完成認證和鑒權,用戶也可以逐步實現按需擴展的需求。
實現細節
1. 創建插件項目
項目名稱格式建議以gateway-plugin- 開頭, 如 gateway-plugin-handle-eos8
為了統一第三方jar包依賴, 防止版本沖突, 項目父pom必須為網關的pom
2. 實現gateway-core中的UserService接口
參數說明:
3. 插件構建與部署
在插件的pom中, 需要添加構建相關的配置
網關的部署介質結構如下:
EOS_Microservices_API_Gateway/
├── bin
│ ├── shutdown.sh
│ └── startup.sh
├── config
│ ├── application.yml
│ └── logback-spring.xml
├── gateway-boot-5.0.0-GA-SNAPSHOT.jar
├── lib
│ └── plugins
│ └── gateway-plugin-handle-eos8 -8.1.0-LA-SNAPSHOT.jar
└── logs
├── eos-dap-gateway
│ └── eos-dap-gateway.pid
├── eos-dap-gateway.out
├── gateway.log
└── gateway-trace.log
插件構建成jar包之后, 需要將其復制至lib/plugins目錄之下, 然后重啟網關。
5.普元EOS 8網關應用
為了方便用戶更好的理解和使用我們的EOS8網關,在EOS8的Governor平臺中,提供了一整套的可視化操作。
主要分為網關詳情,白名單配置,API發布和授權(針對跨系統訪問),路由,日志,統計查詢,Top查詢等功能
1. 白名單配置
網關上線后,如果開啟了token有效性驗證,根據自己的業務需要可以配置放行的白名單(配置了路由轉發的情況下,白名單的請求接口也需要添加對應的url前綴)
2. API發布與授權
同系統的網關調用,只需要請求頭中的X-EOS-SourceSysKey與當前系統憑證一致即可,并不需要進行API發布與授權
當本系統的中的接口需要被其他系統調用的時候,就需要用到API發布和API授權功能
- Governor會自動讀取系統內所有對外的EOS服務接口,點擊已發布后,進入API授權功能
- 新增指定的訂閱者后,將剛發發布的接口進行授權,即可完成API授權功能
- 在調用者一邊,創建一個實體類實現SDKApiSubscriberProvider接口即可
3.路由配置
在路由配置界面,我們提供了可視化的路由配置功能,并且提供三種不同的路由模板,方便用戶快速完成路由的配置。
4. 日志查詢
網關運行后,所有系統日志均可在日志頁面進行查詢。
5. 統計查詢
所有經過的網關的請求都會被記錄并且生成統計,方便日后的定位與分析。
6. TOP查詢
我們還會對請求數,平均響應時間,錯誤數,錯誤率進行TOP查詢,方便用戶準確定位和及時跟蹤。
6.未來展望
1. 通過我們的規則制定,在插件中, 可以為網關添加各種 RoutePredicateFactory, GatewayFilterFactory, Filter, Predicate 等, 擴充網關在路由匹配, 請求過濾, 負載均衡等各方面的能力,支持各種個性化的改造。
2. 在Governor的網關管理界面,提供整套的網關插件管理功能。
3. 同時可以實現高效的插件熱部署。
以上就是我為大家帶來的EOS服務網關架構的介紹,希望對大家有所幫助,如有不足之處也請多多指教,謝謝。