RabbitMQ從入門到精通與實戰(zhàn)指南
在分布式系統(tǒng)架構中,消息中間件是實現(xiàn)服務解耦、流量緩沖、異步通信的核心組件。而RabbitMQ作為基于AMQP協(xié)議的開源消息代理,憑借其高可靠性、靈活路由、跨平臺兼容等特性,成為金融、電商、物流等行業(yè)企業(yè)級應用的首選。本文將從基礎認知出發(fā),逐步深入RabbitMQ的核心原理、高級特性、實戰(zhàn)場景與運維技巧,幫你徹底搞懂并玩轉RabbitMQ。
一、基礎認知:什么是RabbitMQ?為什么需要它?
1.1 核心定義
RabbitMQ是一個開源的、基于Erlang語言開發(fā)的消息中間件(Message Broker),其核心作用是作為“消息中轉站”,實現(xiàn)生產(chǎn)者與消費者之間的異步通信——生產(chǎn)者發(fā)送消息后無需等待消費者即時處理,而是由RabbitMQ暫存并負責將消息可靠地傳遞給消費者。
類比生活場景:RabbitMQ就像快遞分揀中心,生產(chǎn)者是寄快遞的人,消費者是取快遞的人,消息是快遞。寄件人只需將快遞交給分揀中心(無需等待收件人簽收),分揀中心會負責將快遞精準投遞到對應收件人的快遞柜(隊列),收件人再按需從快遞柜取件。
1.2 解決的核心問題
在傳統(tǒng)的分布式系統(tǒng)直連架構中,常面臨以下痛點,而RabbitMQ能精準解決:
- 系統(tǒng)解耦:服務間直接調(diào)用會導致耦合度極高,例如電商訂單系統(tǒng)需直接調(diào)用庫存、支付、物流服務,一旦某服務修改接口,所有依賴服務都需調(diào)整。通過RabbitMQ,訂單系統(tǒng)只需發(fā)送“訂單創(chuàng)建”消息,其他服務訂閱消息即可,服務間無需直接關聯(lián)。
- 流量削峰:秒殺、大促等場景下,用戶請求會瞬間激增,直接沖擊數(shù)據(jù)庫可能導致系統(tǒng)崩潰。RabbitMQ可緩沖突發(fā)流量,將每秒數(shù)萬次的請求均勻分發(fā)到后端服務,確保系統(tǒng)平穩(wěn)運行。
- 異步通信:部分業(yè)務無需同步處理,例如用戶注冊后發(fā)送歡迎短信、創(chuàng)建用戶檔案等操作,通過RabbitMQ異步處理可提升主流程響應速度,避免用戶等待。
- 跨系統(tǒng)數(shù)據(jù)同步:多系統(tǒng)間(如ERP與WMS、用戶系統(tǒng)與訂單系統(tǒng))需實時同步數(shù)據(jù),RabbitMQ可通過廣播機制實現(xiàn)數(shù)據(jù)實時流轉,且支持可視化配置路由規(guī)則,降低集成成本。
1.3 核心優(yōu)勢
相比Kafka、RocketMQ等其他消息中間件,RabbitMQ的核心優(yōu)勢在于:
- 高可靠性:原生支持消息持久化、發(fā)布確認、消費者確認等機制,確保消息不丟失、不重復處理。
- 靈活路由:提供4種核心交換機類型,支持精準匹配、廣播、模糊匹配等多種路由策略,適配復雜業(yè)務場景。
- 多協(xié)議支持:兼容AMQP 1.0、MQTT、STOMP等主流通信協(xié)議,支持多語言開發(fā)(Java、Python、Go等)。
- 輕量易運維:部署簡單(Docker可10分鐘啟動),提供直觀的Web管理界面,支持CLI命令行工具和監(jiān)控插件。
- 高可用集群:支持鏡像隊列、分布式集群,可實現(xiàn)故障自動轉移,避免單點故障。
二、核心架構:RabbitMQ的“快遞分揀系統(tǒng)”組成
要理解RabbitMQ的工作原理,首先需掌握其核心組件及交互關系。RabbitMQ的架構核心圍繞“生產(chǎn)者-交換機-隊列-消費者”的鏈路展開,輔以連接、信道等通信組件。
2.1 核心組件解析
用“快遞分揀系統(tǒng)”類比各組件功能,更易理解:
RabbitMQ組件 | 快遞系統(tǒng)類比 | 核心功能 |
|---|---|---|
生產(chǎn)者(Producer) | 寄快遞的人 | 生成并發(fā)送消息,發(fā)送前需指定消息的路由鍵(Routing Key)和目標交換機。 |
交換機(Exchange) | 快遞分揀中心 | 接收生產(chǎn)者發(fā)送的消息,根據(jù)自身類型和綁定規(guī)則(Binding Key)將消息路由到對應隊列。 |
隊列(Queue) | 小區(qū)快遞柜 | 存儲消息的容器,消息需先進入隊列才能被消費者獲??;支持持久化、限流、優(yōu)先級等配置。 |
消費者(Consumer) | 取快遞的人 | 監(jiān)聽隊列,獲取消息并執(zhí)行業(yè)務邏輯(如扣減庫存、發(fā)送通知);處理完成后需向RabbitMQ發(fā)送確認信號。 |
綁定(Binding) | 分揀中心與快遞柜的配送路線 | 建立交換機與隊列的關聯(lián)關系,同時指定綁定鍵(Binding Key),用于匹配路由鍵(Routing Key)。 |
連接(Connection) | 寄件人/收件人與分揀中心的公路 | 生產(chǎn)者/消費者與RabbitMQ服務器之間的TCP連接,是通信的基礎。 |
信道(Channel) | 公路上的車道 | 復用TCP連接的輕量級通信通道,避免頻繁創(chuàng)建/銷毀連接導致的性能開銷;每個信道獨立編號,支持并發(fā)通信。 |
2.2 核心交互流程
RabbitMQ的消息流轉核心流程可概括為5步:
- 生產(chǎn)者通過TCP連接建立信道,向指定交換機發(fā)送消息,并攜帶路由鍵(Routing Key)。
- 交換機根據(jù)自身類型(如Direct、Fanout)和綁定規(guī)則(Binding Key與Routing Key的匹配關系),將消息路由到一個或多個隊列。
- 消息被存儲在隊列中,等待消費者獲?。蝗襞渲昧顺志没?,消息會被寫入硬盤,即使服務器重啟也不會丟失。
- 消費者通過信道監(jiān)聽隊列,獲取消息并執(zhí)行對應的業(yè)務邏輯。
- 消費者處理完成后,向RabbitMQ發(fā)送ACK(確認)信號,RabbitMQ收到后刪除隊列中的該條消息;若處理失敗,可發(fā)送NACK(拒絕)信號,消息會重新入隊或進入死信隊列。
三、核心核心:4種交換機類型與路由規(guī)則
交換機是RabbitMQ路由消息的核心,不同類型的交換機對應不同的路由邏輯,適配不同的業(yè)務場景。RabbitMQ提供4種默認交換機類型,其中前3種最常用。
3.1 Direct Exchange(直連交換機):精準匹配,一對一/多路由
Direct交換機是最基礎的類型,核心邏輯是“路由鍵(Routing Key)與綁定鍵(Binding Key)完全匹配”,僅當兩者字符完全一致時,消息才會被路由到對應隊列。
核心特性:
- 路由規(guī)則簡單直接,精準度高。
- 一個隊列可綁定多個Binding Key,一個Binding Key也可綁定多個隊列(此時消息會被路由到所有匹配隊列,類似“多播”)。
適用場景:
需要精準路由的場景,例如:
- 業(yè)務模塊拆分:“訂單支付”消息僅路由到“支付處理隊列”,“訂單退款”消息僅路由到“退款處理隊列”。
- 任務分發(fā):特定類型的任務分配給指定的工作隊列(如視頻轉碼任務分配給轉碼 worker 隊列)。
工作流程示例:
1. 聲明Direct交換機(名稱:direct_exchange);
2. 隊列A綁定Binding Key = "order.pay",隊列B綁定Binding Key = "order.refund",隊列C綁定Binding Key = "order.pay";
3. 生產(chǎn)者發(fā)送消息,指定Routing Key = "order.pay";
4. 交換機匹配后,將消息路由到隊列A和隊列C,隊列B無消息。
3.2 Fanout Exchange(扇出交換機):無差別廣播,一對多路由
Fanout交換機是“廣播型”交換機,核心邏輯是“忽略Routing Key,將消息路由到所有與該交換機綁定的隊列”,無需匹配規(guī)則,只要隊列綁定了交換機,就能收到消息。
核心特性:
- 路由邏輯最簡單,效率最高(無需匹配計算)。
- 消息會被復制到所有綁定隊列,每個隊列都能收到完整消息。
適用場景:
需要廣播消息的場景,例如:
- 系統(tǒng)通知:服務啟動/下線通知、全局配置更新,所有相關服務都需接收。
- 日志收集:應用日志同時發(fā)送到“實時分析隊列”和“歸檔存儲隊列”。
- 事件同步:用戶注冊成功后,同步觸發(fā)“發(fā)送歡迎短信”“創(chuàng)建用戶檔案”“添加積分”等多個任務。
工作流程示例:
1. 聲明Fanout交換機(名稱:fanout_exchange);
2. 隊列1、隊列2綁定該交換機,隊列3未綁定;
3. 生產(chǎn)者發(fā)送消息(即使指定Routing Key,也會被忽略);
4. 交換機將消息路由到隊列1和隊列2,隊列3無消息。
3.3 Topic Exchange(主題交換機):模糊匹配,按“主題”路由
Topic交換機是最靈活的類型,核心邏輯是“通過通配符匹配Routing Key與Binding Key”,支持按“主題”批量路由消息,兼顧精準性和靈活性。
核心特性:
- Routing Key和Binding Key需為“多段字符串”(段之間用“.”分隔,如“user.create.wechat”),每段代表一個業(yè)務維度(如業(yè)務類型、操作、渠道)。
- 支持兩種通配符:
- *(星號):匹配1個任意段(如“user.*”可匹配“user.create”“user.delete”,但不匹配“user.create.wechat”);
- #(井號):匹配0個或多個任意段(如“user.#”可匹配“user”“user.create”“user.create.wechat”)。
適用場景:
需要按“主題”分類路由的場景,例如:
- 多維度業(yè)務消息:通過“user.#”接收所有用戶相關消息,通過“user.create.*”僅接收用戶創(chuàng)建的細分消息。
- 跨模塊消息分發(fā):訂單消息按地區(qū)拆分,Binding Key = "order.#.beijing"僅接收北京地區(qū)的訂單消息。
工作流程示例:
1. 聲明Topic交換機(名稱:topic_exchange);
2. 隊列A綁定Binding Key = "user.create.*",隊列B綁定Binding Key = "user.#",隊列C綁定Binding Key = "user.*.alipay";
3. 生產(chǎn)者發(fā)送消息,指定Routing Key = "user.create.wechat";
4. 交換機匹配后,將消息路由到隊列A(*匹配“wechat”)和隊列B(#匹配“create.wechat”),隊列C不匹配無消息。
3.4 Headers Exchange(頭部交換機):按消息頭匹配,忽略Routing Key
Headers交換機通過消息的頭部屬性(而非Routing Key)進行匹配,靈活性較高,但路由邏輯復雜,性能略差,實際應用中較少使用。核心邏輯是:生產(chǎn)者發(fā)送消息時設置消息頭(如“type=order”“priority=high”),交換機根據(jù)綁定隊列時指定的頭部規(guī)則(如“匹配所有頭”“匹配任意頭”)路由消息。
適用場景:需根據(jù)多維度屬性路由消息,且不希望依賴Routing Key的特殊場景(如復雜的權限控制消息)。
四、高級特性:保障消息可靠傳輸與系統(tǒng)穩(wěn)定
在企業(yè)級應用中,“消息不丟失、處理不重復、系統(tǒng)抗故障”是核心訴求。RabbitMQ提供了一系列高級特性,保障消息傳輸?shù)目煽啃院拖到y(tǒng)的穩(wěn)定性。
4.1 消息可靠性保障:持久化+確認機制
要確保消息不丟失,需同時開啟“持久化三件套”和“雙重確認機制”,形成全鏈路可靠保障。
1. 持久化三件套
持久化的核心是將數(shù)據(jù)寫入硬盤,避免服務器重啟后數(shù)據(jù)丟失。需同時配置以下三點:
- 交換機持久化:聲明交換機時設置
durable=true,重啟后交換機仍存在。 - 隊列持久化:聲明隊列時設置
durable=true,重啟后隊列仍存在(但隊列中的消息需額外配置持久化)。 - 消息持久化:發(fā)送消息時設置
delivery_mode=2(AMQP協(xié)議規(guī)定),消息會被寫入硬盤。
注意:三件套缺一不可!例如僅持久化隊列而未持久化消息,重啟后隊列存在但消息丟失。
2. 雙重確認機制
通過“生產(chǎn)者確認”和“消費者確認”,確保消息從發(fā)送到處理的全鏈路可靠。
- 生產(chǎn)者確認(Publisher Confirm):生產(chǎn)者發(fā)送消息后,RabbitMQ會通過信道返回ACK(消息已接收并持久化)或NACK(消息接收失?。Ia(chǎn)者可通過監(jiān)聽確認信號,實現(xiàn)失敗重試或日志記錄。 示例邏輯:開啟確認模式后,發(fā)送消息時添加確認監(jiān)聽器,若收到NACK則間隔1秒重試,重試3次失敗后記錄到錯誤日志。
- 消費者確認(Consumer Ack):消費者處理消息后需顯式發(fā)送ACK信號,RabbitMQ收到后才刪除消息;若未發(fā)送ACK(如消費者宕機),消息會重新入隊;若處理失敗,可發(fā)送NACK并指定是否重新入隊。 注意:避免使用自動ACK(AutoAck=true),否則消費者拿到消息后立即確認,若后續(xù)處理失敗,消息已被刪除,導致數(shù)據(jù)丟失。
4.2 死信隊列(DLX):處理異常消息,避免隊列阻塞
死信隊列(Dead Letter Exchange)是專門處理“異常消息”的隊列,當消息滿足以下條件時,會被標記為“死信”并路由到死信隊列:
- 消息被消費者拒絕(basicReject/basicNack)且未設置重新入隊(requeue=false);
- 消息在隊列中存活時間超過TTL(消息超時時間);
- 隊列達到最大長度,新消息無法入隊。
死信隊列配置步驟:
- 聲明死信交換機(如dlx-exchange,類型可任意,常用Direct);
- 聲明死信隊列(如dlx-queue),并綁定到死信交換機;
- 給正常隊列設置死信參數(shù):
- x-dead-letter-exchange:死信交換機名稱;
- x-dead-letter-routing-key:死信路由鍵;
- x-message-ttl:消息超時時間(如30分鐘,單位毫秒)。
適用場景:
電商訂單30分鐘未支付自動取消、物流軌跡超時未更新告警、異常消息人工復盤等。
4.3 延遲隊列:實現(xiàn)定時任務
RabbitMQ本身不直接支持延遲隊列,但可通過“TTL+死信隊列”間接實現(xiàn):給消息設置TTL,到期后成為死信,自動路由到死信隊列,消費者監(jiān)聽死信隊列即可實現(xiàn)定時任務。
典型場景:
- 訂單30分鐘未支付自動取消;
- 用戶注冊后24小時未登錄發(fā)送召回通知;
- 物流包裹超時未簽收觸發(fā)客服跟進。
4.4 鏡像隊列與集群:高可用保障
單節(jié)點RabbitMQ存在單點故障風險,企業(yè)級部署需構建集群并配置鏡像隊列,確保節(jié)點宕機后服務不中斷。
1. 鏡像隊列
將隊列數(shù)據(jù)同步到多個節(jié)點(副本),主節(jié)點處理消息,從節(jié)點實時同步數(shù)據(jù)。當主節(jié)點宕機,從節(jié)點自動升級為主節(jié)點,繼續(xù)提供服務。
核心配置(通過CLI命令):
# 給所有order開頭的隊列配置鏡像隊列,復制到所有節(jié)點,自動同步
rabbitmqctl set_policy ha-all "^order-" '{"ha-mode":"all","ha-sync-mode":"automatic"}'2. 分布式集群
多節(jié)點組成邏輯集群,通過Erlang分布式協(xié)議同步元數(shù)據(jù)(隊列、綁定關系等),結合負載均衡分攤消息處理壓力。在K8s環(huán)境中,可通過RabbitMQ Operator實現(xiàn)集群自動擴縮容和故障轉移。
4.5 流量控制:避免消費者過載
當生產(chǎn)者發(fā)送消息速度超過消費者處理速度時,會導致隊列積壓。RabbitMQ通過以下機制實現(xiàn)流量控制:
- basicQos限流:消費者通過
basicQos(prefetchCount=N)設置每次預取的消息數(shù)量,即消費者同時處理N條消息,處理完并確認后再獲取下一批,避免同時處理過多消息導致過載。 - 背壓機制:當隊列積壓過多或消費者處理過慢時,RabbitMQ會暫停向消費者發(fā)送新消息,直至消費者確認部分消息,緩解消費者壓力。
五、實戰(zhàn)演練:從部署到核心場景落地
理論學習后,通過實戰(zhàn)演練可快速掌握RabbitMQ的使用。以下從“環(huán)境部署”“核心場景實現(xiàn)”“運維監(jiān)控”三個維度展開。
5.1 快速部署RabbitMQ(Docker方式)
Docker部署簡單高效,適合開發(fā)和測試環(huán)境,步驟如下:
# 1. 拉取RabbitMQ鏡像(帶管理界面)
docker pull rabbitmq:3-management
# 2. 啟動容器,映射端口(5672:AMQP協(xié)議端口;15672:管理界面端口)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
# 3. 訪問管理界面
打開瀏覽器,輸入 http://服務器IP:15672,默認用戶名/密碼:guest/guest(生產(chǎn)環(huán)境需修改)
5.2 生產(chǎn)環(huán)境部署(Linux+集群)
生產(chǎn)環(huán)境需考慮安全性和高可用性,關鍵步驟如下:
# 1. 安裝RabbitMQ(CentOS示例)
yum install -y rabbitmq-server
# 2. 啟動服務并設置開機自啟
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
# 3. 啟用管理插件和監(jiān)控插件
rabbitmq-plugins enable rabbitmq_management rabbitmq_prometheus
# 4. 創(chuàng)建管理員用戶(替換為自己的用戶名和密碼)
rabbitmqctl add_user admin YourSecurePassword
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
# 5. 配置集群(多節(jié)點步驟,以2個節(jié)點為例)
# 節(jié)點1執(zhí)行:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
# 節(jié)點2執(zhí)行(加入節(jié)點1集群,替換為節(jié)點1IP)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@節(jié)點1IP
rabbitmqctl start_app
# 6. 配置鏡像隊列策略
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
5.3 核心業(yè)務場景實現(xiàn):電商訂單處理
以電商訂單系統(tǒng)為例,實現(xiàn)“訂單創(chuàng)建后異步觸發(fā)庫存扣減、積分發(fā)放、物流通知”的全鏈路流程,核心架構如下:
訂單服務(生產(chǎn)者)→ Topic交換機 → 多個業(yè)務隊列(庫存、積分、物流)→ 對應服務(消費者)
實現(xiàn)步驟:
- 聲明交換機和隊列:
- 交換機:topic_exchange_order(Topic類型,持久化);
- 隊列:queue_stock(庫存扣減,綁定鍵order.create)、queue_point(積分發(fā)放,綁定鍵order.#)、queue_logistics(物流通知,綁定鍵order.create);
- 所有隊列和交換機均配置持久化。
- 生產(chǎn)者發(fā)送消息: 訂單創(chuàng)建成功后,訂單服務發(fā)送消息,指定Routing Key = "order.create",消息體包含訂單ID、用戶ID、商品ID等信息,設置消息持久化(delivery_mode=2),并開啟生產(chǎn)者確認。
- 消費者處理消息:
- 庫存服務:監(jiān)聽queue_stock,獲取消息后扣減對應商品庫存,處理完成后發(fā)送ACK;
- 積分服務:監(jiān)聽queue_point,獲取消息后給用戶發(fā)放訂單積分,支持冪等性(通過訂單ID去重,避免重復發(fā)放);
- 物流服務:監(jiān)聽queue_logistics,獲取消息后生成物流單并通知用戶,處理失敗則發(fā)送NACK,消息進入死信隊列。
- 配置監(jiān)控告警: 通過Prometheus+Grafana監(jiān)控隊列長度、消息吞吐量,設置隊列積壓超過1000條時觸發(fā)告警。
核心優(yōu)勢:
服務間解耦,新增“優(yōu)惠券發(fā)放”業(yè)務時,只需新增隊列并綁定到交換機,無需修改訂單服務代碼;單個服務故障不影響其他服務,系統(tǒng)容錯性提升。
5.4 運維監(jiān)控與問題排查
生產(chǎn)環(huán)境中,RabbitMQ的運維監(jiān)控核心是“實時掌握系統(tǒng)狀態(tài)、快速定位問題”。
1. 核心監(jiān)控指標
- 隊列指標:隊列長度(消息積壓數(shù))、消息入隊/出隊速率;
- 節(jié)點指標:CPU使用率、內(nèi)存使用率、磁盤空間(持久化消息占用);
- 連接指標:活躍連接數(shù)、信道數(shù)、異常連接數(shù);
- 消息指標:未確認消息數(shù)、死信消息數(shù)、消息丟失數(shù)。
2. 監(jiān)控工具
- Web管理界面:直觀查看隊列、交換機、用戶等信息,支持手動操作消息;
- Prometheus+Grafana:采集監(jiān)控指標,生成可視化面板,支持自定義告警;
- CLI命令行:常用命令如下:
# 查看隊列狀態(tài)(名稱、就緒消息數(shù)、消費者數(shù))
rabbitmqctl list_queues name messages_ready consumers
# 查看消息速率
rabbitmqctl status | grep -A 10 "message_stats"
# 查看活躍連接
rabbitmqctl list_connections
# 查看消費者狀態(tài)
rabbitmqctl list_consumers
# 手動刪除死信隊列
rabbitmqctl delete_queue dlx-queue
3. 常見問題排查
- 消息丟失:檢查是否開啟持久化三件套、生產(chǎn)者/消費者確認是否正常;查看磁盤空間是否充足(磁盤滿會導致持久化失?。?。
- 隊列積壓:檢查消費者是否正常運行、處理速度是否過慢;通過basicQos調(diào)整預取數(shù),或增加消費者實例數(shù)。
- 節(jié)點宕機:確認集群和鏡像隊列配置是否正常;查看節(jié)點日志(/var/log/rabbitmq/)定位宕機原因(如內(nèi)存溢出、網(wǎng)絡故障)。
- 重復消費:消費者需實現(xiàn)冪等性(如通過消息ID去重、數(shù)據(jù)庫唯一索引),避免重復處理影響業(yè)務。
六、總結與進階學習
RabbitMQ作為一款成熟的消息中間件,其核心價值在于“解耦、削峰、異步”,通過靈活的路由機制和完善的可靠性保障,成為企業(yè)級分布式系統(tǒng)的核心組件。本文從基礎認知、核心架構、交換機類型、高級特性到實戰(zhàn)部署,逐步深入解析了RabbitMQ的關鍵知識點,覆蓋了從入門到實戰(zhàn)的全流程。
進階學習方向:
- 深入學習AMQP協(xié)議細節(jié),理解消息傳輸?shù)牡讓釉恚?/li>
- 探索RabbitMQ Streams(流隊列),適用于大數(shù)據(jù)實時處理場景;
- 結合Spring AMQP、RabbitTemplate等框架,實現(xiàn)更優(yōu)雅的開發(fā);
- 學習RabbitMQ在云原生環(huán)境(K8s)的部署與運維最佳實踐。
最后,實踐是掌握RabbitMQ的關鍵。建議結合本文的實戰(zhàn)場景,親手搭建環(huán)境、編寫代碼,在實際應用中積累經(jīng)驗,才能真正玩轉這款強大的消息中間件。
到此這篇關于從入門到精通:RabbitMQ全面解析與實戰(zhàn)指南的文章就介紹到這了,更多相關RabbitMQ實戰(zhàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Maven的pom.xml中設置repository不起作用問題
這篇文章主要介紹了解決Maven的pom.xml中設置repository不起作用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
java對list<Object>進行手動分頁實現(xiàn)
本文主要介紹了java對list<Object>進行手動分頁實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07

