業(yè)務網(wǎng)關技術選型和預研

開源API網(wǎng)關匯總

目前開源API Gateway 種類繁多,簡單搜羅了幾個比較火的開源項目:

  • Lua:

    • Kong:Kong 是一個高性能的 API 網(wǎng)關和微服務管理平臺,支持多種協(xié)議和服務發(fā)現(xiàn)。它使用 Nginx 作為代理,提供了可擴展的插件系統(tǒng)和 API 管理界面。與 APISIX 相比,Kong 具有更多的插件和功能,但也更加復雜。
    • APISIX是一個高性能、可擴展和開源的API網(wǎng)關,由Apache基金會孵化而來。它提供了豐富的功能和靈活的插件系統(tǒng),可以輕松地進行API管理、流量控制和安全認證等操作。APISIX可以在多種部署方式下使用,如裸機、Docker、Kubernetes等,同時也提供了RESTful API和CLI命令行工具,方便用戶進行管理和配置。APISIX的核心組件是基于OpenResty和Lua語言開發(fā)的,具有優(yōu)秀的性能和靈活性,可以輕松地滿足不同場景下的需求。
  • Go:

    • Tyk:Tyk 是一個快速、可擴展和開放的 API 網(wǎng)關,支持多種協(xié)議和后端服務。它有一個靈活的插件系統(tǒng)和管理界面,可以輕松地進行 API 管理、授權(quán)和監(jiān)控。與 APISIX 相比,Tyk 更加輕量級和易于使用。
    • Traefik: Traefik支持多種后端,包括Docker,Swarm,Kubernetes,Marathon,Mesos和Consul等容器和編排平臺。通過使用Traefik,您可以將HTTP請求動態(tài)路由到不同的后端服務,實現(xiàn)服務發(fā)現(xiàn)和負載均衡。此外,Traefik還支持HTTPS,自動證書管理,熔斷,限流等功能。
    • eolinker/apinto: 有企業(yè)級也有開源的項目,Apinto是一個基于 Golang 開發(fā)的微服務網(wǎng)關,能夠?qū)崿F(xiàn)高性能 HTTP API 轉(zhuǎn)發(fā)、多租戶管理、API 訪問權(quán)限控制等目的,擁有強大的自定義插件系統(tǒng)可以自行擴展,能夠快速幫助企業(yè)進行 API 服務治理、提高 API 服務的穩(wěn)定性和安全性。未來我們將提供插件市場,通過Apinto強大的插件拓展能力,用戶可像樂高積木一樣根據(jù)需要自行拓展Apinto的插件,豐富Apinto的能力。
  • Java:

    • Zuul: Zuul 2.0是Netflix OSS中的第二代Zuul,它是基于Netty構(gòu)建的非阻塞反向代理,支持異步I/O和事件驅(qū)動。Zuul 2.0使用過濾器來攔截請求并對其進行處理,提供了許多內(nèi)置的過濾器,例如路由過濾器,重試過濾器,限流過濾器等。除了標準的反向代理功能之外,Zuul 2.0還支持WebSocket,服務發(fā)現(xiàn)和動態(tài)路由等功能。但是,Zuul 2.0的開發(fā)和維護由于Netflix OSS項目的停止而被放緩,社區(qū)支持也逐漸減少。
    • Spring Cloud Gateway: Spring Cloud Gateway是Spring Cloud生態(tài)系統(tǒng)中的一個項目,它是一個基于異步非阻塞模型的API網(wǎng)關。Spring Cloud Gateway使用Spring Framework 5和Project Reactor構(gòu)建,支持動態(tài)路由,請求過濾,限流等功能。它支持多種后端服務,可以輕松地與Spring Cloud中的其他組件進行集成。Spring Cloud Gateway提供了簡單的Java API和函數(shù)式路由定義,也支持自定義過濾器和路由器。

    以上幾個開源項目是我目前了解到的比較主流的API-Gateway。這里不包含純云原生網(wǎng)關。可以看得出來 大部分的網(wǎng)關都使用Lua/openresty和Go語言開發(fā)的,有這天然的高并發(fā)的特性。而使用Java開發(fā)的網(wǎng)關盡管有JIT的特性,但是還是無法與腳本語言和Go語言的性能相比。但是使用Java開發(fā)的網(wǎng)關并非毫無優(yōu)點,有句話說得好,沒有最優(yōu)只有最合適。比如美團技術團隊,也是根據(jù)公司的情況而演化出他們的 Shepherd

選型Spring Cloud Gateway

我們主要方向是業(yè)務網(wǎng)關,那么不僅要根據(jù)公司業(yè)務或者戰(zhàn)略方向解決當前的痛點,同時也要結(jié)合當前使用的技術,用最短的時間和人力做最正確的事情。

選擇Spring Cloud Gateway 主要原因是:

  • 大部分公司或者企業(yè)級項目目前的微服務技術解決方案都是Spring Cloud。
  • 較高性能和高可靠性:Spring Cloud Gateway使用了WebFlux和Reactor等技術,支持異步非阻塞I/O操作,能夠處理大量并發(fā)請求,具有高性能和高可靠性。
  • 靈活的路由策略:Spring Cloud Gateway支持多種路由策略,可以根據(jù)請求路徑、請求頭、請求參數(shù)等條件進行路由,也可以使用自定義的過濾器進行路由。
  • 可插拔的過濾器:Spring Cloud Gateway支持自定義過濾器,可以在請求轉(zhuǎn)發(fā)前或轉(zhuǎn)發(fā)后進行一些額外的操作,如身份驗證、限流、日志記錄等。
  • 集成了Spring Cloud組件:Spring Cloud Gateway與Spring Cloud組件集成良好,可以與Eureka、Consul等注冊中心、Ribbon、Hystrix等負載均衡和熔斷器組件進行集成。
  • 易于擴展和定制:Spring Cloud Gateway使用Java配置和代碼編程方式進行路由和過濾器的配置,易于擴展和定制。
  • Java 語言強大的生態(tài)庫加持。

當然Spring Cloud Gateway也有缺點:

  • 相對于其他網(wǎng)關,云原生支持不友好。
  • 無法作為流量網(wǎng)關,性能無法與基于Lua和Go語言開發(fā)的網(wǎng)關相提并論。
  • 占用服務器資源較高: 與腳本語言和Go語言相比,需要更多的服務器資源。
  • 路由以及過濾器配置性能閾值較明顯,當存在大量API并且復雜的路由策略時,處理性能較低,如圖所示:
springGateway分析.jpg

其實歸根結(jié)底 最重要的是Spring Cloud Gateway是Java語言開發(fā)的,更適合擴展業(yè)務插件,雖然Lua和Go 性能很高,但是針對復雜的業(yè)務插件,由于語言本身的問題,性能并不會很高。

選型監(jiān)控組件以及存儲

監(jiān)控組件

監(jiān)控組件選擇目前主流的APM項目 : Apache SkyWalking 。無論是新老項目,只要是JAVA開發(fā)的,它可以JAVA SPI機制加載,可以無侵入集成到項目上,收集日志以及鏈路追蹤信息。 目前由于Skywalking社區(qū)太過龐大,我們可以只使用apache/skywalking-java 來進行集成和自定義日志收集。

日志收集組件

日志收集組件選擇elastic家族的elastic/beatselastic/logstash

原因有以下幾點:

  1. 輕量級:Filebeat是一款輕量級的工具,它的安裝包非常小,而且占用系統(tǒng)資源非常少,因此可以輕松地部署在任何服務器上,不會影響服務器的性能。
  2. 靈活性:Filebeat支持多種數(shù)據(jù)源和輸出目的地,用戶可以根據(jù)自己的需要配置不同的輸入和輸出,而且Filebeat還支持多種數(shù)據(jù)格式,如JSON、CSV等。
  3. 實時性:Filebeat可以實時地監(jiān)控日志文件的變化,并將新的日志信息傳輸?shù)街付ǖ哪康牡兀@意味著您可以及時地獲取最新的日志信息,從而更快地發(fā)現(xiàn)問題。
  4. 可靠性:Filebeat使用TCP協(xié)議傳輸日志信息,這意味著它具有很高的可靠性,而且還可以自動重試失敗的傳輸操作,從而確保數(shù)據(jù)的完整性和可靠性。
  5. 易于使用:Filebeat具有簡單的配置文件,用戶只需要進行基本的配置就可以開始使用它,而且Filebeat還提供了多種插件,可以輕松地擴展其功能。

消息中間件

Kafka作為日志消息的消息中間件,這個不需要多做解釋了吧。

存儲

  • Elasticsearch:用于近期日志搜索和分析。
  • Hadoop: 用于歷史數(shù)據(jù)的分析、搜索。
  • S3(或塊存儲): 用于原日志文件的備份歸檔。

系統(tǒng)架構(gòu)圖

架構(gòu)圖.jpg
系統(tǒng)架構(gòu)圖.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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