Gateway網(wǎng)關(guān)工作原理及使用方法
1. 什么是 API 網(wǎng)關(guān)(API Gateway)
分布式服務(wù)架構(gòu)、微服務(wù)架構(gòu)與 API 網(wǎng)關(guān)
在微服務(wù)架構(gòu)里,服務(wù)的粒度被進(jìn)一步細(xì)分,各個(gè)業(yè)務(wù)服務(wù)可以被獨(dú)立的設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、部署和管理。這時(shí),各個(gè)獨(dú)立部署單元可以用不同的開(kāi)發(fā)測(cè)試團(tuán)隊(duì)維護(hù),可以使用不同的編程語(yǔ)言和技術(shù)平臺(tái)進(jìn)行設(shè)計(jì),這就要求必須使用一種語(yǔ)言和平 臺(tái)無(wú)關(guān)的服務(wù)協(xié)議作為各個(gè)單元間的通訊方式。
API 網(wǎng)關(guān)的定義
網(wǎng)關(guān)的角色是作為一個(gè) API 架構(gòu),用來(lái)保護(hù)、增強(qiáng)和控制對(duì)于 API 服務(wù)的訪問(wèn)。
API 網(wǎng)關(guān)是一個(gè)處于應(yīng)用程序或服務(wù)(提供 REST API 接口服務(wù))之前的系統(tǒng),用來(lái)管理授權(quán)、訪問(wèn)控制和流量限制等,這樣 REST API 接口服務(wù)就被 API 網(wǎng)關(guān)保護(hù)起來(lái),對(duì)所有的調(diào)用者透明。因此,隱藏在 API 網(wǎng)關(guān)后面的業(yè)務(wù)系統(tǒng)就可以專(zhuān)注于創(chuàng)建和管理服務(wù),而不用去處理這些策略性的基礎(chǔ)設(shè)施。
API 網(wǎng)關(guān)的職能
API 網(wǎng)關(guān)的分類(lèi)與功能
2. Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),Spring Cloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單而有效的統(tǒng)一的API路由管理方式。Spring Cloud Gateway作為Spring Cloud生態(tài)系中的網(wǎng)關(guān),目標(biāo)是替代ZUUL,其不僅提供統(tǒng)一的路由方式,并且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全,監(jiān)控/埋點(diǎn),和限流等。
3. 為什么用Gateway
Spring Cloud Gateway 可以看做是一個(gè) Zuul 1.x 的升級(jí)版和代替品,比 Zuul 2 更早的使用 Netty 實(shí)現(xiàn)異步 IO,從而實(shí)現(xiàn)了一個(gè)簡(jiǎn)單、比 Zuul 1.x 更高效的、與 Spring Cloud 緊密配合的 API 網(wǎng)關(guān)。
Spring Cloud Gateway 里明確的區(qū)分了 Router 和 Filter,并且一個(gè)很大的特點(diǎn)是內(nèi)置了非常多的開(kāi)箱即用功能,并且都可以通過(guò) SpringBoot 配置或者手工編碼鏈?zhǔn)秸{(diào)用來(lái)使用。
比如內(nèi)置了 10 種 Router,使得我們可以直接配置一下就可以隨心所欲的根據(jù) Header、或者 Path、或者 Host、或者 Query 來(lái)做路由。
比如區(qū)分了一般的 Filter 和全局 Filter,內(nèi)置了 20 種 Filter 和 9 種全局 Filter,也都可以直接用。當(dāng)然自定義 Filter 也非常方便。
最重要的幾個(gè)概念
4. Gateway怎么用
說(shuō)白了 Predicate 就是為了實(shí)現(xiàn)一組匹配規(guī)則,方便讓請(qǐng)求過(guò)來(lái)找到對(duì)應(yīng)的 Route 進(jìn)行處理,接下來(lái)我們接下 Spring Cloud GateWay 內(nèi)置幾種 Predicate 的使用。
通過(guò)時(shí)間匹配
Predicate 支持設(shè)置一個(gè)時(shí)間,在請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)的時(shí)候,可以通過(guò)判斷在這個(gè)時(shí)間之前或者之后進(jìn)行轉(zhuǎn)發(fā)。比如我們現(xiàn)在設(shè)置只有在 2019 年 1 月 1 日才會(huì)轉(zhuǎn)發(fā)到我的網(wǎng)站,在這之前不進(jìn)行轉(zhuǎn)發(fā),我就可以這樣配置:
spring: cloud: gateway: routes: - id: time_route uri: http://ityouknow.com predicates: - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
Spring 是通過(guò) ZonedDateTime 來(lái)對(duì)時(shí)間進(jìn)行的對(duì)比,ZonedDateTime 是 Java 8 中日期時(shí)間功能里,用于表示帶時(shí)區(qū)的日期與時(shí)間信息的類(lèi),ZonedDateTime 支持通過(guò)時(shí)區(qū)來(lái)設(shè)置時(shí)間,中國(guó)的時(shí)區(qū)是:Asia/Shanghai
。
After Route Predicate 是指在這個(gè)時(shí)間之后的請(qǐng)求都轉(zhuǎn)發(fā)到目標(biāo)地址。上面的示例是指,請(qǐng)求時(shí)間在 2018 年 1 月 20 日 6 點(diǎn) 6 分 6 秒之后的所有請(qǐng)求都轉(zhuǎn)發(fā)到地址http://ityouknow.com
。+08:00
是指時(shí)間和 UTC 時(shí)間相差八個(gè)小時(shí),時(shí)間地區(qū)為Asia/Shanghai
。
添加完路由規(guī)則之后,訪問(wèn)地址http://localhost:8080
會(huì)自動(dòng)轉(zhuǎn)發(fā)到http://ityouknow.com
。
Before Route Predicate 剛好相反,在某個(gè)時(shí)間之前的請(qǐng)求的請(qǐng)求都進(jìn)行轉(zhuǎn)發(fā)。我們把上面路由規(guī)則中的 After 改為 Before,如下:
spring: cloud: gateway: routes: - id: after_route uri: http://ityouknow.com predicates: - Before=2018-01-20T06:06:06+08:00[Asia/Shanghai]
就表示在這個(gè)時(shí)間之前可以進(jìn)行路由,在這時(shí)間之后停止路由,修改完之后重啟項(xiàng)目再次訪問(wèn)地址http://localhost:8080
,頁(yè)面會(huì)報(bào) 404 沒(méi)有找到地址。
除過(guò)在時(shí)間之前或者之后外,Gateway 還支持限制路由請(qǐng)求在某一個(gè)時(shí)間段范圍內(nèi),可以使用 Between Route Predicate 來(lái)實(shí)現(xiàn)。
spring: cloud: gateway: routes: - id: after_route uri: http://ityouknow.com predicates: - Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]
這樣設(shè)置就意味著在這個(gè)時(shí)間段內(nèi)可以匹配到此路由,超過(guò)這個(gè)時(shí)間段范圍則不會(huì)進(jìn)行匹配。通過(guò)時(shí)間匹配路由的功能很酷,可以用在限時(shí)搶購(gòu)的一些場(chǎng)景中。
通過(guò) Cookie 匹配
Cookie Route Predicate 可以接收兩個(gè)參數(shù),一個(gè)是 Cookie name , 一個(gè)是正則表達(dá)式,路由規(guī)則會(huì)通過(guò)獲取對(duì)應(yīng)的 Cookie name 值和正則表達(dá)式去匹配,如果匹配上就會(huì)執(zhí)行路由,如果沒(méi)有匹配上則不執(zhí)行。
spring: cloud: gateway: routes: - id: cookie_route uri: http://ityouknow.com predicates: - Cookie=ityouknow, kee.e
使用 curl 測(cè)試,命令行輸入:
curl http://localhost:8080 --cookie "ityouknow=kee.e"
則會(huì)返回頁(yè)面代碼,如果去掉--cookie "ityouknow=kee.e"
,后臺(tái)匯報(bào) 404 錯(cuò)誤。
Header Route Predicate 和 Cookie Route Predicate 一樣,也是接收 2 個(gè)參數(shù),一個(gè) header 中屬性名稱(chēng)和一個(gè)正則表達(dá)式,這個(gè)屬性值和正則表達(dá)式匹配則執(zhí)行。
spring: cloud: gateway: routes: - id: header_route uri: http://ityouknow.com predicates: - Header=X-Request-Id, \d+
使用 curl 測(cè)試,命令行輸入:
curl http://localhost:8080 -H "X-Request-Id:666666"
則返回頁(yè)面代碼證明匹配成功。將參數(shù)-H "X-Request-Id:666666"
改為-H "X-Request-Id:neo"
再次執(zhí)行時(shí)返回 404 證明沒(méi)有匹配。
通過(guò) Host 匹配
Host Route Predicate 接收一組參數(shù),一組匹配的域名列表,這個(gè)模板是一個(gè) ant 分隔的模板,用.
號(hào)作為分隔符。它通過(guò)參數(shù)中的主機(jī)地址作為匹配規(guī)則。
spring: cloud: gateway: routes: - id: host_route uri: http://ityouknow.com predicates: - Host=**.ityouknow.com
使用 curl 測(cè)試,命令行輸入:
curl http://localhost:8080 -H "Host: www.ityouknow.com" curl http://localhost:8080 -H "Host: md.ityouknow.com"
經(jīng)測(cè)試以上兩種 host 均可匹配到 host_route 路由,去掉 host 參數(shù)則會(huì)報(bào) 404 錯(cuò)誤。
通過(guò)請(qǐng)求方式匹配
可以通過(guò)是 POST、GET、PUT、DELETE 等不同的請(qǐng)求方式來(lái)進(jìn)行路由。
spring: cloud: gateway: routes: - id: method_route uri: http://ityouknow.com predicates: - Method=GET
使用 curl 測(cè)試,命令行輸入:
# curl 默認(rèn)是以 GET 的方式去請(qǐng)求 curl http://localhost:8080
測(cè)試返回頁(yè)面代碼,證明匹配到路由,我們?cè)僖?POST 的方式請(qǐng)求測(cè)試。
# curl 默認(rèn)是以 GET 的方式去請(qǐng)求 curl -X POST http://localhost:8080
返回 404 沒(méi)有找到,證明沒(méi)有匹配上路由
通過(guò)請(qǐng)求路徑匹配
Path Route Predicate 接收一個(gè)匹配路徑的參數(shù)來(lái)判斷是否走路由。
spring: cloud: gateway: routes: - id: host_route uri: http://ityouknow.com predicates: - Path=/foo/{segment}
如果請(qǐng)求路徑符合要求,則此路由將匹配,例如:/foo/1 或者 /foo/bar。
使用 curl 測(cè)試,命令行輸入:
curl http://localhost:8080/foo/1 curl http://localhost:8080/foo/xx curl http://localhost:8080/boo/xx
經(jīng)過(guò)測(cè)試第一和第二條命令可以正常獲取到頁(yè)面返回值,最后一個(gè)命令報(bào) 404,證明路由是通過(guò)指定路由來(lái)匹配。
通過(guò)請(qǐng)求參數(shù)匹配
Query Route Predicate 支持傳入兩個(gè)參數(shù),一個(gè)是屬性名一個(gè)為屬性值,屬性值可以是正則表達(dá)式。
spring: cloud: gateway: routes: - id: query_route uri: http://ityouknow.com predicates: - Query=smile
這樣配置,只要請(qǐng)求中包含 smile 屬性的參數(shù)即可匹配路由。
使用 curl 測(cè)試,命令行輸入:
curl localhost:8080?smile=x&id=2
經(jīng)過(guò)測(cè)試發(fā)現(xiàn)只要請(qǐng)求匯總帶有 smile 參數(shù)即會(huì)匹配路由,不帶 smile 參數(shù)則不會(huì)匹配。
還可以將 Query 的值以鍵值對(duì)的方式進(jìn)行配置,這樣在請(qǐng)求過(guò)來(lái)時(shí)會(huì)對(duì)屬性值和正則進(jìn)行匹配,匹配上才會(huì)走路由。
spring: cloud: gateway: routes: - id: query_route uri: http://ityouknow.com predicates: - Query=keep, pu.
這樣只要當(dāng)請(qǐng)求中包含 keep 屬性并且參數(shù)值是以 pu 開(kāi)頭的長(zhǎng)度為三位的字符串才會(huì)進(jìn)行匹配和路由。
使用 curl 測(cè)試,命令行輸入:
curl localhost:8080?keep=pub
測(cè)試可以返回頁(yè)面代碼,將 keep 的屬性值改為 pubx 再次訪問(wèn)就會(huì)報(bào) 404, 證明路由需要匹配正則表達(dá)式才會(huì)進(jìn)行路由。
通過(guò)請(qǐng)求 ip 地址進(jìn)行匹配
Predicate 也支持通過(guò)設(shè)置某個(gè) ip 區(qū)間號(hào)段的請(qǐng)求才會(huì)路由,RemoteAddr Route Predicate 接受 cidr 符號(hào) (IPv4 或 IPv6) 字符串的列表(最小大小為 1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子網(wǎng)掩碼)。
spring: cloud: gateway: routes: - id: remoteaddr_route uri: http://ityouknow.com predicates: - RemoteAddr=192.168.1.1/24
可以將此地址設(shè)置為本機(jī)的 ip 地址進(jìn)行測(cè)試。
果請(qǐng)求的遠(yuǎn)程地址是 192.168.1.10,則此路由將匹配。
組合使用
上面為了演示各個(gè) Predicate 的使用,我們是單個(gè)單個(gè)進(jìn)行配置測(cè)試,其實(shí)可以將各種 Predicate 組合起來(lái)一起使用。
例如:
spring: cloud: gateway: routes: - id: host_foo_path_headers_to_httpbin uri: http://ityouknow.com predicates: - Host=**.foo.org - Path=/headers - Method=GET - Header=X-Request-Id, \d+ - Query=foo, ba. - Query=baz - Cookie=chocolate, ch.p - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
各種 Predicates 同時(shí)存在于同一個(gè)路由時(shí),請(qǐng)求必須同時(shí)滿(mǎn)足所有的條件才被這個(gè)路由匹配。
一個(gè)請(qǐng)求滿(mǎn)足多個(gè)路由的謂詞條件時(shí),請(qǐng)求只會(huì)被首個(gè)成功匹配的路由轉(zhuǎn)發(fā)
到此這篇關(guān)于Gateway網(wǎng)關(guān)工作原理及使用方法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringCloud超詳細(xì)講解微服務(wù)網(wǎng)關(guān)Gateway
- 網(wǎng)關(guān)Gateway過(guò)濾器的使用詳解
- SpringCloud?GateWay網(wǎng)關(guān)示例代碼詳解
- springcloud gateway網(wǎng)關(guān)服務(wù)啟動(dòng)報(bào)錯(cuò)的解決
- springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)全局過(guò)濾器功能
- springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼
- springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)的示例代碼
- 深入剖析網(wǎng)關(guān)gateway原理
- Gateway網(wǎng)關(guān)源碼解析
相關(guān)文章
Hadoop 分布式存儲(chǔ)系統(tǒng) HDFS的實(shí)例詳解
HDFS是Hadoop Distribute File System 的簡(jiǎn)稱(chēng),也就是Hadoop的一個(gè)分布式文件系統(tǒng)。這篇文章主要介紹了Hadoop 分布式存儲(chǔ)系統(tǒng) HDFS,需要的朋友可以參考下2019-06-06教你免費(fèi)做一個(gè)屬于自己穩(wěn)定有效的圖床-PicGo
由于現(xiàn)在很多寫(xiě)作平臺(tái)都支持了Markdown語(yǔ)法,導(dǎo)致圖床用的人越來(lái)越多。這篇文章主要介紹了如何免費(fèi)做一個(gè)屬于自己穩(wěn)定有效的圖床-PicGo,需要的朋友可以參考下2020-01-01設(shè)計(jì)引導(dǎo)--一個(gè)鴨子游戲引發(fā)的設(shè)計(jì)理念(多態(tài),繼承,抽象,接口,策略者模式)
設(shè)計(jì)引導(dǎo)--一個(gè)鴨子游戲引發(fā)的設(shè)計(jì)多態(tài),繼承,抽象,接口,策略者模式;這篇博文是從實(shí)際生活中,提煉出來(lái)的設(shè)計(jì)理念,它現(xiàn)在是骨架,現(xiàn)在我加以代碼實(shí)例,完成程序的血肉,以求讓大家活生生的體會(huì)設(shè)計(jì)中的精髓2013-01-01基于 Dubbo Admin 臨時(shí)踢除問(wèn)題服務(wù)實(shí)例步驟
服務(wù)在線上運(yùn)行的過(guò)程中,難免遇到某些節(jié)點(diǎn)有問(wèn)題,為了不影響整體服務(wù)的正常運(yùn)行,需要臨時(shí)下線問(wèn)題的服務(wù)實(shí)例,這篇文章主要介紹了基于 Dubbo Admin 臨時(shí)踢除問(wèn)題服務(wù)實(shí)例,需要的朋友可以參考下2022-12-12git版本庫(kù)創(chuàng)建拓展添加文件到版本庫(kù)教程
這篇文章主要為大家介紹了git版本庫(kù)創(chuàng)建拓展添加文件到版本庫(kù)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04一個(gè)假冒的序列號(hào)被用來(lái)注冊(cè)Internet?Download?Manager,IDM正在退出的解決辦法
這篇文章主要介紹了一個(gè)假冒的序列號(hào)被用來(lái)注冊(cè)Internet?Download?Manager?IDM正在退出的解決辦法,在文章末尾給大家分享了序列號(hào)和綠色軟件,大家根據(jù)自身情況選擇,需要的朋友可以參考下2023-01-01