成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度解析Spring Cloud Gateway的底層實(shí)現(xiàn)原理

原創(chuàng) 精選
開(kāi)發(fā) 架構(gòu)
Spring Cloud Gateway是一個(gè)基于Spring Framework 5和Project Reactor的響應(yīng)式API網(wǎng)關(guān),旨在為構(gòu)建分布式微服務(wù)架構(gòu)提供高性能和靈活的路由機(jī)制。

作者 | 波哥

審校 | 重樓

Spring Cloud Gateway是一個(gè)基于Spring Framework 5和Project Reactor的響應(yīng)式API網(wǎng)關(guān),旨在為構(gòu)建分布式微服務(wù)架構(gòu)提供高性能和靈活的路由機(jī)制底層實(shí)現(xiàn)基于Spring WebFlux框架,它使用WebFlux的HandlerMapping和HandlerAdapter來(lái)處理請(qǐng)求和生成響應(yīng)使用了反應(yīng)式編程的思想基于Project Reactor庫(kù)實(shí)現(xiàn)異步、非阻塞的事件驅(qū)動(dòng)架構(gòu),以提高性能和吞吐量。

本文將帶你深入spring Cloud Gateway的底層實(shí)現(xiàn)原理,重點(diǎn)關(guān)注其核心組件和代碼實(shí)現(xiàn)。

1. Spring Cloud Gateway核心組件

Spring Cloud Gateway的核心組件主要有:

  • Routes(路由):定義了URI、謂詞(Predicates)和過(guò)濾器(Filters)的規(guī)則,用于將請(qǐng)求映射到后端服務(wù)。
  • Predicates(謂詞):定義了匹配條件,用于決定請(qǐng)求是否應(yīng)該映射到該路由。
  • Filters(過(guò)濾器):用于在請(qǐng)求和響應(yīng)期間對(duì)請(qǐng)求和響應(yīng)進(jìn)行修改或轉(zhuǎn)換在調(diào)用過(guò)程中,會(huì)有多個(gè)過(guò)濾器形成過(guò)濾器鏈,用于處理請(qǐng)求、修改請(qǐng)求頭、記錄日志、限流等操作。

2.SpringCloud Gateway的具體使用

先來(lái)了解下Spring Cloud Gateway的具體使用過(guò)程包括定義路由規(guī)則、自定義過(guò)濾器、啟動(dòng)應(yīng)用等步驟。讓我們逐步詳細(xì)介紹這些步驟。

  • 定義路由規(guī)則

首先,在Spring Cloud Gateway中,我們需要定義路由規(guī)則。路由規(guī)則定義了請(qǐng)求該如何被路由到后端服務(wù)。這些規(guī)則通常以Java或YAML配置文件的形式提供YAML配置為例:

  • 自定義過(guò)濾器

我們可以編寫自定義過(guò)濾器,對(duì)請(qǐng)求或響應(yīng)進(jìn)行特定的處理,例如添加頭信息、修改請(qǐng)求、記錄日志等。這里定義了要給GlobalFilter類型的過(guò)濾器,當(dāng)然也可以定義非GlobalFilter類型的過(guò)濾器。

  • 啟動(dòng)應(yīng)用

通過(guò)啟動(dòng)Spring Boot應(yīng)用程序,Spring Cloud Gateway將開(kāi)始監(jiān)聽(tīng)配置的端口,并根據(jù)路由規(guī)則將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的后端服務(wù)。

  • 訪問(wèn)API

現(xiàn)在您可以通過(guò)訪問(wèn)定義的路由規(guī)則來(lái)測(cè)試API。

例如,對(duì)于上述路由規(guī)則的Java配置方式,可以使用以下URL訪問(wèn)API:

http://localhost:8080/sample/some-endpoint

Spring Cloud Gateway將根據(jù)路由規(guī)則將請(qǐng)求轉(zhuǎn)發(fā)到http://example.com

3.代碼原理剖析

接下來(lái)我們從上述使用案例入手,從GateWay的源碼層面分析其底層實(shí)現(xiàn)原理。要理解其原理,其實(shí)只要理解如下這張圖就足夠了,所以接下來(lái)的分析我們將圍繞這圖展開(kāi)講解。

Gateway為網(wǎng)關(guān),也就是統(tǒng)一的入口,它本身也是一個(gè)Web應(yīng)用,在上面我們說(shuō)過(guò)它是WebFlux框架,WebFlux大部分朋友可能都沒(méi)接觸過(guò),我們可以使用SpringMVC進(jìn)行類比。從上圖我們可以看出,當(dāng)請(qǐng)求到達(dá)Gateway后,首先會(huì)進(jìn)入DispatcherHandler.handle方法進(jìn)行處理,在該方法中調(diào)用GatewayHandlerMapping.getHandler方法,然后進(jìn)入GatewayWebHandler.handle方法,隨后進(jìn)入Filter鏈進(jìn)行處理,處理完成后調(diào)用具體的服務(wù)綜上,在整個(gè)的調(diào)用過(guò)程中使用到:DispatcherHandler、RoutePredicateHandlerMappingSimpleHandlerAdapterFilteringWebHandler幾個(gè)核心的類(當(dāng)然還使用到了Ribbon負(fù)載均衡、Netty/Nacos等注冊(cè)中心相關(guān)的核心代碼,不過(guò)本篇我們只分析Gateway相關(guān)源碼),接下來(lái)我們將詳細(xì)分析關(guān)鍵代碼

1.DispatcherHandler

該類做為Gateway的入口,接受所有網(wǎng)關(guān)的請(qǐng)求,類似于SpringMVC的DispatcherServlet類,所有的請(qǐng)求都將進(jìn)入到handle方法中:

2.RoutePredicateHandlerMapping

這個(gè)RoutePredicateHandlerMapping就是上述handlerMappings的具體實(shí)現(xiàn)類,在handle方法就會(huì)使用到該類的實(shí)例,該類的主要作用是獲取Route,也就是我們?cè)谂渲梦募锌赡軙?huì)配置多個(gè)Route對(duì)于當(dāng)前請(qǐng)求最終會(huì)使用哪個(gè)Route。

很多朋友會(huì)問(wèn):HandlerMappings有那么多實(shí)現(xiàn)類,你怎么知道會(huì)使用RoutePredicateHandlerMapping呢?

要回答這個(gè)問(wèn)題,得對(duì)SpringBoot的底層實(shí)現(xiàn)有一定的了解,針對(duì)SpringBoot的底層實(shí)現(xiàn)大家可以看相關(guān)的文章,這里不做分析,在這里大家只需要尋找到

的spring.factories文件,SpringBoot會(huì)讀取該文件中的配置,并將這些配置交由Spring容器管理就可以了。

在該配置中有一個(gè)配置類:GatewayAutoConfiguration,該配置類中完成對(duì)RoutePredicateHandlerMappingFilteringWebHandler等的配置:

RoutePredicateHandlerMapping做為HandlerMapping的實(shí)現(xiàn)類,自然就會(huì)被調(diào)用到。

接下來(lái)我們看RoutePredicateHandlerMapping是如何幫我們尋找到Route的:

如上圖代碼所示,就是在lookupRoute方法中通過(guò)調(diào)用routeLocator.getRoutes方法獲取到所有我們?cè)趹?yīng)用配置文件中配置的Route(具體如何獲取所有的Route源碼比較簡(jiǎn)單,就是讀取配置文件中的所有Route配置信息,這個(gè)大家可以自行去看下代碼),然后調(diào)用getPredicate().apply方法確定具體的Route(也就是匹配斷言),匹配成功后,會(huì)將該Route設(shè)置到exchange(可以理解為當(dāng)前請(qǐng)求,即Request)的屬性中:

exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, r);

3.SimpleHandlerAdapter

上述獲取到Route后,接下來(lái)會(huì)進(jìn)入到DispatcherHandler.invokeHandler方法:

該方法會(huì)執(zhí)行SimpleHandlerAdapter的handle方法:

該方法調(diào)用WebHandler.handle方法,也就是FilteringWebHandler

4.FilteringWebHandler

進(jìn)入FilteringWebHandler.handle方法后,會(huì)從exchange上下文中得到Route,一個(gè)Route中可能有多個(gè)GatewayFilter,這里將多個(gè)GatewayFilter生成一個(gè)DefaultGatewayFilterChain鏈對(duì)象,然后啟動(dòng)鏈調(diào)用,這過(guò)程中會(huì)完成一些列的動(dòng)作,比如整合Ribbon負(fù)載均衡獲取到服務(wù)實(shí)例(ServerInstantce)最終調(diào)用NettyRoutingFilter完成對(duì)服務(wù)的調(diào)用。如下是Spring Cloud Gateway框架內(nèi)置的GlobalFilter:

全局過(guò)濾器

作用

Forward Routing Filter

用于本地forward,也就是將請(qǐng)求在Gateway服務(wù)內(nèi)進(jìn)行轉(zhuǎn)發(fā),而不是轉(zhuǎn)發(fā)到下游服務(wù)

LoadBalancerClient Filter

整合Ribbon實(shí)現(xiàn)負(fù)載均衡得到最終的ServerInstance




Netty Routing Filter

使用Netty的HttpClient轉(zhuǎn)發(fā)http、https請(qǐng)求

Netty Write Response Filter

將代理響應(yīng)寫回網(wǎng)關(guān)的客戶端側(cè)

RouteToRequestUrl Filter

將從request里獲取的原始url轉(zhuǎn)換成Gateway進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)時(shí)所使用的url

Websocket Routing Filter

使用Spring Web Socket將轉(zhuǎn)發(fā) Websocket 請(qǐng)求

Gateway Metrics Filter

整合監(jiān)控相關(guān),提供監(jiān)控指標(biāo)


本篇對(duì)Gateway的底層實(shí)現(xiàn)原理進(jìn)行詳細(xì)介紹,希望能對(duì)讀者朋友們有所幫助。

作者介紹

波哥,互聯(lián)行業(yè)從業(yè)10余年,先后擔(dān)任項(xiàng)目總監(jiān)及架構(gòu)師。目前專攻技術(shù),喜歡研究技術(shù)原理。技術(shù)全面,主攻Java,精通JVM底層機(jī)制及Spring全家桶底層框架原理,熟練掌握當(dāng)前主流的中間件、服務(wù)網(wǎng)格等技術(shù)原理。

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2023-02-20 10:13:00

灰度發(fā)布實(shí)現(xiàn)

2022-08-02 08:32:21

Spring項(xiàng)目網(wǎng)關(guān)

2019-08-22 09:55:17

RedisAPI數(shù)據(jù)

2018-11-09 09:34:05

面試Spring Clou底層

2024-05-13 18:35:06

負(fù)載均衡主機(jī)端口

2025-06-09 01:01:00

2023-02-28 08:57:06

Spring上下線緩存

2023-03-08 09:03:55

2022-08-15 09:22:12

JWT認(rèn)證系統(tǒng)

2021-07-05 07:51:43

JVM底層Python

2023-10-27 18:47:35

微服務(wù)底層機(jī)制

2023-02-13 08:10:40

Gateway網(wǎng)關(guān)Spring

2023-09-15 08:18:49

cookie網(wǎng)關(guān)代理

2023-01-04 07:54:03

HashMap底層JDK

2021-01-14 07:54:19

Spring Clou應(yīng)用路由

2022-01-07 07:29:08

Rbac權(quán)限模型

2021-01-08 08:34:09

Synchronize線程開(kāi)發(fā)技術(shù)

2023-07-11 08:00:00

2023-07-20 10:04:37

底層路由配置

2023-01-26 01:41:27

核心全局過(guò)濾器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 色999视频 | 二区中文字幕 | 精品国产欧美 | a国产一区二区免费入口 | 欧美激情久久久 | 91久久电影 | 亚洲视频一区在线观看 | 国产视频一二三区 | 一区视频| 毛片在线看片 | 一区二区在线不卡 | 日本三级做a全过程在线观看 | 欧美中文视频 | 国产日韩一区二区三免费高清 | 精品视频在线观看 | 国产欧美日韩在线一区 | 免费国产视频在线观看 | 国产一级片av | 国产精品毛片 | h网站在线观看 | 色视频成人在线观看免 | 国产小视频在线看 | 成人免费视频网站在线看 | 91在线观看 | 久热久热 | 欧美日韩不卡 | 国产aaaaav久久久一区二区 | 国产免费一区二区 | 色综久久 | 精品一区二区三区不卡 | 中文字幕韩在线第一页 | 精品美女在线观看视频在线观看 | 日日操夜夜操天天操 | 少妇黄色 | av在线天天 | 久久久国产精品入口麻豆 | 日日操操操 | 亚洲视频一区二区三区 | 亚洲二区视频 | 午夜精品导航 | 欧美成人视屏 |