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

來自公眾號:****51CTO技術(shù)棧

隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展蠢正,各類線上業(yè)務(wù)蓬勃發(fā)展,軟件系統(tǒng)如雨后春筍般呈現(xiàn)在我們面前。

為了提高系統(tǒng)的性能和可靠性县匠,將應(yīng)用服務(wù)進行拆分微服務(wù)化媳友。作為系統(tǒng)入口的 API 網(wǎng)關(guān)也逐漸成為了標(biāo)配斯议。

今天我們一起來看看 API 網(wǎng)關(guān)的設(shè)計思路,需要承載了哪些功能醇锚?以及如何選擇流行的 API 網(wǎng)關(guān)哼御?

什么是 API 網(wǎng)關(guān)

既然需要 API 網(wǎng)關(guān)為我所用,首先就讓我們來了解一下什么是 API 網(wǎng)關(guān)焊唬。

什么是 API 網(wǎng)關(guān)

網(wǎng)關(guān)一詞最早出現(xiàn)在網(wǎng)絡(luò)設(shè)備恋昼,比如兩個相互獨立的局域網(wǎng)之間通過路由器進行通信,中間的路由被稱之為網(wǎng)關(guān)赶促。

任何一個應(yīng)用系統(tǒng)如果需要被其他系統(tǒng)調(diào)用液肌,就需要暴露 API,這些 API 代表著一個一個的功能點鸥滨。

如果兩個系統(tǒng)中間通信矩屁,在系統(tǒng)之間加上一個中介者協(xié)助 API 的調(diào)用,這個中介者就是 API 網(wǎng)關(guān)爵赵。
image

對接兩個系統(tǒng)的 API 網(wǎng)關(guān)

當(dāng)然吝秕,API 網(wǎng)關(guān)可以放在兩個系統(tǒng)之間,同時也可以放在客戶端與服務(wù)端之間空幻。
image

對接客戶端和服務(wù)端的 API 網(wǎng)關(guān)

知道了 API 網(wǎng)關(guān)的基本定義烁峭,再來看看為什么我們要使用它。

為何要使用 API 網(wǎng)關(guān)

網(wǎng)關(guān)作為系統(tǒng)的唯一入口秕铛,也就是說约郁,進入系統(tǒng)的所有請求都需要經(jīng)過 API 網(wǎng)關(guān)。

當(dāng)系統(tǒng)外部的應(yīng)用或者客戶端訪問系統(tǒng)的時候但两,都會遇到這樣的情況:

  • 系統(tǒng)要判斷它們的權(quán)限

  • 如果傳輸協(xié)議不一致鬓梅,需要對協(xié)議進行轉(zhuǎn)換

  • 如果調(diào)用水平擴展的服務(wù),需要做負(fù)載均衡

  • 一旦請求流量超出系統(tǒng)承受的范圍谨湘,需要做限流操作

  • 針對每個請求以及回復(fù)绽快,系統(tǒng)會記錄響應(yīng)的日志

也就是說,只要是涉及到對系統(tǒng)的請求紧阔,并且能夠從業(yè)務(wù)中抽離出來的功能坊罢,都有可能在網(wǎng)關(guān)上實現(xiàn)。

例如:協(xié)議轉(zhuǎn)換擅耽,負(fù)載均衡活孩,請求路由,流量控制等等乖仇。后面我們會一一給大家介紹這些功能憾儒。

在了解 API 網(wǎng)關(guān)有哪些基本功能以后询兴,來看看它可以服務(wù)于哪些系統(tǒng)或者客戶端。

API 網(wǎng)關(guān)服務(wù)定位

API 網(wǎng)關(guān)擁有處理請求的能力起趾,從定位來看分為 5 類:

①面向 WebApp蕉朵,這部分的系統(tǒng)以網(wǎng)站和 H5 應(yīng)用為主。通過前后端分離的設(shè)計阳掐,將大部分的業(yè)務(wù)功能都放在了后端始衅,前面的 Web App 只展示頁面的內(nèi)容。

②MobileApp缭保,這里的 Mobile 指的是 iOS 和 Android汛闸,設(shè)計思路和 WebApp 基本相同。

區(qū)別是 API 網(wǎng)關(guān)需要做一些移動設(shè)備管理的工作(MDM)艺骂。例如:設(shè)備的注冊诸老,激活,使用钳恕,淘汰等别伏,全生命周期的管理。

由于移動設(shè)備的特殊性忧额,導(dǎo)致了我們在考慮移動設(shè)備請求的時候厘肮,需要考慮請求,設(shè)備睦番,使用者之間的關(guān)系类茂。

③面向合作伙伴的 OpenAPI,通常系統(tǒng)會給合作伙伴提供接口托嚣。這些接口會全部開放或者部分開發(fā)巩检,在有條件限制(時間,流量)的情況下給合作伙伴訪問示启。因此需要更多考慮 API 網(wǎng)關(guān)的流量和安全以及協(xié)議轉(zhuǎn)換的管理兢哭。

④企業(yè)內(nèi)部可擴展 API,給企業(yè)內(nèi)部的其他部門或者項目使用夫嗓,也可以作為中臺輸出的一部分迟螺,支持其他系統(tǒng)。這里需要更多地考慮劃分功能邊界啤月,認(rèn)證和授權(quán)問題煮仇。

⑤面向 IOT 設(shè)備劳跃,會接收來自 IOT 設(shè)備的請求谎仲,特別是工業(yè)傳感器等設(shè)備。這里需要考慮協(xié)議轉(zhuǎn)換和數(shù)據(jù)過濾刨仑。

API 網(wǎng)關(guān)架構(gòu)

既然談了 API 網(wǎng)關(guān)的功能和定位郑诺,接下來說說它的架構(gòu):
image

API 網(wǎng)關(guān)系統(tǒng)架構(gòu)圖

API 網(wǎng)關(guān)拆分成為 3 個系統(tǒng):

  • Gateway-Core(核心)

  • Gateway-Admin(管理)

  • Gateway-Monitor(監(jiān)控)

Gateway-Core 核心網(wǎng)關(guān)夹姥,負(fù)責(zé)接收客戶端請求,調(diào)度辙诞、加載和執(zhí)行組件辙售,將請求路由到上游服務(wù)端,并處理其返回的結(jié)果飞涂。

大多數(shù)的功能都在這一層完成旦部,例如:驗證,鑒權(quán)较店,負(fù)載均衡士八,協(xié)議轉(zhuǎn)換,服務(wù)路由梁呈,數(shù)據(jù)緩存婚度。如果沒有其他兩個子系統(tǒng),它也是可以單獨運行的官卡。

Gateway-Admin 網(wǎng)關(guān)管理界面蝗茁,可以進行 API、組件等系統(tǒng)基礎(chǔ)信息的配置寻咒;例如:限流的策略哮翘,緩存配置,告警設(shè)置毛秘。

Gateway-Monitor 監(jiān)控日志忍坷、生成各種運維管理報表、自動告警等熔脂;管理和監(jiān)控系統(tǒng)主要是為核心系統(tǒng)服務(wù)的佩研,起到支撐的作用。

API 網(wǎng)關(guān)技術(shù)原理

上面談到了網(wǎng)關(guān)的架構(gòu)思路霞揉,這里談幾點技術(shù)原理旬薯。平時我們在使用網(wǎng)關(guān)的時候,多注重其實現(xiàn)的功能适秩。例如:路由绊序,負(fù)載均衡,限流秽荞,緩存骤公,日志,發(fā)布等等扬跋。

實際上這些功能的背后有一些原理我們可以了解阶捆,這樣在應(yīng)用功能的時候會更加篤定。下面是幾個原理分享給大家。

協(xié)議轉(zhuǎn)換

每個系統(tǒng)內(nèi)部服務(wù)之間的調(diào)用洒试,可以統(tǒng)一使用一種協(xié)議倍奢,例如:HTTP,GRPC垒棋。

假設(shè)每個系統(tǒng)使用的協(xié)議不同卒煞,那么系統(tǒng)之間的調(diào)用或者數(shù)據(jù)傳輸,就存在協(xié)議轉(zhuǎn)換的問題了叼架。如果解決這個問題呢畔裕?API 網(wǎng)關(guān)通過泛化調(diào)用的方式實現(xiàn)協(xié)議之間的轉(zhuǎn)化。

實際上就是將不同的協(xié)議轉(zhuǎn)換成“通用協(xié)議”乖订,然后再將通用協(xié)議轉(zhuǎn)化成本地系統(tǒng)能夠識別的協(xié)議柴钻。

這一轉(zhuǎn)化工作通常在 API 網(wǎng)關(guān)完成。通用協(xié)議用得比較多的有 JSON垢粮,當(dāng)然也有使用 XML 或者自定義 JSON 文件的贴届。

image

不同的協(xié)議需要轉(zhuǎn)化成共同語言進行傳輸

鏈?zhǔn)教幚?/strong>

設(shè)計模式中有一種責(zé)任鏈模式,它將“處理請求”和“處理步驟”分開蜡吧。每個處理步驟毫蚓,只關(guān)心這個步驟上需要做的處理操作,處理步驟存在先后順序昔善。

消息從第一個“處理步驟”流入元潘,從最后一個“處理步驟”流出,每個步驟對經(jīng)過的消息進行處理君仆,整個過程形成了一個鏈條翩概。在 API 網(wǎng)關(guān)中也用到了類似的模式。
image

Zuul 網(wǎng)關(guān)過濾器鏈?zhǔn)教幚?/em>

下面以 Zuul 為例返咱,當(dāng)消息出入網(wǎng)關(guān)需要經(jīng)歷一系列的過濾器钥庇。這些過濾器之間是有先后順序的,并且在每個過濾器需要進行的工作也是各不一樣:

  • PRE:前置過濾器咖摹,用來處理通用事務(wù)评姨,比如鑒權(quán),限流萤晴,熔斷降級吐句,緩存。并且可以通過 Custom 過濾器進行擴展店读。

  • ROUTING:路由過濾器嗦枢,在這種過濾器中把用戶請求發(fā)送給 Origin Server。它主要負(fù)責(zé):協(xié)議轉(zhuǎn)化和路由的工作屯断。

  • POST:后置過濾器文虏,從 Origin Server 返回的響應(yīng)信息會經(jīng)過它侣诺,再返回給調(diào)用者。在返回的 Response 上加入 Response Header择葡,同時可以做 Response 的統(tǒng)計和日志記錄紧武。

  • ERROR:錯誤過濾器剃氧,當(dāng)上面三個過濾器發(fā)生異常時敏储,錯誤信息會進到這里,并對錯誤進行處理朋鞍。

異步請求

所有的請求通過 API 網(wǎng)關(guān)訪問應(yīng)用服務(wù)已添,一旦吞吐量上去了,如何高效地處理這些請求滥酥?拿 Zuul 為例更舞,Zuul1 采用:一個線程處理一個請求的方式。線程負(fù)責(zé)接受請求坎吻,然后調(diào)用應(yīng)用返回結(jié)果缆蝉。如果把網(wǎng)絡(luò)請求看成一次 IO 操作的話,處理請求的線程瘦真,從接受請求刊头,到服務(wù)返回響應(yīng),都是阻塞狀態(tài)诸尽。

同時原杂,如果多個線程都處在這種狀態(tài),會導(dǎo)致系統(tǒng)緩慢您机。因為每個網(wǎng)關(guān)能夠開啟的線程數(shù)量是有限的穿肄,特別是在訪問的高峰期。

image.gif

每個線程處理一個請求為了解決這個問題际看,Zuul2 啟動了異步請求的機制咸产。每個請求進入網(wǎng)關(guān)的時候,會被包裝成一個事件仲闽,CPU 內(nèi)核會維持一個監(jiān)聽器锐朴,不斷輪詢“請求事件”。一旦蔼囊,發(fā)現(xiàn)請求事件焚志,就會調(diào)用對應(yīng)的應(yīng)用。獲取應(yīng)用返回的信息以后畏鼓,按照請求的要求把數(shù)據(jù)/文件放到指定的緩沖區(qū)酱酬,同時發(fā)送一個通知事件,告訴請求端數(shù)據(jù)已經(jīng)就緒云矫,可以從這個緩沖獲取數(shù)據(jù)/文件膳沽。這個過程是異步的,請求的線程不用一直等待數(shù)據(jù)的返回。它在請求完畢以后挑社,就直接返回了陨界,這時它可以做其他的事情。

當(dāng)請求數(shù)據(jù)被 CPU 內(nèi)核獲取痛阻,并且發(fā)送到指定的數(shù)據(jù)緩沖區(qū)時菌瘪,請求的線程會接到“數(shù)據(jù)返回”的通知,然后就直接使用數(shù)據(jù)阱当,不用自己去做取數(shù)據(jù)的操作俏扩。

image

異步請求處理,CPU 處理數(shù)據(jù)以后通知請求端實現(xiàn)異步處理請求有兩種模式弊添,分別是:

  • Reactor

  • Proactor

image

Reactor 工作原理流水圖Reactor:通過 handle_events 事件循環(huán)處理請求录淡。用戶線程注冊事件處理器之后,可以繼續(xù)執(zhí)行其他的工作(異步)油坝,而 Reactor 線程負(fù)責(zé)調(diào)用內(nèi)核的 Select 函數(shù)檢查 Socket 狀態(tài)嫉戚。當(dāng)有 Socket 被激活時(獲取網(wǎng)絡(luò)數(shù)據(jù)),則通知相應(yīng)的用戶線程澈圈,執(zhí)行 handle_event 進行數(shù)據(jù)讀取彬檀、處理的工作。

image

Proactor 工作原理流水圖

Proactor:用戶線程使用 CPU 內(nèi)核提供的異步 IO 發(fā)起請求极舔,請求發(fā)起以后立即返回凤覆。CPU 內(nèi)核繼續(xù)執(zhí)行用戶請求線程代碼。此時用戶線程已將 AsynchronousOperation(異步處理)和 CompletionHandler(完成獲取資源)注冊到內(nèi)核拆魏。之后操作系統(tǒng)開啟獨立的內(nèi)核線程去處理 IO 操作盯桦。當(dāng)請求的數(shù)據(jù)到達時,由內(nèi)核負(fù)責(zé)讀取 Socket(網(wǎng)絡(luò)請求)中的數(shù)據(jù)渤刃,并寫入用戶指定的緩沖區(qū)中拥峦。最后內(nèi)核將數(shù)據(jù)和用戶線程注冊的 CompletionHandler 分發(fā)給內(nèi)部 Proactor,Proactor 將 IO 完成的信息通知給用戶線程(一般通過調(diào)用用戶線程注冊的完成事件處理函數(shù))卖子,完成異步 IO略号。

API 網(wǎng)關(guān)實現(xiàn)功能

說起對 API 網(wǎng)關(guān)的使用,我們還是對具體功能更加感興趣洋闽。讓我們一起來看看它實現(xiàn)了哪些功能玄柠。

負(fù)載均衡

當(dāng)網(wǎng)關(guān)后面掛接同一應(yīng)用的多個副本時,每次用戶的請求都會通過網(wǎng)關(guān)的負(fù)載均衡算法诫舅,路由到對應(yīng)的服務(wù)上面羽利。例如:隨機算法,權(quán)重算法刊懈,Hash 算法等等这弧。如果上游服務(wù)采取微服務(wù)的架構(gòu)娃闲,也可以和注冊中心合作實現(xiàn)動態(tài)的負(fù)載均衡。

當(dāng)微服務(wù)動態(tài)掛載(動態(tài)擴容)的時候匾浪,可以通過服務(wù)注冊中心獲取微服務(wù)的注冊信息皇帮,從而實現(xiàn)負(fù)載均衡。

image

Nginx+Lua+服務(wù)注冊中心實現(xiàn)動態(tài)負(fù)載均衡

路由選擇

這個不言而喻蛋辈,網(wǎng)關(guān)可以根據(jù)請求的 URL 地址解析属拾,知道需要訪問的服務(wù)。再通過路由表把請求路由到目標(biāo)服務(wù)上去梯浪。

有時候因為網(wǎng)絡(luò)原因捌年,服務(wù)可能會暫時的不可用瓢娜,這個時候我們希望可以再次對服務(wù)進行重試挂洛。

image

Zuul 作為 API 網(wǎng)關(guān)將請求路由到上游服務(wù)器

例如:Zuul 與 Spring Retry 合作完成路由重試。

#是否開啟重試功能
zuul.retryable=true
#對當(dāng)前服務(wù)的重試次數(shù)
ribbon.MaxAutoRetries=2

流量控制

限流是 API 網(wǎng)關(guān)常用的功能之一眠砾,當(dāng)上游服務(wù)超出請求承載范圍虏劲,或者服務(wù)因為某種原因無法正常使用,都會導(dǎo)致服務(wù)處理能力下滑褒颈。這個時候柒巫,API 網(wǎng)關(guān)作為“看門人”,就可以限制流入的請求谷丸,讓應(yīng)用服務(wù)器免受沖擊堡掏。

限流實際上就是限制流入請求的數(shù)量,其算法不少刨疼,有令牌桶算法泉唁,漏桶算法,連接數(shù)限制等等揩慕。這里我們就介紹三個常用的亭畜,一般通過 Nginx+Lua 來實現(xiàn)。

image

令牌桶限流

統(tǒng)一鑒權(quán)

訪問應(yīng)用服務(wù)器的請求都需要擁有一定權(quán)限迎卤,如果說每訪問一個服務(wù)都需要驗證一次權(quán)限拴鸵,這個對效率是很大的影響∥仙Γ可以把權(quán)限認(rèn)證放到 API 網(wǎng)關(guān)來進行劲藐。目前比較常見的做法是,用戶通過登錄服務(wù)獲取 Token樟凄,把它存放到客戶端聘芜,在每次請求的時候把這個 Token 放入請求頭,一起發(fā)送給服務(wù)器不同。API 網(wǎng)關(guān)要做的事情就是解析這個 Token厉膀,知道訪問者是誰(鑒定)溶耘,他能做什么/訪問什么(權(quán)限)。說白了就是看訪問者能夠訪問哪些 URL服鹅,這里根據(jù)權(quán)限/角色定義一個訪問列表凳兵。如果要實現(xiàn)多個系統(tǒng)的 OSS(Single Sign On 單點登錄),API 網(wǎng)關(guān)需要和 CAS(Central Authentication Service 中心鑒權(quán)服務(wù))做連接企软,來確定請求者的身份和權(quán)限庐扫。

熔斷降級

當(dāng)應(yīng)用服務(wù)出現(xiàn)異常,不能繼續(xù)提供服務(wù)的時候仗哨,也就是說應(yīng)用服務(wù)不可用了形庭。作為 API 網(wǎng)關(guān)需要做出處理,把請求導(dǎo)入到其他服務(wù)上厌漂∪眩或者對服務(wù)進行降級處理,例如:用兜底的服務(wù)數(shù)據(jù)返回客戶端,或者提示服務(wù)暫時不可用。同時通過服務(wù)注冊中心但汞,監(jiān)聽存在問題的服務(wù)进统,一旦服務(wù)恢復(fù),隨即恢復(fù)路由請求到該服務(wù)。

例如:Zuul 中提供了 ZuulFallbackProvider 接口來實現(xiàn)熔斷,它提供兩個方法,一個指明熔斷攔截的服務(wù) getRoute涣仿,一個指定返回內(nèi)容 ClientHttpResponse。

public  interface ZuulFallbackProvider {
   /**
     * The route this fallback will be used  for.
     * @return The route the fallback will be  used for.
     */
    public String getRoute();

    /**
     * Provides a fallback response.
     * @return The fallback response.
     */
    public  ClientHttpResponsefallbackResponse();
}

我們通過自定義的 Fallback 方法示惊,并且將其指定給某個 Route 來實現(xiàn)該 Route 訪問出問題的熔斷處理好港。

主要繼承 ZuulFallbackProvider 接口來實現(xiàn),ZuulFallbackProvider 默認(rèn)有兩個方法涝涤,一個用來指明熔斷攔截哪個服務(wù)媚狰,一個定制返回內(nèi)容。

image

API 網(wǎng)關(guān)熔斷降級

發(fā)布測試

在發(fā)布版本的時候會采用:金絲雀發(fā)布和藍(lán)綠發(fā)布阔拳。作為 API 網(wǎng)關(guān)可以使用路由選擇和流量切換來協(xié)助上述行為崭孤。這里以金絲雀發(fā)布為例,看看 API 網(wǎng)關(guān)如何做路由轉(zhuǎn)換的糊肠。

假設(shè)將 4 個服務(wù)從 V1 更新到 V2 版本辨宠,這 4 個服務(wù)的流量請求由 1 個 API 網(wǎng)關(guān)管理。

image

那么先將一臺服務(wù)與 API 網(wǎng)關(guān)斷開货裹,部署 V2 版本的服務(wù)嗤形,然后 API 網(wǎng)關(guān)再將流量導(dǎo)入到 V2 版本的服務(wù)上。

image

這里流量的導(dǎo)入可以是逐步進行的弧圆,一旦 V2 版本的服務(wù)趨于穩(wěn)定赋兵。再如法炮制笔咽,將其他服務(wù)替換成 V2 版本。

image

金絲雀發(fā)布一般先發(fā) 1 臺霹期,或者一個小比例叶组,例如 2% 的服務(wù)器,主要做流量驗證用历造,也稱為金絲雀(Canary)測試(灰度測試)甩十。

其來歷是,曠工下礦洞前吭产,先放一只金絲雀探查是否有毒氣侣监,金絲雀發(fā)布由此得名。

金絲雀測試需要完善的監(jiān)控設(shè)施配合臣淤,通過監(jiān)控指標(biāo)反饋橄霉,觀察金絲雀的健康狀況,作為后續(xù)發(fā)布或回滾的依據(jù)荒典。

如果金絲測試通過酪劫,則把剩余的 V1 版本全部升級為 V2 版本吞鸭。如果金絲雀測試失敗寺董,則直接回退金絲雀,發(fā)布失敗刻剥。

緩存數(shù)據(jù)

image

我們可以在 API 網(wǎng)關(guān)緩存一些修改頻率不高的數(shù)據(jù)遮咖。例如:用戶信息,配置信息造虏,通過服務(wù)定期刷新這個緩存就行了:

  • 用戶請求先訪問 API 網(wǎng)關(guān)御吞,如果發(fā)現(xiàn)有緩存信息,直接返回給用戶漓藕。

  • 如果沒有發(fā)現(xiàn)緩存信息陶珠,回源到應(yīng)用服務(wù)器獲取信息。

  • 另外享钞,有一個緩存更新服務(wù)揍诽,定期把應(yīng)用服務(wù)器中的信息更新到網(wǎng)關(guān)本地緩存中。

日志記錄

通過 API 網(wǎng)關(guān)上的過濾器我們可以加入日志服務(wù)栗竖,記錄請求和返回信息暑脆。同時可以建立一個管理員的界面去監(jiān)控這些數(shù)據(jù)。

image

日志服務(wù)簡圖日志記錄了以后狐肢,可以做很多功能擴展添吗。我們整理了以下幾點供大家參考:

  • 報表分析:針對服務(wù)訪問情況,提供可視化展示份名。

  • 實時查詢:了解實時關(guān)鍵信息碟联,例如:吞吐量妓美,并發(fā)數(shù)。在秒殺活動的時候鲤孵,會特別關(guān)注部脚。

  • 異常告警:針對關(guān)鍵參數(shù)進行監(jiān)控,對于統(tǒng)計結(jié)果支持閾值報警裤纹,對接阿里云通知中心委刘、短信、釘釘進行告警鹰椒。

  • 日志投遞:將日志進行歸檔锡移,存放到文件庫或者數(shù)據(jù)倉庫中,以便后期分析漆际。

image

日志記錄衍生的功能

流行 API 網(wǎng)關(guān)對比

在介紹了 API 網(wǎng)關(guān)的功能以后淆珊,再來看看目前幾個流行的 API 網(wǎng)關(guān)項目〖榛悖看看他們各自的特點施符,并且把他們做一個簡單的比較。這些網(wǎng)關(guān)目前都是開源的擂找,大家可以有選擇地在項目中使用戳吝。

Kong

Kong 是 Mash ape 公司的開源項目,它是一個在 Nginx 中運行的 Lua 應(yīng)用程序贯涎,并且可以通過 Lua-Nginx 模塊實現(xiàn)擴展听哭。所以,可以通過插件集合的方式定制功能塘雳,例如:HTTP 基本認(rèn)證陆盘、密鑰認(rèn)證、CORS(Cross-origin Resource Sharing败明,跨域資源共享)隘马、TCP、UDP妻顶、日志酸员、API 限流、請求轉(zhuǎn)發(fā)以及監(jiān)控盈包,都是目前已有的插件沸呐。

由于是基于 Nginx 的,所以可以對網(wǎng)關(guān)進行水平擴展呢燥,來應(yīng)對大批量的網(wǎng)絡(luò)請求崭添。

image

Kong 架構(gòu)圖Kong 主要有三個組件:

  • KongServer :基于 Nginx 的服務(wù)器,用來接收 API 請求叛氨。

  • ApacheCassandra/PostgreSQL:用來存儲操作數(shù)據(jù)呼渣。

  • Kongdashboard:UI 管理工具棘伴。

Traefik

image

Traefik 架構(gòu)圖Traefik 是 HTTP 反向代理和負(fù)載均衡器,可以輕松部署微服務(wù)屁置,可以與現(xiàn)有的組件(Docker焊夸、Swarm,Kubernetes蓝角,Marathon阱穗,Consul,Etcd)做集成使鹅。因為支持動態(tài)配置揪阶,所以它的伸縮性很好。不過它只支持 HTTP患朱、HTTPS 和 GRPC鲁僚。如果你需要 TCP 負(fù)載均衡,那么您需要選擇其他方案了裁厅。

Ambassador

image

Ambassador 架構(gòu)圖Ambassador 是一個基于 Envoy Proxy 構(gòu)建的冰沙,Kubernetes 原生的開源微服務(wù)網(wǎng)關(guān)。它在構(gòu)建之初就致力于支持多個獨立的團隊执虹,這些團隊需要為最終用戶快速發(fā)布拓挥、監(jiān)控和更新服務(wù)。Ambassador 還具有 Kubernetes Ingress 和負(fù)載均衡的能力声畏。它支持處理 Kubernetes Ingress Controller 和負(fù)載均衡等功能撞叽,可以與 Istio 無縫集成。

Zuul

image

Zuul 2 結(jié)構(gòu)圖Zuul 是 Spring Cloud 全家桶中的微服務(wù) API 網(wǎng)關(guān)插龄。所有從設(shè)備或網(wǎng)站來的請求都會經(jīng)過 Zuul 到達后端的 Netflix 應(yīng)用程序。作為一個邊界性質(zhì)的應(yīng)用程序科展,Zuul 提供了動態(tài)路由均牢、監(jiān)控、彈性負(fù)載和安全功能才睹。包括 Zuul1 和 Zuul2 兩個版本徘跪。

介紹了幾個開源 API 網(wǎng)關(guān)的基本信息以后,我們從幾個維度對他們進行比較:

image

從開源社區(qū)活躍度來說琅攘,Kong 和 Traefik 較好垮庐;從成熟度來看,較好的是 Kong坞琴、Traefik哨查;從架構(gòu)優(yōu)勢的擴展性來看,Kong 有豐富的插件剧辐,Ambassador 也有插件但不多寒亥,而 Zuul 是需要自研邮府。但 Zuul 由于與 Spring Cloud 集成,如果使用 Spring Cloud 的小伙伴可以考慮使用溉奕。

總結(jié)

API 網(wǎng)關(guān)是系統(tǒng)內(nèi)外通訊的中介者褂傀。從定位上來說它服務(wù) WebApp,MobileApp加勤,合作伙伴 OpenAPI仙辟,企業(yè)內(nèi)部可擴展 API,以及 IOT 設(shè)備鳄梅。從架構(gòu)設(shè)計角度來說欺嗤,分為 Gateway-Core(核心)、Gateway-Admin(管理)卫枝、Gateway-Monitor(監(jiān)控)三部分煎饼。API 網(wǎng)關(guān)需要注意的技術(shù)原理有,協(xié)議轉(zhuǎn)換校赤,鏈?zhǔn)教幚硪约爱惒秸埱筮壕痢K膽?yīng)用比較廣泛,例如:負(fù)載均衡马篮,路由選擇沾乘,流量控制,統(tǒng)一鑒權(quán)浑测,熔斷降級翅阵,發(fā)布測試,緩存數(shù)據(jù)迁央,日志記錄等掷匠。比較流行的開源 API網(wǎng)關(guān)有 Kong,Traefik岖圈,Ambassador讹语,Zuul。從使用上來說他們各有千秋蜂科,可以根據(jù)項目的情況選取顽决。

作者:崔皓

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市导匣,隨后出現(xiàn)的幾起案子才菠,更是在濱河造成了極大的恐慌,老刑警劉巖贡定,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赋访,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機进每,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門汹粤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人田晚,你說我怎么就攤上這事嘱兼。” “怎么了贤徒?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵芹壕,是天一觀的道長。 經(jīng)常有香客問我接奈,道長踢涌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任序宦,我火速辦了婚禮睁壁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘互捌。我一直安慰自己潘明,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布秕噪。 她就那樣靜靜地躺著钳降,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腌巾。 梳的紋絲不亂的頭發(fā)上遂填,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音澈蝙,去河邊找鬼吓坚。 笑死,一個胖子當(dāng)著我的面吹牛碉克,可吹牛的內(nèi)容都是我干的凌唬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼漏麦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了况褪?” 一聲冷哼從身側(cè)響起撕贞,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎测垛,沒想到半個月后捏膨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年号涯,在試婚紗的時候發(fā)現(xiàn)自己被綠了目胡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡链快,死狀恐怖誉己,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情域蜗,我是刑警寧澤巨双,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站霉祸,受9級特大地震影響筑累,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丝蹭,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一慢宗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奔穿,春花似錦镜沽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湘换,卻和暖如春宾舅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彩倚。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工筹我, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆离。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓蔬蕊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哥谷。 傳聞我的和親對象是個殘疾皇子岸夯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345