官术网_书友最值得收藏!

1Spring Cloud Gateway簡(jiǎn)介

API網(wǎng)關(guān)

API網(wǎng)關(guān)出現(xiàn)的原因是微服務(wù)架構(gòu)的出現(xiàn),不同的微服務(wù)一般會(huì)有不同的網(wǎng)絡(luò)地址,而外部客戶(hù)端可能需要調(diào)用多個(gè)服務(wù)的接口才能完成一個(gè)業(yè)務(wù)需求,如果讓客戶(hù)端直接與各個(gè)微服務(wù)通信,會(huì)有以下的問(wèn)題:

? 客戶(hù)端會(huì)多次請(qǐng)求不同的微服務(wù),增加了客戶(hù)端的復(fù)雜性。

? 存在跨域請(qǐng)求,在一定場(chǎng)景下處理相對(duì)復(fù)雜。

? 認(rèn)證復(fù)雜,每個(gè)服務(wù)都需要獨(dú)立認(rèn)證。

? 難以重構(gòu),隨著項(xiàng)目的迭代,可能需要重新劃分微服務(wù)。例如,可能將多個(gè)服務(wù)合并成一個(gè)或者將一個(gè)服務(wù)拆分成多個(gè)。如果客戶(hù)端直接與微服務(wù)通信,那么重構(gòu)將會(huì)很難實(shí)施。

? 某些微服務(wù)可能使用了防火墻 / 瀏覽器不友好的協(xié)議,直接訪問(wèn)會(huì)有一定的困難。

以上這些問(wèn)題可以借助API網(wǎng)關(guān)解決。API網(wǎng)關(guān)是介于客戶(hù)端和服務(wù)器端之間的中間層,所有的外部請(qǐng)求都會(huì)先經(jīng)過(guò)API網(wǎng)關(guān)這一層。

使用API網(wǎng)關(guān)后的優(yōu)點(diǎn)如下:

? 易于監(jiān)控。可以在網(wǎng)關(guān)收集監(jiān)控?cái)?shù)據(jù)并將其推送到外部系統(tǒng)進(jìn)行分析。

? 易于認(rèn)證。可以在網(wǎng)關(guān)上進(jìn)行認(rèn)證,然后再將請(qǐng)求轉(zhuǎn)發(fā)到后端的微服務(wù),而無(wú)須在每個(gè)微服務(wù)中進(jìn)行認(rèn)證。

? 減少了客戶(hù)端與各個(gè)微服務(wù)之間的交互次數(shù)。

Spring Cloud Gateway

Spring Cloud GatewaySpring官方基于Spring 5.0Spring Boot 2.0Project 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)是替代Netflix ZUUL,其不僅提供統(tǒng)一的路由方式,并且基于Filter鏈的方式提供了網(wǎng)關(guān)各類(lèi)功能,例如:安全,監(jiān)控/埋點(diǎn),和限流等。

SCG架構(gòu)

如圖所示,Spring Cloud Gateway的架構(gòu)如上,看起來(lái)很簡(jiǎn)單。它內(nèi)部包含了一個(gè)高性能的Netty Server,用來(lái)接收各類(lèi)網(wǎng)絡(luò)請(qǐng)求。請(qǐng)求進(jìn)來(lái)之后,會(huì)根據(jù)配置的各個(gè)路由進(jìn)行匹配并處理請(qǐng)求。每個(gè)路由都可以定義多個(gè)斷言(Predicate),用于路由匹配。

SCG默認(rèn)提供了10多個(gè)內(nèi)建的斷言,可以基于請(qǐng)求的各個(gè)方面(請(qǐng)求頭,路徑,路徑,時(shí)間,Cookiehttp方法等)進(jìn)行路由匹配。如果還不夠,用戶(hù)還可以自已擴(kuò)展。

請(qǐng)求匹配到了合適的路由之后,就會(huì)按照路由中配置的各過(guò)濾器(filter),按順序?qū)φ?qǐng)求進(jìn)行處理。Filter也基本上可以對(duì)請(qǐng)求的所有屬性做處理,修改,添加或者除請(qǐng)求頭,修改請(qǐng)求數(shù)據(jù),修改返回的數(shù)據(jù)等,幾乎無(wú)所不能。當(dāng)然,修改請(qǐng)求也只是一方面的用途,認(rèn)證,鑒權(quán),記錄日志等也都可以在網(wǎng)關(guān)中統(tǒng)一來(lái)做。

所有filter形成處理鏈,直到所有的filter處理完,才會(huì)交給最后面的Netty Client,由它將處理過(guò)的請(qǐng)求發(fā)送至對(duì)應(yīng)的微服務(wù)。

在請(qǐng)求發(fā)送至微服務(wù)之前,還可以定義它的負(fù)載均衡策略(LoadBalancerRule),以決定請(qǐng)求至底發(fā)往微服務(wù)的哪個(gè)實(shí)例。

FilterLoadBalancerRule都支持自行擴(kuò)展。

主站蜘蛛池模板: 旅游| 巩义市| 漠河县| 农安县| 米林县| 武宣县| 陈巴尔虎旗| 鹤壁市| 丽水市| 台中市| 肥西县| 定西市| 松滋市| 马鞍山市| 冷水江市| 太原市| 郑州市| 临武县| 张家界市| 武隆县| 邵东县| 新绛县| 江津市| 乌苏市| 曲靖市| 自治县| 乡宁县| 静安区| 海兴县| 宝应县| 长治县| 团风县| 静乐县| 大英县| 汝阳县| 永康市| 商洛市| 晋江市| 克什克腾旗| 涟源市| 辽中县|