Nginx
Nginx是一款高性能的http 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器。能夠支撐 5 萬并發(fā)鏈接,并且 cpu、內(nèi)存等資源消耗卻非常低,運行非常穩(wěn)定,由C語言編寫。支持負(fù)載均衡、限流熔斷、熱部署、安全認(rèn)證等。
應(yīng)用場景
- http 服務(wù)器:獨立提供 http 服務(wù),用于做網(wǎng)頁靜態(tài)服務(wù)器
- 虛擬主機(jī):可以實現(xiàn)在一臺服務(wù)器虛擬出多個網(wǎng)站
- 反向代理,負(fù)載均衡:多臺服務(wù)器集群可以使用 nginx 做反向代理
缺陷
- Nginx不支持集群管理
- Nginx不支持配置的熱加載。修改配置重新加載Nginx的時間可能需要半個小時以上
正向代理服務(wù)器位于客戶端和服務(wù)器之間,為了向服務(wù)器獲取數(shù)據(jù),客戶端要向代理服務(wù)器發(fā)送一個請求,并指定目標(biāo)服務(wù)器,代理服務(wù)器將目標(biāo)服務(wù)器返回的數(shù)據(jù)轉(zhuǎn)交給客戶端。正向代理代理的是客戶端,我們需要在客戶端進(jìn)行一些代理的設(shè)置。
反向代理我們只需要將請求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后,在返回給客戶端,此時反向代理服務(wù)器和目標(biāo)服務(wù)器對外就是一個服務(wù)器,暴露的是代理服務(wù)器地址,隱藏了真實服務(wù)器IP地址。反向代理代理的是服務(wù)器,作為客戶端的我們是無法感知到服務(wù)器的真實存在的。
Kong?
Kong是一款基于OpenResty(Nginx + Lua模塊)編寫的高可用、易擴(kuò)展的Gateway項目。Kong是基于Nginx和Apache Cassandra或PostgreSQL構(gòu)建的,能提供易于使用的RESTful API來操作和配置API管理系統(tǒng),所以它可以水平擴(kuò)展多個Kong服務(wù)器,通過前置的負(fù)載均衡配置把請求均勻地分發(fā)到各個Server,來應(yīng)對大批量的網(wǎng)絡(luò)請求。解決了Nginx問題,支持集群部署和熱加載。
支持使用插件進(jìn)行定制功能,但插件基于lua編寫,不易維護(hù),目前官網(wǎng)提供的基礎(chǔ)插件有:HTTP基本認(rèn)證、密鑰認(rèn)證、文件日志、API請求限流、請求轉(zhuǎn)發(fā)以及Nginx監(jiān)控。
相關(guān)組件
- Kong Server:基于nginx的服務(wù)器,用來接收API請求。
- Apache Cassandra/PostgreSQL:用來存儲操作數(shù)據(jù)。
- Kong dashboard:官方推薦UI管理工具,當(dāng)然,也可以使用restfull方式管理admin api
Kong的網(wǎng)關(guān)架構(gòu)
- Kong核心基于OpenResty構(gòu)建,實現(xiàn)了請求/響應(yīng)的Lua處理化
- Kong插件攔截請求/響應(yīng)
- Kong Restful管理API提供了API/API消費者/插件的管理
- 數(shù)據(jù)中心用于存儲Kong集群節(jié)點信息、API、消費者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建議使用Cassandra
- Kong集群中的節(jié)點通過gossip協(xié)議自動發(fā)現(xiàn)其他節(jié)點,當(dāng)通過一個Kong節(jié)點的管理API進(jìn)行一些變更時也會通知其他節(jié)點。每個Kong節(jié)點的配置信息是會緩存的,如插件,那么當(dāng)在某一個Kong節(jié)點修改了插件配置時,需要通知其他節(jié)點配置的變更。
缺陷
- Kong需要依賴于PostgreSQL或Cassandra數(shù)據(jù)庫,這使Kong的整個架構(gòu)非常臃腫,會帶來高可用的問題。如果數(shù)據(jù)庫故障了,那么整個API網(wǎng)關(guān)都會出現(xiàn)故障。
- Kong的路由使用的是遍歷查找,當(dāng)網(wǎng)關(guān)內(nèi)有超過上千個路由時,它的性能就會出現(xiàn)比較急劇的下降。
APISIX
Apache APISIX基于 nginx(openresty)和 Lua 實現(xiàn)的一款國產(chǎn)軟件,是一個動態(tài)、實時、高性能的云原生API網(wǎng)關(guān),提供了負(fù)載均衡、動態(tài)上游、灰度發(fā)布、服務(wù)熔斷、身份認(rèn)證、可觀測性等豐富的流量管理功能??梢允褂肁pacheAPISIX處理傳統(tǒng)的南北向流量,也可以處理服務(wù)間的東西向流量。同時,它也支持作為K8s Ingress Controller來使用。
主要特性
- 全動態(tài)能力:APISIX支持熱加載
- 高性能路由匹配算法:使用壓縮前綴樹RadixTree,當(dāng)對某個請求進(jìn)行匹配時,RadixTree將采用層層遞進(jìn)的方式進(jìn)行匹配,其復(fù)雜度為O(K)(K是路由中URI的長度,與API數(shù)量多少無關(guān))。當(dāng)進(jìn)行IP匹配時使用Hash的方式進(jìn)行查找,時間復(fù)雜度為O(1),性能更高。
- 精細(xì)化路由:APISIX支持使用Nginx內(nèi)置變量做為路由的匹配條件,你可以自定義匹配函數(shù)來過濾請求,匹配路由。
- 運維友好:APISIX支持與以下工具和平臺集成:Zipkin、SkyWalking、Consul、Nacos、Eureka。通過APISIXDashboard控制臺,運維人員可以通過友好且直觀的UI配置APISIX。
- 支持多語言插件:目前官網(wǎng)支持80多種插件(grpc、serverless、skywalking、kafka、es等),也支持通過PluginRunner或者Wasm(運行字節(jié)碼文件)自定義插件。
APISIX網(wǎng)關(guān)架構(gòu)
數(shù)據(jù)面:它是真正去處理來自客戶端請求的一個組件,去處理用戶的真實流量,包括像身份驗證、證書卸載、日志分析和可觀測性等功能。數(shù)據(jù)面本身并不會存儲任何數(shù)據(jù),所以它是一個無狀態(tài)結(jié)構(gòu)。如果監(jiān)聽etcd的配置信息變更,APISIX就可以將獲取最新配置的時間控制在毫秒級別之內(nèi),達(dá)到實時生效。
控制面:使用etcd存儲配置,能更好地體現(xiàn)高可用特性,擁有低于毫秒級別的變化通知。
應(yīng)用場景
負(fù)載均衡和API網(wǎng)關(guān)
具備高性能、安全等特性,在負(fù)載均衡的服務(wù)能力上也更優(yōu)秀。從Nginx切換到APISIX不僅性能不會下降,而且可以享受到動態(tài)、統(tǒng)一管理等特性帶來的管理效率的提升。
微服務(wù)網(wǎng)關(guān)
支持多種語言編寫擴(kuò)展插件,可以解決東西向微服務(wù)API網(wǎng)關(guān)面臨的主要問題(異構(gòu)多語言和通用問題)。內(nèi)置支持的服務(wù)注冊中心有Nacos、Eureka等,可以平滑替代Zuul、Gateway等微服務(wù)API網(wǎng)關(guān)。(東西向微服務(wù)指系統(tǒng)內(nèi)各個微服務(wù)間的調(diào)用)
K8s Ingress
官網(wǎng)的 Ingress主要基于Nginx配置文件的方式,使用APISIX Ingress Controller可以支持全動態(tài),無需重啟加載。同時繼承了APISIX的所有優(yōu)勢,還支持原生KubernetesCRD,方便用戶遷移。
Gateway
API網(wǎng)關(guān)為微服務(wù)架構(gòu)的系統(tǒng)提供簡單、有效 且統(tǒng)一的API路由管理,作為系統(tǒng)的統(tǒng)一入口,提供內(nèi)部服務(wù)的路由中轉(zhuǎn),給客戶端提供統(tǒng)一的服務(wù),可以實現(xiàn)一些和業(yè)務(wù)沒有耦合的公用邏輯,主要功能包含認(rèn)證、鑒權(quán)、路由轉(zhuǎn)發(fā)、安全策略、防刷、流量控制、監(jiān)控日志等。
Gateway 是Spring Cloud官方推出的第二代網(wǎng)關(guān)框架,定位于取代 Netflix Zuul。旨在為微服務(wù)架構(gòu)提供一種簡單且有效的 API 路由的管理方式,并基于Filter 的方式提供網(wǎng)關(guān)的基本功能,例如說安全認(rèn)證、監(jiān)控、限流等等。Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 實現(xiàn)的響應(yīng)式的 API 網(wǎng)關(guān)。
相關(guān)概念
路由:路由是網(wǎng)關(guān)中最基礎(chǔ)的部分,路由信息包括一個ID、一個目的URI、一組斷言工廠、一組Filter組成
斷言:斷言函數(shù)允許開發(fā)者去定義匹配Http request中的任何信息,比如請求頭和參數(shù)等。如果斷言為真,則說明請求的URL和配置的路由匹配
過濾器:分為Gateway FilIer和Global Filter。Filter可以對請求和響應(yīng)進(jìn)行處理。默認(rèn)支持的過濾器有:AddRequestHeader請求頭,AddRequestParameter請求參數(shù)、RequestRateLimiter限流、Hystrix熔斷、Retry重試等20多種過濾器,也支持自定義過濾器。
# 相關(guān)配置
spring:
cloud:
gateway:
#設(shè)置路由:路由id、路由到微服務(wù)的uri、斷言
routes:
- id: order_route #路由ID,全局唯一,建議配置服務(wù)名
uri: lb://mall-order #lb 整合負(fù)載均衡器ribbon,loadbalancer
predicates:
- Path=/order/** # 斷言,路徑相匹配的進(jìn)行路由
filters: #過濾器
‐ AddRequestHeader=X‐Request‐color, red #添加請求頭過濾
工作原理
跟 Zuul 的差不多,最大的區(qū)別就是 Gateway 的 Filter 只有 pre和 post 兩種。
客戶端向 Spring Cloud Gateway 發(fā)出請求,如果請求與網(wǎng)關(guān)程序定義的路由匹配,則該請求就會被發(fā)送到網(wǎng)關(guān)Web 處理程序, 先執(zhí)行pre過濾器,再執(zhí)行代理請求,代理請求完成后執(zhí)行post 過濾器邏輯。
網(wǎng)關(guān)選型
云原生領(lǐng)域APISIX更加優(yōu)于Kong和Nginx,Apisix 是對標(biāo)云原生網(wǎng)關(guān)的,嚴(yán)格來說和 Spring Cloud Gateway 這種業(yè)務(wù)形網(wǎng)關(guān)沒什么可比性。
如果是小公司,架構(gòu)簡單,業(yè)務(wù)單一,則使用Gateway作為業(yè)務(wù)網(wǎng)關(guān)完全夠用,而且還便于定制化擴(kuò)展。若架構(gòu)復(fù)雜,業(yè)務(wù)流量大,k8s容器化部署,對標(biāo)云原生的則可以使用Apisix。也可以Apisix和gateway搭配使用,流量網(wǎng)關(guān)使用Apisix,業(yè)務(wù)網(wǎng)關(guān)使用gateway,使用流量網(wǎng)關(guān)對公網(wǎng)入口流量進(jìn)行轉(zhuǎn)發(fā)到業(yè)務(wù)網(wǎng)關(guān),再由業(yè)務(wù)網(wǎng)關(guān)將請求轉(zhuǎn)發(fā)至各個系統(tǒng)。文章來源:http://www.zghlxwxcb.cn/news/detail-627614.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-627614.html
到了這里,關(guān)于Nginx、Kong、Apisix、Gateway網(wǎng)關(guān)比較的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!