Nginx Lua模塊(OpenResty)實戰:動態化、智能化你的Nginx,實現復雜Web邏輯 (2025)

更多服務器知識,盡在hostol.com

嘿,各位Nginx的“鐵桿粉絲”和“配置大師”們!咱們都知道,Nginx以其超凡的性能、穩定性和豐富的模塊化功能,在Web服務器、反向代理、負載均衡等領域獨步青云,簡直是服務器軟件界的“常青樹”和“萬人迷”。但是,你有沒有在某些時候覺得,Nginx那基于靜態配置文件的“行事風格”,在處理一些需要更強動態性、更復雜判斷邏輯的場景時,顯得有點“力不從心”或者“束手束腳”?比如,你想根據用戶IP的地理位置動態調整后端服務,或者想在Nginx層面實現一個超輕量級的API參數校驗,又或者想在把請求打到后端應用前,先去Redis里查點兒數據做個預處理……這些用純Nginx配置寫起來可能九曲十八彎,甚至根本實現不了。

這時候,你就需要祭出Nginx的“隱藏大招”,堪稱“核武器”級別的增強模塊了——那就是**`ngx_http_lua_module`**,以及基于它構建的更為強大的Web平臺**OpenResty**!它們能讓你的Nginx瞬間“開竅”,學會“說”Lua這門輕巧又高效的腳本語言,從而在Nginx的各個處理階段注入你自己的動態邏輯。今天,Hostol就帶你一起揭開Nginx + Lua這對“黃金搭檔”的神秘面紗,看看它們是如何讓你的Nginx從一個“循規蹈矩的交通警察”變身為一個“能文能武、隨機應變的特種兵王”的!


Lua 與 Nginx 的“跨界聯姻”:當高性能Web服務器遇到輕量級腳本語言

1. `ngx_http_lua_module` 是何方神圣?

簡單來說,ngx_http_lua_module是一個第三方Nginx模塊(在OpenResty中是核心組件),它把LuaJIT(一個超快的Lua即時編譯器)或者標準的Lua解釋器直接嵌入到了Nginx的工作進程中。這意味著,你可以在Nginx的配置文件里,直接編寫或調用外部的Lua腳本,讓這些腳本在Nginx處理HTTP請求的各個階段(比如接收請求頭后、訪問控制檢查時、內容生成時、響應過濾時等)執行你的自定義邏輯。

2. OpenResty又是什么?——“Nginx + Lua全家桶”

如果你覺得單獨編譯Nginx并集成ngx_http_lua_module以及其他相關的Lua庫(比如操作Redis、MySQL的庫)太麻煩,那么OpenResty就是為你量身打造的“一站式解決方案”。OpenResty? 是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數 Nginx 的標準模塊。你可以把它看作是一個“超級Nginx”,出廠就自帶了Lua引擎和一大堆實用的“瑞士軍刀”(比如lua-resty-core, lua-resty-redis, lua-resty-mysql, lua-resty-upload等等),讓你能用Lua在Nginx里輕松實現各種復雜功能,而無需重新編譯Nginx。

Hostol建議: 對于大多數想在Nginx中使用Lua的場景,直接使用OpenResty通常是最省心、最高效的選擇。

3. 為啥要在Nginx里用Lua?它能帶來哪些“魔法”?

你可能會問:“我直接把這些邏輯放在后端的PHP/Java/Python應用里不行嗎?為啥非得在Nginx這層折騰?” 問得好!在Nginx層面用Lua處理,很多時候能帶來意想不到的好處:

  • 超高性能與非阻塞I/O: Lua腳本在Nginx中是基于Nginx自身的事件驅動、非阻塞模型運行的(通過Lua的協程和Nginx提供的非阻塞API,如ngx.socket.tcp(), ngx.location.capture())。這意味著,當你的Lua腳本需要進行網絡調用(比如訪問Redis、數據庫、或其他HTTP API)時,它不會阻塞當前的Nginx工作進程去處理其他請求,而是會“掛起”當前請求,讓Nginx先去忙別的,等網絡I/O操作完成后再回來繼續處理。這種“一心多用”的能力,使得Nginx+Lua能夠輕松應對極高的并發。
  • 減少到后端應用的請求,降低延遲: 對于一些可以在Nginx層面快速處理的邏輯(比如簡單的API參數校驗、用戶身份認證、AB測試分流、根據特定條件修改請求頭/響應頭等),直接用Lua在Nginx內部解決,可以避免一次到后端應用服務器的網絡往返,從而顯著降低請求延遲。這就像在公司前臺就能解決的小問題,就不用再麻煩總經理了。
  • 強大的靈活性與可擴展性: Lua本身是一門小巧、靈活、易于嵌入的腳本語言。通過它,你可以像“搭積木”一樣,快速地給Nginx添加各種自定義功能,而無需編寫復雜的C模塊或重新編譯Nginx。
  • 構建高性能API網關: 利用Nginx+Lua,可以輕松構建出功能強大的API網關,實現請求路由、認證鑒權、流量控制、日志記錄、監控告警、服務編排等復雜功能。
  • 實現自定義WAF邏輯: 雖然有專業的WAF模塊,但有時你可能需要一些非常定制化的、輕量級的Web應用防火墻規則,用Lua在Nginx里實現會非常靈活。

可以這么說,Nginx+Lua就像是給Nginx這臺“F1賽車”又加裝了一套“智能輔助駕駛系統”和“氮氣加速”,讓它不僅跑得快,還能在復雜的“賽道”上做出各種風騷的“漂移動作”!


“開箱上膛”:Nginx中嵌入Lua代碼的幾種姿勢

要在Nginx里運行Lua代碼,主要是在Nginx配置文件的特定“鉤子點”(處理階段)使用相應的指令。Nginx將HTTP請求的處理過程劃分為了多個階段,你可以在這些階段通過Lua腳本介入,影響請求的處理流程。

常見的Lua指令和它們對應的處理階段(只列舉部分核心的):

  • 變量設置階段:
    • set_by_lua_block { lua_code }
    • set_by_lua_file /path/to/script.lua;
    • 作用:執行Lua代碼,并將返回結果(字符串)設置為一個Nginx變量的值。通常在請求處理早期,用于動態生成一些后續配置會用到的變量。
  • 重寫/路由階段 (Rewrite Phase):
    • rewrite_by_lua_block { lua_code }
    • rewrite_by_lua_file /path/to/script.lua;
    • 作用:在此階段執行Lua代碼,可以進行復雜的URL重寫、內部跳轉、或者根據條件修改請求參數等。
  • 訪問控制階段 (Access Phase):
    • access_by_lua_block { lua_code }
    • access_by_lua_file /path/to/script.lua;
    • 作用:執行訪問控制邏輯。比如根據IP、請求頭、API密鑰等判斷是否允許訪問,如果Lua腳本執行了ngx.exit(ngx.HTTP_FORBIDDEN),則請求會被拒絕。
  • 內容生成階段 (Content Phase):
    • content_by_lua_block { lua_code }
    • content_by_lua_file /path/to/script.lua;
    • 作用:直接由Lua腳本生成HTTP響應內容,并發送給客戶端。這使得Nginx可以直接充當一個輕量級的應用服務器!比如用Lua直接輸出JSON或HTML。
  • 響應頭/響應體過濾階段 (Header/Body Filter Phase):
    • header_filter_by_lua_block { lua_code } / header_filter_by_lua_file ...;
    • body_filter_by_lua_block { lua_code } / body_filter_by_lua_file ...;
    • 作用:分別用于在Nginx將響應頭或響應體發送給客戶端之前,用Lua腳本對其進行修改。比如動態添加/刪除/修改響應頭,或者對響應內容進行過濾替換。
  • 日志記錄階段 (Log Phase):
    • log_by_lua_block { lua_code }
    • log_by_lua_file /path/to/script.lua;
    • 作用:在請求處理完畢,即將寫入訪問日志之前執行。可以用來實現非常靈活和定制化的日志記錄邏輯,比如把日志發送到遠程分析系統,或者記錄更豐富的上下文信息。

*_block { ... } 后面直接跟Lua代碼塊,適合簡短的邏輯。*_file /path/to/script.lua; 則指定一個外部Lua腳本文件,適合更復雜的邏輯,也更利于代碼的組織和復用。


實戰演練:“Lua彈藥”上膛,讓Nginx“指哪打哪”!

光說不練假把式,咱們來看幾個簡單但實用的例子,感受一下Nginx+Lua的威力!

示例1:基于IP黑名單的動態訪問控制 (access_by_lua_block)

假設我們想阻止某些“不受歡迎”的IP地址訪問我們的網站。我們可以把黑名單IP存在Redis里(當然也可以用其他方式)。

# nginx.conf 的 http 塊中 (或者 server 塊,如果只想對特定server生效)
# 定義一個lua共享字典,用來做簡單的IP緩存,避免頻繁查Redis
lua_shared_dict ip_blacklist_cache 10m;server {listen 80;server_name example.com;location / {access_by_lua_block {local redis = require "resty.redis"local cache = ngx.shared.ip_blacklist_cachelocal client_ip = ngx.var.remote_addrlocal cache_key = "ip_blacklist:" .. client_ip-- 先查本地緩存local is_blocked_cached = cache:get(cache_key)if is_blocked_cached == "1" thenngx.log(ngx.WARN, "IP ", client_ip, " blocked by local cache.")return ngx.exit(ngx.HTTP_FORBIDDEN)elseif is_blocked_cached == "0" then-- 緩存說它是安全的,直接放行 (可選,取決于你的策略)return ngx.OK end-- 本地緩存沒有,去查Redislocal red = redis:new()red:set_timeout(1000) -- 1秒超時local ok, err = red:connect("127.0.0.1", 6379)if not ok thenngx.log(ngx.ERR, "Failed to connect to Redis: ", err)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) -- Redis連不上,可以考慮放行或直接報錯end-- 假設黑名單IP在Redis的Set "ip_blacklist_set" 中local is_member, err = red:sismember("ip_blacklist_set", client_ip)red:close() -- 及時關閉連接if err thenngx.log(ngx.ERR, "Failed to query Redis: ", err)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)endif is_member == 1 thenngx.log(ngx.WARN, "IP ", client_ip, " found in Redis blacklist, blocking.")cache:set(cache_key, "1", 3600) -- 緩存1小時這個IP是被封的return ngx.exit(ngx.HTTP_FORBIDDEN)elsecache:set(cache_key, "0", 300) -- 緩存5分鐘這個IP是安全的-- ngx.OK (或者不寫,默認就是OK,會繼續處理請求)end}# 如果上面的Lua代碼沒有exit,請求會繼續走到這里root /var/www/html;index index.html index.htm;}
}

這個例子展示了如何在access_by_lua_block中連接Redis(需要lua-resty-redis庫,OpenResty自帶),查詢IP是否在黑名單中,并利用Nginx的共享內存字典(lua_shared_dict)做一層簡單的本地緩存,減少對Redis的請求壓力。是不是感覺Nginx瞬間變成了一個智能的“防火墻”?

示例2:用Lua直接輸出JSON響應 (content_by_lua_block)

有時候你可能需要一個超輕量級的API接口,直接由Nginx返回一些動態信息,而不想再啟動一個后端應用(比如PHP-FPM或Tomcat)。

location /api/hello {default_type 'application/json'; # 設置響應類型content_by_lua_block {local cjson = require "cjson" -- OpenResty自帶的快速JSON庫local response_data = {message = "Hello from Nginx powered by Lua!",timestamp = ngx.time(),server_name = ngx.var.server_name}ngx.say(cjson.encode(response_data))}
}

訪問/api/hello,Nginx就會直接返回一段JSON,是不是超酷?

示例3:動態修改響應頭 (header_filter_by_lua_block)

比如,你想給所有從特定后端應用返回的響應都加上一個自定義的X-Powered-By頭,或者刪掉一些敏感的后端服務器信息頭。

location /app1/ {proxy_pass http://backend_app1_server;# ...其他proxy配置...header_filter_by_lua_block {ngx.header["X-Powered-By"] = "Nginx + Lua Magic"ngx.header["X-App-Version"] = nil -- 刪除可能存在的X-App-Version頭}
}

Nginx Lua API “小抄” (ngx.*家族):

在Lua腳本里,你可以通過ngx.這個全局對象來訪問Nginx的各種功能和請求上下文信息:

  • ngx.var.NGINX_VARIABLE_NAME:訪問Nginx變量(比如ngx.var.uri, ngx.var.arg_name, ngx.var.http_user_agent)。
  • ngx.req.* 系列函數:用于請求處理,如ngx.req.get_headers(), ngx.req.set_header(), ngx.req.get_method(), ngx.req.get_uri_args(), ngx.req.read_body(), ngx.req.set_uri()等。
  • ngx.resp.* 系列函數:用于響應處理,如ngx.resp.add_header(), ngx.resp.get_headers()
  • ngx.say("...") / ngx.print("..."):輸出響應內容(主要在content_by_lua_*階段使用)。
  • ngx.exit(HTTP_STATUS_CODE):中斷當前請求處理,并以指定的HTTP狀態碼退出。
  • ngx.log(ngx.LEVEL, "message"):向Nginx的錯誤日志輸出信息(ngx.ERR, ngx.WARN, ngx.INFO, ngx.DEBUG等)。
  • 非阻塞I/O的關鍵:ngx.socket.tcp(), ngx.location.capture(), ngx.sleep()(這個sleep是協作式的,不會阻塞Nginx worker)。
  • 共享內存字典:ngx.shared.DICT_NAME,用于在Nginx的各個worker進程間共享少量數據(需要先在http塊用lua_shared_dict指令定義)。


調試你的“Lua魔法”:

  • 日志是最好的朋友: 大量使用ngx.log(ngx.ERR, "調試信息: ", 變量值),把你想看的信息打印到Nginx的錯誤日志里。記得把Nginx錯誤日志的級別(error_log /path/to/error.log warn;中的warn)調得足夠低(比如notice, info甚至debug)才能看到你的Lua日志。
  • lua_code_cache on/off; 在開發調試階段,可以在http塊或server塊設置lua_code_cache off;(默認為on)。這樣每次請求Nginx都會重新加載Lua腳本文件,方便你修改腳本后立即看到效果,不用頻繁reload Nginx。但生產環境務必改回lua_code_cache on;,否則性能會大打折扣!
  • 小步快跑,獨立測試: 復雜的Lua邏輯,可以先在本地用標準的Lua解釋器(或LuaJIT)寫一些小的測試單元,確保邏輯正確,再嵌入到Nginx配置中。


性能考量與最佳實踐:

  • LuaJIT很快,但不是萬能藥: 雖然LuaJIT性能卓越,但過于復雜或低效的Lua代碼仍然可能成為瓶頸。盡量保持Lua邏輯的簡潔和高效。
  • 警惕阻塞操作: 在Nginx的Lua腳本中,絕對要避免任何可能導致阻塞的同步操作(比如直接用Lua標準庫進行文件IO或網絡IO)。所有需要等待的操作,都應該使用Nginx Lua模塊提供的非阻塞API(如ngx.socket.*, ngx.location.capture, ngx.pipe等),或者使用基于這些API封裝好的lua-resty-*庫。
  • 共享數據要小心: Nginx是多worker進程模型。如果你在lua_shared_dict中存取數據,要注意并發訪問可能帶來的問題(雖然它本身提供了一些原子操作)。對于復雜的狀態共享,可能需要更專業的方案(如Redis)。
  • 代碼復用: 把常用的Lua函數封裝成模塊(.lua文件),然后在你的Nginx配置中通過require "my_module"來調用,保持配置的整潔和代碼的可維護性。


怎么樣,是不是感覺Nginx的“技能樹”又被點亮了一大片?通過ngx_http_lua_module(或者說OpenResty的強大生態),Nginx不再僅僅是一個高性能的Web服務器和反向代理,它搖身一變,成了一個功能極其強大、靈活可編程的Web應用平臺、API網關、動態防火墻……幾乎無所不能!它就像是給了你一把能“隨心所欲修改游戲規則”的“GM權限密鑰”。雖然上手可能需要一點時間和對Nginx處理流程的理解,但一旦你掌握了Nginx+Lua這對“王炸組合”,你會發現,以前很多需要依賴后端應用才能實現的復雜邏輯,現在在Nginx層面就能舉重若輕地搞定,那種酣暢淋漓的感覺,絕對會讓你大呼過癮!Hostol希望這篇“核武器”入門指南,能為你打開新世界的大門,去探索Nginx更深邃、更強大的潛能吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82977.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一、CentOS7通過kubeadm安裝K8S 1.20.1版本

一、準備機器 所有節點執行 準備3臺虛擬機(2核4G,CentOS 7),配置如下: hostnamectl set-hostname k8s-master # 在Master節點執行 hostnamectl set-hostname k8s-node1 # Worker1節點執行 hostnamectl set-hostna…

AgenticSeek,開源本地通用AI Agent,自主執行任務

AgenticSeek是一款完全本地化的開源AI助手,作為Manus的開源替代品,專為保護用戶隱私而設計。它能夠在本地設備上執行多種任務,包括網頁瀏覽、代碼編寫和復雜項目的規劃,確保所有操作和數據均在用戶的設備上完成。 AgenticSeek是什…

C 語言學習筆記(指針6)

內容提要 內存操作 內存操作的函數 內存操作 我們對于內存操作需要依賴于string.h頭文件中相關的庫函數。 內存的庫函數 內存填充 頭文件&#xff1a;#include <string.h>函數原型 void* memset(void* s, int c, size_t)函數功能&#xff1a;將內存塊s的前n個字節…

Grafana-Gauge儀表盤

儀表盤是一種單值可視化。 可讓您快速直觀地查看某個值落在定義的或計算出的最小和最大范圍內的位置。 通過重復選項&#xff0c;您可以顯示多個儀表盤&#xff0c;每個對應不同的序列、列或行。 支持的數據格式 單值 數據集中只有一個值&#xff0c;會生成一個顯示數值的…

解決Vue項目依賴錯誤:使用electron-vite重建

文章目錄 開端解決方案&#xff1a;使用 electron-vite Vue 重建項目1. 環境準備2. 創建新項目3. 安裝依賴并啟動項目 開端 在開發過程中&#xff0c;我遇到了一個令人頭疼的錯誤提示&#xff1a; 0:0 error Parsing error: Cannot find module vue/cli-plugin-babel/preset…

WPF prism

Prism Prism.Dryloc 包 安裝 Nuget 包 - Prism.DryIoc 1. 修改 App.xaml 修改 App.xaml 文件&#xff0c;添加 prism 命名空間, 繼承由 Application → PrismApplication&#xff0c;刪除默認啟動 url, StartupUri“MainWindow.xaml” <dryioc:PrismApplicationx:Class…

循序漸進PersistentVolumes與PersistentVolumeClaim

文章目錄 靜態配置&#xff08;Static Provisioning&#xff09;&#xff1a;Persistent volume(PV)Local 示例&#xff1a;NFS 示例&#xff1a;檢查pvPV 的常見狀態說明Persistent volume claim(PVC)1. local PVC示例:2.NFS PVC示例:3. 檢查PVC: 掛載靜態供應卷驗證靜態供應卷…

【連接器專題】SD卡座規格書審查需要審哪些方面?

在審查SD卡座規格書時,我們需要考慮哪些方面? 首先在拿到一份SD卡座的詳細規格書時,一般供應商給到的規格書中包括了一些基礎信息、產品圖紙信息、技術參數信息,同時有些供應商會給出產品可靠性測試報告。因此我們會從這幾個要素去看規格書。 基礎信息 基礎信息一般會給變更…

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事項

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事項 要IEEE overleaf 模板私信,我直接給我自己論文,便于編輯 已經投稿完成了,有一些小坑 準備工作 注冊IEEE賬戶:若沒有IEEE賬戶,需前往IEEE官網注冊。注冊成功后,可用于登錄投稿系統。現在新的系統,…

JS入門——三種輸入方式

JS入門——三種輸入方式 一、方式一&#xff1a;直接在警告框彈出(window可以省略) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script><!-- 方式一直接在警告框彈…

WordPress免費網站模板下載

大背景圖免費wordpress建站模板 這個wordpress模板設計以簡約和專業為主題&#xff0c;旨在為用戶提供清晰、直觀的瀏覽體驗。以下是對其風格、布局和設計理念的詳細介紹&#xff1a; 風格 簡約現代&#xff1a;整體設計采用簡約風格&#xff0c;使用了大量的白色和灰色調&am…

AUTOSAR CP全新系統化培訓上線!從底層到應用,三步階梯,五大學習維度構建完整知識體系

AUTOSAR組織 AUTOSAR官方全新推出「AUTOSAR CP全棧賦能計劃」&#xff0c;從架構全景到模塊細節&#xff0c;自底向上、由淺入深&#xff0c;覆蓋MCAL至SWC全層級&#xff0c;融合通信、診斷、安全等六大核心Feature&#xff0c;帶您穿透復雜理論&#xff0c;直擊AUTOSAR開發本…

Java網絡編程與Socket安全權限詳解

Socket安全權限控制 Java通過java.net.SocketPermission類實現對網絡套接字訪問的細粒度控制。該權限管理機制通常在Java策略文件中配置,其標準授權語法格式如下: grant {permission java.net.SocketPermission"target", "actions"; };目標主機與端口規…

基于本地化大模型的智能編程助手全棧實踐:從模型部署到IDE深度集成學習心得

近年來&#xff0c;隨著ChatGPT、Copilot等AI編程工具的爆發式增長&#xff0c;開發者生產力獲得了前所未有的提升。然而&#xff0c;云服務的延遲、隱私顧慮及API調用成本促使我探索一種更自主可控的方案&#xff1a;基于開源大模型構建本地化智能編程助手。本文將分享我構建本…

視頻監控匯聚平臺EasyCVR安防小知識:如何通過視頻融合平臺解決信息孤島問題?

一、項目背景與需求分析? 隨著數字化技術發展與網絡帶寬升級&#xff0c;視頻技術應用場景不斷拓展&#xff0c;視頻監控、記錄儀等多樣化產品構建起龐大體系。但這些獨立系統彼此割裂&#xff0c;形成信息孤島。 在系統集成項目中&#xff0c;視頻系統深度融合已成必然趨勢…

如何在 Windows 和 Mac 上擦拭和清潔希捷外置硬盤

希捷外置硬盤廣泛用于存儲目的&#xff0c;但有時您可能出于多種目的需要擦除或清潔希捷外置硬盤&#xff0c;例如轉售、重復使用、捐贈等。為了釋放硬盤上的存儲空間或確保沒有人可以從硬盤中恢復您的信息&#xff0c;擦除硬盤是必要的步驟。無論您使用的是 Windows 還是 Mac&…

SAP saml2 元數據 HTTP 錯誤

使?事務 SAML2 或 SAML2_IDP 在 ABAP 系統中配置 SAML 2.0 時&#xff0c; Web 頁?返回 403 已禁?、 404 未找到 或 500 服務器內部錯誤。 在事務 SAML2 中下載元數據時&#xff0c; ?頁返回 403 已禁?、 404 未找到或 500 服務器內部錯誤。 在事務 SAML2_IDP 中下載…

powershell 中 invoke-expression 報錯解決

打開powershell就出現這個報錯&#xff1a; 網上搜了也沒有很好的解決辦法&#xff0c;抱著一點點期待&#xff0c;問了豆包 根據豆包的指示&#xff0c;在終端執行以下 幾個命令&#xff0c;報錯解決了&#xff08;開心萬歲&#xff09; # 移除多余的引號和空路徑 $pathArra…

簡單說一說Modern ABAP這個概念

Modern ABAP 是 SAP近些年來提出的一個概念&#xff0c;指的是在傳統 ABAP (Advanced Business Application Programming) 的基礎上&#xff0c;結合新技術和現代化編程理念進行改進和優化&#xff0c;旨在使 ABAP 更適應云計算、數據驅動業務以及開發效率提升的需求。 這一概…

kafka 常用知識點

文章目錄 前言kafka 常用知識點1. kafka 概念2. 消息共享和廣播3. 分區和副本數量奇偶數 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0…