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