自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

徹底搞懂服務(wù)網(wǎng)關(guān)

開發(fā)
在分布式架構(gòu)中,服務(wù)網(wǎng)關(guān)(Service Gateway)的出現(xiàn)有其必然性。為了幫你理解這種必然性,我們先來討論一下常見的分布式系統(tǒng)組成結(jié)構(gòu)。

在分布式架構(gòu)中,服務(wù)網(wǎng)關(guān)(Service Gateway)的出現(xiàn)有其必然性。為了幫你理解這種必然性,我們先來討論一下常見的分布式系統(tǒng)組成結(jié)構(gòu)。

一、為什么需要服務(wù)網(wǎng)關(guān)?

圖中各個(gè)客戶端和后臺(tái)服務(wù)直接交互,我們可以看出三點(diǎn)核心問題。

圖 1 分布式系統(tǒng)組成結(jié)構(gòu)

1. 隔離性

首先,客戶端與服務(wù)之間應(yīng)該確保隔離性,這是架構(gòu)設(shè)計(jì)的一條基本原則。

隨著業(yè)務(wù)需求的變化和時(shí)間的演進(jìn),各個(gè)服務(wù)的劃分和實(shí)現(xiàn)通常都會(huì)做相應(yīng)的調(diào)整和升級(jí)。但因?yàn)楝F(xiàn)在服務(wù)端的訪問入口是直接暴露給客戶端的,所以如何實(shí)現(xiàn)服務(wù)端的調(diào)整和升級(jí)對(duì)客戶端透明是一個(gè)痛點(diǎn)。

圖 2 服務(wù)端功能演進(jìn)示意圖

2. 訪問粒度

更為重要的是,客戶端與服務(wù)端之間應(yīng)該具備靈活的訪問粒度。

我們知道,每個(gè)服務(wù)的職責(zé)在于提供某一個(gè)業(yè)務(wù)領(lǐng)域的訪問入口,而客戶端一般都需要整合多項(xiàng)業(yè)務(wù)數(shù)據(jù)。在現(xiàn)有的分布式架構(gòu)中,一個(gè)客戶端需要和多個(gè)服務(wù)交互。但是客戶端請(qǐng)求和服務(wù)提供的訪問入口在粒度上往往是不一致的,那么不同場(chǎng)景就需要具備對(duì)應(yīng)的粒度關(guān)系。

3. 安全性

最后,在客戶端和服務(wù)端的訪問過程中,也勢(shì)必涉及安全、性能等一系列非功能性需求。

從設(shè)計(jì)原則上講,這些非功能性需求應(yīng)該是獨(dú)立開發(fā)和演進(jìn)的,但現(xiàn)狀是它們的實(shí)現(xiàn)常被夾雜在服務(wù)端代碼中,與業(yè)務(wù)功能混淆,維護(hù)性很差。這也是我們?cè)陂_發(fā)分布式系統(tǒng)時(shí)的一大痛點(diǎn)。

為了解決上述三個(gè)問題,確??蛻舳撕头?wù)端交互過程的合理設(shè)計(jì)和實(shí)現(xiàn),我們需要從系統(tǒng)架構(gòu)的角度來分析。

在軟件設(shè)計(jì)領(lǐng)域,當(dāng)我們發(fā)現(xiàn)兩個(gè)組件之間的關(guān)系已經(jīng)不好把控時(shí),經(jīng)典的做法就是引入分層思想,也就是在這兩個(gè)組件之間加入一個(gè)中間層。而在分布式環(huán)境下,我們就可以在客戶端和服務(wù)端之間架設(shè)一層服務(wù)網(wǎng)關(guān)。

圖 3 服務(wù)網(wǎng)關(guān)示意圖

在分布式系統(tǒng)中,架構(gòu)設(shè)計(jì)上的一個(gè)核心要點(diǎn)就是:要確保所有來自客戶端的請(qǐng)求都通過服務(wù)網(wǎng)關(guān),再路由轉(zhuǎn)發(fā)到后端服務(wù)。這樣,在網(wǎng)關(guān)層我們就可以統(tǒng)一攔截和處理請(qǐng)求,實(shí)現(xiàn)對(duì)訪問粒度的控制、隔離性以及非功能性需求。

那么究竟什么是服務(wù)網(wǎng)關(guān)?它是如何有效解決這些問題呢?讓我們一起來詳細(xì)看一下服務(wù)網(wǎng)關(guān)提供的解決方案。

二、服務(wù)網(wǎng)關(guān)提供了什么樣的解決方案?

從概念上講,所謂的網(wǎng)關(guān)(Gateway)是在網(wǎng)絡(luò)架構(gòu)中用來實(shí)現(xiàn)系統(tǒng)互聯(lián)的一種組件。而在分布式架構(gòu)中,服務(wù)網(wǎng)關(guān)本質(zhì)上也是一個(gè)后臺(tái)服務(wù),為客戶端提供唯一的訪問入口。

1. 路由和解耦

在服務(wù)網(wǎng)關(guān)中,業(yè)務(wù)路由支持是它的基礎(chǔ)功能。針對(duì)不同的客戶端請(qǐng)求,路由機(jī)制能確保將這些請(qǐng)求轉(zhuǎn)發(fā)到最合適的服務(wù)進(jìn)行處理。

因此,在網(wǎng)關(guān)層,我們可以統(tǒng)一管理各種服務(wù),為客戶端請(qǐng)求提供更加簡(jiǎn)單高效的路由支持。同時(shí),我們也可以制定靈活的路由策略,常見的包括黑白名單、動(dòng)態(tài)規(guī)則等。

圖 4 服務(wù)網(wǎng)關(guān)的路由機(jī)制

服務(wù)路由功能帶來的作用就是解耦。對(duì)于任何系統(tǒng)交互行為而言,解耦都是必須要考慮的設(shè)計(jì)原則。而從設(shè)計(jì)模式上講,我們也可以把服務(wù)網(wǎng)關(guān)看做是外觀(Facade)模式的一種具體表現(xiàn)形式。外觀模式的作用就是把復(fù)雜度屏蔽在系統(tǒng)內(nèi)部,從而降低耦合度。

圖 5 網(wǎng)關(guān)模式示意圖

基于服務(wù)網(wǎng)關(guān)的這種解耦作用,我們就可以解決客戶端和服務(wù)端之間的隔離性問題。因?yàn)榉?wù)網(wǎng)關(guān)使得客戶端和服務(wù)器端在調(diào)用關(guān)系和部署環(huán)境上實(shí)現(xiàn)了解耦,向客戶端隱藏了應(yīng)用如何被劃分到各個(gè)服務(wù)的細(xì)節(jié)。這樣,后臺(tái)服務(wù)的演進(jìn)過程顯然就可以不影響到客戶端的訪問過程。

2. 服務(wù)適配和 API 優(yōu)化

服務(wù)網(wǎng)關(guān)的第二個(gè)核心功能是服務(wù)適配,即可以根據(jù)客戶端請(qǐng)求來動(dòng)態(tài)組合服務(wù)端資源,并返回最優(yōu)的響應(yīng)結(jié)果。

日常開發(fā)時(shí),服務(wù)網(wǎng)關(guān)作為單一入口,通過轉(zhuǎn)換和適配請(qǐng)求,完成與后臺(tái)服務(wù)體系的整合。一個(gè)典型的場(chǎng)景就是在多客戶端應(yīng)用中,考慮到不同客戶端頁面展示的差異性,就算是針對(duì)同一個(gè)場(chǎng)景的業(yè)務(wù)請(qǐng)求,需要返回的數(shù)據(jù)可能也會(huì)有所不同。

而服務(wù)網(wǎng)關(guān)可以向每個(gè)客戶端提供最優(yōu)的 API,實(shí)現(xiàn)按需獲取數(shù)據(jù)。例如,對(duì)于同樣的用戶信息分頁查詢功能,PC 端和 APP 端的分頁大小就會(huì)不一樣,我們需要針對(duì)不同客戶端提供最合適的 API。

圖 6 針對(duì)客戶端的最優(yōu) API 示意圖

另一方面,我們可以想象通過服務(wù)網(wǎng)關(guān),聚合后臺(tái)服務(wù)的調(diào)用過程,提供統(tǒng)一面向客戶端的聚合服務(wù)效果,這樣就減少了客戶端與服務(wù)端的交互次數(shù)。

典型的例子就是在電商系統(tǒng)中,原本客戶端的一次請(qǐng)求,可能需要同時(shí)訪問用戶服務(wù)和訂單服務(wù),才能獲取想要的訂單詳細(xì)信息,現(xiàn)在我們可以把所有需要的信息統(tǒng)一,在網(wǎng)關(guān)層聚合之后再返回給客戶端,這也是優(yōu)化 API 的一個(gè)場(chǎng)景的維度。

圖 7 使用網(wǎng)關(guān)聚合服務(wù)調(diào)用示意圖

基于服務(wù)網(wǎng)關(guān)的這種優(yōu)化 API 的作用,我們就可以解決客戶端與服務(wù)之間的訪問粒度問題。服務(wù)網(wǎng)關(guān)確保了控制訪問粒度的高效性和靈活性。

3. 訪問控制和切面支持

最后,我們需要強(qiáng)調(diào)一下服務(wù)網(wǎng)關(guān)所具備的訪問控制功能,同樣體現(xiàn)在多個(gè)方面。

例如,在高并發(fā)系統(tǒng)中,通常會(huì)采用限流和降級(jí)的手段來防止服務(wù)不可用。這時(shí)候在服務(wù)網(wǎng)關(guān)上,我們就可以設(shè)置對(duì)應(yīng)閾值或規(guī)則來限制客戶端請(qǐng)求流轉(zhuǎn)到后臺(tái)服務(wù)。

圖 8 網(wǎng)關(guān)的安全性和訪問控制功能示意圖

再比如說,對(duì)于來自客戶端的任何請(qǐng)求都需要考慮安全性,而服務(wù)網(wǎng)關(guān)是統(tǒng)一管理安全性的絕佳場(chǎng)所。實(shí)現(xiàn)訪問安全性的前提是提供用戶認(rèn)證,我們可以將用于身份認(rèn)證的部分功能抽取到網(wǎng)關(guān)層。而常見的安全性技術(shù)如密鑰交換、報(bào)文加解密等功能也都可以在網(wǎng)關(guān)中加以實(shí)現(xiàn)。

服務(wù)網(wǎng)關(guān)的訪問控制功能可以說為開發(fā)人員提供了強(qiáng)大的切面支持。通過切面,可以把常見的安全性、性能等需求從業(yè)務(wù)代碼中抽離出來,從而解決在分布式系統(tǒng)中如何有效實(shí)現(xiàn)非功能性需求的問題。

三、Zuul 和 Spring Cloud Gateway

介紹完服務(wù)網(wǎng)關(guān)所提供的解決方案之后,我們接下來討論具體的網(wǎng)關(guān)實(shí)現(xiàn)工具。

這里,我們選擇 Spring 家族中的 Spring Cloud 展開,這是目前最主流的微服務(wù)開發(fā)框架。在 Spring Cloud 中,實(shí)際上提供了兩款服務(wù)網(wǎng)關(guān)實(shí)現(xiàn)工具,一款是集成 Netflix 中的 Zuul 網(wǎng)關(guān),一款是自研的 Spring Cloud Gateway。

1. Netflix Zuul

正如我們前面分析的,Zuul 網(wǎng)關(guān)為開發(fā)人員提供了動(dòng)態(tài)路由、訪問監(jiān)控、安全控制等功能。對(duì)于服務(wù)網(wǎng)關(guān)而言,最重要的功能就是服務(wù)路由。在這里,你可以看這個(gè)配置示例:

zuul:
 prefix:  /springsystem
    routes:
       userservice: /user/**

配置代表了在大型分布式系統(tǒng)中服務(wù)網(wǎng)關(guān)比較常見的一種應(yīng)用場(chǎng)景,即在各個(gè)服務(wù)請(qǐng)求地址上添加一個(gè)前綴 prefix 來標(biāo)識(shí)模塊和子系統(tǒng)。同時(shí),我們?cè)凇皉outes”配置段中使用"/user"來為 userservice 這個(gè)服務(wù)名稱指定請(qǐng)求根地址。這樣,所有通過"/user"地址訪問的請(qǐng)求都將被自動(dòng)路由到該服務(wù)中。

2. Spring Cloud Gateway

Spring Cloud Gateway 是 Spring 官方自己開發(fā)的一款服務(wù)網(wǎng)關(guān),在技術(shù)體系上,Spring Cloud Gateway,基于最新的 Spring 5 和 Spring Boot 2 以及用于響應(yīng)式編程的 Project Reactor 框架,提供響應(yīng)式、非阻塞式 IO 模型,所以性能上 Spring Cloud Gateway 顯然要更勝一籌。作為新一代服務(wù)網(wǎng)關(guān),我們接下來重點(diǎn)展開 Spring Cloud Gateway。

Spring Cloud Gateway 的基本結(jié)構(gòu)中包含兩個(gè)核心組件,一個(gè)是過濾器(Filter),一個(gè)是謂詞(Predicate)。

圖 9 Spring Cloud Gateway 基本架構(gòu)圖

過濾器:Spring Cloud Gateway 中的過濾器與傳統(tǒng) Servlet 中的過濾器是同一個(gè)概念,在響應(yīng) HTTP 請(qǐng)求之前或之后,用于修改請(qǐng)求本身及對(duì)應(yīng)的響應(yīng)結(jié)果。

謂詞:而所謂謂詞,本質(zhì)上是一種判斷條件,用于將 HTTP 請(qǐng)求與路由進(jìn)行匹配。Spring Cloud Gateway 內(nèi)置了大量的謂詞組件,可以分別對(duì) HTTP 請(qǐng)求的消息頭、請(qǐng)求路徑等常見的路由媒介進(jìn)行自動(dòng)匹配以便決定路由結(jié)果。

我們來看一下一條基于 Spring Cloud Gateway 的完整路由配置的基本結(jié)構(gòu),如下所示:

spring:
 cloud:
 gateway:
      routes:
      - id: userroute
        uri: lb://userservice
        predicates:
        - Path=/user/**
        filters:
        - PrefixPath=/springsystem

在上述“routes”配置段中,首先我們使用 id 配置項(xiàng)指定了這條路由信息的編號(hào),這個(gè)例子中是“userroute”。而 uri 配置項(xiàng)中的“l(fā)b”代表負(fù)載均衡 LoadBalance,也就是說在訪問 url 指定的服務(wù)名稱時(shí)需要集成負(fù)載均衡機(jī)制。

然后我們使用了謂詞來對(duì)請(qǐng)求路徑進(jìn)行匹配,這里的“Path=/user/**”代表所有以“/user”開頭的請(qǐng)求都將被路由到這條路徑中。

最后我們還定義了一個(gè)過濾器,這個(gè)過濾器的作用是為訪問路徑添加前綴,這樣當(dāng)請(qǐng)求“/user/”時(shí),最后轉(zhuǎn)發(fā)到目標(biāo)服務(wù)的路徑將會(huì)變?yōu)椤?springsystem/user/”,而這個(gè)路徑會(huì)被路由到 userservice 這個(gè)服務(wù)中。

四、總結(jié)

可以說,在當(dāng)下的分布式系統(tǒng)開發(fā)過程中,服務(wù)網(wǎng)關(guān)已經(jīng)是一個(gè)必備組件。很難想象,客戶端在訪問后臺(tái)服務(wù)時(shí)沒有通過網(wǎng)關(guān)進(jìn)行統(tǒng)一的路由和訪問控制。一旦我們?cè)诜?wù)調(diào)用過程中添加了一個(gè)網(wǎng)關(guān)層,那么開發(fā)人員就可以集中處理服務(wù)路由、服務(wù)適配以及常見的安全控制、限流降級(jí)等非功能性需求。

責(zé)任編輯:趙寧寧 來源: 程序猿技術(shù)充電站
相關(guān)推薦

2022-05-12 08:21:13

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

2022-05-11 08:22:21

服務(wù)網(wǎng)關(guān)架構(gòu)

2022-09-01 08:17:15

Gateway微服務(wù)網(wǎng)關(guān)

2024-08-05 10:03:53

2024-10-29 08:44:18

2025-03-26 00:58:14

2022-05-16 08:22:11

網(wǎng)關(guān)過濾器路由

2020-04-29 14:33:49

微服務(wù)網(wǎng)關(guān)Kong

2017-09-04 16:15:44

服務(wù)網(wǎng)關(guān)架構(gòu)

2023-04-03 08:51:06

2025-03-31 07:51:09

2025-04-21 04:00:00

2017-12-05 17:44:31

機(jī)器學(xué)習(xí)CNN卷積層

2020-10-14 08:50:38

搞懂 Netty 線程

2024-01-03 13:39:00

JS,Javascrip算法

2023-10-18 10:55:55

HashMap

2025-04-11 05:55:00

2017-09-09 23:15:20

Spring Clou微服務(wù)架構(gòu)路由

2020-03-27 08:46:51

微服務(wù)服務(wù)網(wǎng)關(guān)

2020-10-10 10:37:54

微服務(wù)架構(gòu)技術(shù)API
點(diǎn)贊
收藏

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