Spring Cloud Gateway原理解析

1衣洁、網(wǎng)關(guān)介紹
1、為什么產(chǎn)生了網(wǎng)關(guān)

微服務(wù)架構(gòu)下寒波,隨著服務(wù)的數(shù)量不斷累加屯远,當(dāng)客戶端訪問這些微服務(wù)的時(shí)候,往往需要記住即使甚至上百個(gè)地址扛伍,這對于客戶端而言,是非常復(fù)雜且難以維護(hù)的。

數(shù)不清的微服務(wù)

如果直接讓客戶端和各個(gè)微服務(wù)通信礼患,存在如下問題,

  • 客戶端會請求多個(gè)不同的服務(wù)掠归,需要維護(hù)不同的請求地址缅叠,增加了開發(fā)難度
  • 跨域請求的問題
  • 加大身份認(rèn)證的難度,每個(gè)微服務(wù)需要獨(dú)立認(rèn)證

因此需要一種對外的統(tǒng)一集散地虏冻,類似于在所有服務(wù)的外層包裝一個(gè)管卡肤粱,所有的請求不再是直接到服務(wù),而實(shí)先經(jīng)過網(wǎng)關(guān)厨相。如此一來客戶端只需要記住一個(gè)網(wǎng)關(guān)领曼,比如http://oneNet.com/getorder/12

網(wǎng)關(guān)位置

1蛮穿、網(wǎng)關(guān)應(yīng)用場景

除了上述優(yōu)點(diǎn)庶骄,網(wǎng)關(guān)還有如下優(yōu)點(diǎn),

  • 統(tǒng)一入口:未全部為服務(wù)提供一個(gè)唯一的入口践磅,網(wǎng)關(guān)起到外部和內(nèi)部隔離的作用单刁,保障了后臺服務(wù)的安全性。
  • 鑒權(quán)校驗(yàn):識別每個(gè)請求的權(quán)限府适,拒絕不符合要求的請求羔飞。
  • 動態(tài)路由:動態(tài)的將請求路由到不同的后端集群中。
  • 減少客戶端與服務(wù)端的耦合:服務(wù)可以獨(dú)立發(fā)展檐春,通過網(wǎng)關(guān)層來做映射逻淌。

甚至:監(jiān)控、負(fù)載均衡喇聊、緩存恍风、請求分片和管理、靜態(tài)響應(yīng)處理誓篱。

1朋贬、流行組件

常見的API網(wǎng)管實(shí)現(xiàn)有,

  • 基于Nginx+Lua開發(fā)窜骄, 性能高锦募,穩(wěn)定,有多個(gè)可用的插件(限流邻遏、鑒權(quán)等等)可用開箱即用糠亩。

  • Zuul虐骑, Netflix開源,功能豐富赎线,使用Java開發(fā)廷没,易于二次開發(fā),需要運(yùn)行在Web容器中垂寥,如Tomcat

  • Traefik颠黎,Go語言開發(fā),輕量易用滞项,提供大多數(shù)功能如服務(wù)路由狭归,負(fù)載均衡等等,提供Web UI界面文判。

  • Spring Cloud Gateway过椎,SpringCloud提供的網(wǎng)關(guān)服務(wù)。

  • 基于Nginx的網(wǎng)關(guān)實(shí)現(xiàn)戏仓,Nginx是一個(gè)自由的疚宇、開源的、高性能的HTTP服務(wù)器和反向代理服務(wù)器柜去,同時(shí)也是一個(gè)IMAP灰嫉、POP3、SMTP代理服務(wù)器嗓奢。

2、Spring Cloud Zuul對比Gateway

基于目前Spring cloud 支持的兩種網(wǎng)關(guān)浑厚,Zuul和Gateway股耽,做如下對比

1、來源

  • zuul則是netflix公司的項(xiàng)目钳幅,只是spring將zuul集成在spring-cloud中使用而已物蝙。
  • spring-cloud-Gateway是spring-cloud的一個(gè)子項(xiàng)目。因?yàn)閦uul2.0連續(xù)跳票和zuul1的性能表現(xiàn)不是很理想敢艰,所以催生了spring團(tuán)隊(duì)開發(fā)了Gateway項(xiàng)目诬乞。

2、相同點(diǎn)

  • 底層都是servlet
  • 兩者均是web網(wǎng)關(guān)钠导,處理的是http請求

3震嫉、不同點(diǎn)

內(nèi)部實(shí)現(xiàn)

  • gateway對比zuul多依賴了spring-webflux,在spring的支持下牡属,功能更強(qiáng)大票堵,內(nèi)部實(shí)現(xiàn)了限流、負(fù)載均衡等逮栅,擴(kuò)展性也更強(qiáng)悴势,但同時(shí)也限制了僅適合于Spring Cloud套件窗宇。
  • zuul則可以擴(kuò)展至其他微服務(wù)框架中,其內(nèi)部沒有實(shí)現(xiàn)限流特纤、負(fù)載均衡等军俊。

是否支持異步

  • zuul僅支持同步
  • gateway支持異步。理論上gateway則更適合于提高系統(tǒng)吞吐量(但不一定能有更好的性能)捧存,最終性能還需要通過嚴(yán)密的壓測來決定

框架設(shè)計(jì)的角度

  • gateway具有更好的擴(kuò)展性粪躬,并且其已經(jīng)發(fā)布了2.0.0的RELESE版本,穩(wěn)定性也是非常好的

性能

  • WebFlux 模塊的名稱是 spring-webflux矗蕊,名稱中的 Flux 來源于 Reactor 中的類 Flux短蜕。Spring webflux 有一個(gè)全新的非堵塞的函數(shù)式 Reactive Web 框架,可以用來構(gòu)建異步的傻咖、非堵塞的朋魔、事件驅(qū)動的服務(wù),在伸縮性方面表現(xiàn)非常好卿操。使用非阻塞API警检。 Websockets得到支持,并且由于它與Spring緊密集成害淤,所以將會是一個(gè)更好的 開發(fā) 體驗(yàn)扇雕。Zuul 1.x,是一個(gè)基于阻塞io的API Gateway窥摄。Zuul已經(jīng)發(fā)布了Zuul 2.x镶奉,基于Netty,也是非阻塞的崭放,支持長連接哨苛,但Spring Cloud暫時(shí)還沒有整合計(jì)劃。

總結(jié):
1币砂、總的來說建峭,在微服務(wù)架構(gòu),如果使用了Spring Cloud生態(tài)的基礎(chǔ)組件决摧,則Spring Cloud Gateway相比而言更加具備優(yōu)勢亿蒸,單從流式編程+支持異步上就足以讓開發(fā)者選擇它了。
2掌桩、對于小型微服務(wù)架構(gòu)或是復(fù)雜架構(gòu)(不僅包括微服務(wù)應(yīng)用還有其他非Spring Cloud服務(wù)節(jié)點(diǎn))边锁,zuul也是一個(gè)不錯(cuò)的選擇。

3拘鞋、Spring cloud Gateway

什么是Spring cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目砚蓬,該項(xiàng)目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術(shù)開發(fā)的網(wǎng)關(guān)盆色,它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的 API 路由管理方式灰蛙。

Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系統(tǒng)中的網(wǎng)關(guān)祟剔,目標(biāo)是替代 Netflix Zuul,其不僅提供統(tǒng)一的路由方式摩梧,并且基于 Filter 鏈的方式提供了網(wǎng)關(guān)基本的功能物延,例如:安全,監(jiān)控/指標(biāo)仅父,和限流叛薯。

術(shù)語

  • Route(路由):這是網(wǎng)關(guān)的基本構(gòu)建塊。它由一個(gè) ID笙纤,一個(gè)目標(biāo) URI耗溜,一組斷言和一組過濾器定義。如果斷言為真省容,則路由匹配抖拴。

  • Predicate(斷言):這是一個(gè) Java 8 的 Predicate。輸入類型是一個(gè) ServerWebExchange腥椒。我們可以使用它來匹配來自 HTTP 請求的任何內(nèi)容阿宅,例如 headers 或參數(shù)。

  • Filter(過濾器):這是org.springframework.cloud.gateway.filter.GatewayFilter的實(shí)例笼蛛,我們可以使用它修改請求和響應(yīng)洒放。

原理

客戶端向 Spring Cloud Gateway 發(fā)出請求。然后在 Gateway Handler Mapping 中找到與請求相匹配的路由滨砍,將其發(fā)送到 Gateway Web Handler往湿。Handler 再通過指定的過濾器鏈來將請求發(fā)送到我們實(shí)際的服務(wù)執(zhí)行業(yè)務(wù)邏輯,然后返回惋戏。過濾器之間用虛線分開是因?yàn)檫^濾器可能會在發(fā)送代理請求之前(“pre”)或之后(“post”)執(zhí)行業(yè)務(wù)邏輯煌茴。


Spring cloud Gateway工作原理

簡單上手

Spring Cloud Gateway 網(wǎng)關(guān)路由有兩種配置方式,這兩種方式是等價(jià)的日川,建議使用 yml 方式進(jìn)配置。

  • 在配置文件 yml 中配置
  • 通過@Bean自定義 RouteLocator矩乐,在啟動主類 Application 中配置

1龄句、加入依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2、配置文件

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/meteor_93
//上面這段配置的意思是散罕,配置了一個(gè) id 為 gateway-service 的路由規(guī)則分歇,當(dāng)訪問地址 http://localhost:8080/meteor_93時(shí)會自動轉(zhuǎn)發(fā)到地址:http://localhost:8080/meteor_93

3、路由配置(跟配置為文件一樣)

@SpringBootApplication
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("path_route", r -> r.path("/meteor_93")
                        .uri("https://blog.csdn.net"))
                .build();
    }

}

4欧漱、Predicate詳解

Predicate 來源于 Java 8职抡,是 Java 8 中引入的一個(gè)函數(shù),Predicate 接受一個(gè)輸入?yún)?shù)误甚,返回一個(gè)布爾值結(jié)果缚甩。該接口包含多種默認(rèn)方法來將 Predicate 組合成其他復(fù)雜的邏輯(比如:與谱净,或,非)擅威『咎剑可以用于接口請求參數(shù)校驗(yàn)、判斷新老數(shù)據(jù)是否有變化需要進(jìn)行更新操作郊丛。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實(shí)現(xiàn)了各種路由匹配規(guī)則李请,有通過 Header、請求參數(shù)等不同的條件來進(jìn)行作為條件匹配到對應(yīng)的路由厉熟。網(wǎng)上有一張圖總結(jié)了 Spring Cloud 內(nèi)置的幾種 Predicate 的實(shí)現(xiàn)导盅。

Perdicate
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揍瑟,隨后出現(xiàn)的幾起案子白翻,更是在濱河造成了極大的恐慌,老刑警劉巖月培,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘁字,死亡現(xiàn)場離奇詭異,居然都是意外死亡杉畜,警方通過查閱死者的電腦和手機(jī)纪蜒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來此叠,“玉大人纯续,你說我怎么就攤上這事∶鹪” “怎么了猬错?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茸歧。 經(jīng)常有香客問我倦炒,道長,這世上最難降的妖魔是什么软瞎? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任逢唤,我火速辦了婚禮,結(jié)果婚禮上涤浇,老公的妹妹穿的比我還像新娘鳖藕。我一直安慰自己,他們只是感情好只锭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布著恩。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喉誊。 梳的紋絲不亂的頭發(fā)上邀摆,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機(jī)與錄音裹驰,去河邊找鬼隧熙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幻林,可吹牛的內(nèi)容都是我干的贞盯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沪饺,長吁一口氣:“原來是場噩夢啊……” “哼躏敢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起整葡,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤件余,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后遭居,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啼器,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年俱萍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端壳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枪蘑,死狀恐怖损谦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岳颇,我是刑警寧澤照捡,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站话侧,受9級特大地震影響栗精,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞻鹏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一术羔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乙漓,春花似錦、人聲如沸释移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涩蜘,卻和暖如春嚼贡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背同诫。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工粤策, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人误窖。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓叮盘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霹俺。 傳聞我的和親對象是個(gè)殘疾皇子柔吼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容