開源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并且復雜的路由策略時,處理性能較低,如圖所示:
其實歸根結(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/beats 和 elastic/logstash。
原因有以下幾點:
- 輕量級:Filebeat是一款輕量級的工具,它的安裝包非常小,而且占用系統(tǒng)資源非常少,因此可以輕松地部署在任何服務器上,不會影響服務器的性能。
- 靈活性:Filebeat支持多種數(shù)據(jù)源和輸出目的地,用戶可以根據(jù)自己的需要配置不同的輸入和輸出,而且Filebeat還支持多種數(shù)據(jù)格式,如JSON、CSV等。
- 實時性:Filebeat可以實時地監(jiān)控日志文件的變化,并將新的日志信息傳輸?shù)街付ǖ哪康牡兀@意味著您可以及時地獲取最新的日志信息,從而更快地發(fā)現(xiàn)問題。
- 可靠性:Filebeat使用TCP協(xié)議傳輸日志信息,這意味著它具有很高的可靠性,而且還可以自動重試失敗的傳輸操作,從而確保數(shù)據(jù)的完整性和可靠性。
- 易于使用:Filebeat具有簡單的配置文件,用戶只需要進行基本的配置就可以開始使用它,而且Filebeat還提供了多種插件,可以輕松地擴展其功能。
消息中間件
Kafka作為日志消息的消息中間件,這個不需要多做解釋了吧。
存儲
- Elasticsearch:用于近期日志搜索和分析。
- Hadoop: 用于歷史數(shù)據(jù)的分析、搜索。
- S3(或塊存儲): 用于原日志文件的備份歸檔。