【Day 50 】Linux-nginx反向代理與負載均衡

概述

????????在現代 Web 架構中,Nginx 作為高并發、高性能的 HTTP 和反向代理服務器,被廣泛應用于提升服務性能、增強系統安全性和實現負載均衡。其中,反向代理能夠隱藏后端服務器信息并優化請求處理流程,負載均衡則可將請求分發到多個后端節點,大幅提升系統并發能力。

一、反向代理(proxy 模塊)

1. 作用

  • 性能優化:增加業務并發量。Nginx 可緩存靜態資源,減少后端服務器處理壓力,提升響應速度;同時通過連接復用,提高并發處理能力。
  • 提高業務安全性:隱藏后端業務服務器的真實 IP 和端口信息,避免直接暴露在公網中,降低被攻擊風險,
  • 功能擴展:可實現請求過濾、URL 重寫、SSL 終結等功能,簡化后端服務器的配置復雜度。

2. 核心配置語法

反向代理的核心是通過location 塊配合proxy_pass?指令,將特定請求轉發至后端服務器。

location URI {proxy_pass 后端服務器地址; 
}
  • URI:匹配路徑:指定需要代理的客戶端請求路徑(如/mp3、/download);

  • proxy_pass 后端服務器地址;?指定請求轉發的后端服務器地址(可包含 IP、端口及路徑)

  • 后端服務器地址:實際訪問地址

明確目標:代理服務器正確轉發 + 后端服務器正確響應

(1)路徑拼接規則

????????Nginx 會自動將location中的匹配路徑與proxy_pass的后端地址拼接,拼接方式取決于后端地址是否以斜杠結尾:

  • 若后端地址無斜杠(如http://192.168.140.11/music),客戶端請求路徑會直接拼接在后端路徑后;
  • 若后端地址有斜杠(如http://192.168.140.11/music/),客戶端請求路徑會替換location的匹配路徑后拼接。
  • location /test1 {

    ? ? ? ? proxy_pass http://aa.linux.com;? ?//nginx的反向代理,hosts文件需要加上dns解析

    }

    192.168.140.10/music? ? //?192.168.140.10的網頁目錄(/var/www/html)下的music文件

    192.168.140.10:8088/music? ?//若nginx換端口? ?

(2)不同場景下的配置示例

    場景 1:帶 URI 的精確匹配轉發
    當訪問 Nginx 的任意路徑時,代理到后端服務器的/music3 路徑:

    location / {proxy_pass http://192.168.140.20/music3;
    }
    # 說明:當客戶端訪問 Nginx 服務器的任意路徑(例如http://你的Nginx地址/xxx)時,
    # Nginx 會將該請求轉發到 http://192.168.140.20/music3 對應的服務,
    # 并將后端服務的響應返回給客戶端。

    場景 2:不帶 URI 的路徑轉發
    當后端服務器沒有特定 URI 時,Nginx 會將?location?中的 URI 拼接到后端地址:

    location /test {proxy_pass http://192.168.140.10;
    }
    # 說明:此時請求http://nginx-ip/test/xyz會被轉發為http://192.168.140.10:9000/test/xyz
    

    場景 3:正則表達式匹配的特殊規則
    當 location 使用正則表達式(~~*)匹配請求時,proxy_pass后的后端地址不允許包含任何 URI,否則會報錯:

    # 正確配置(無URI)
    location ~ /music {proxy_pass http://192.168.140.10;
    }# 錯誤配置(包含URI,會導致Nginx啟動失敗)
    # location ~ /music {
    #     proxy_pass http://192.168.140.10/project;  # 此處錯誤
    # }
    

    3. 后端服務器記錄客戶端真實 IP

    默認情況下,后端服務器會將 Nginx 的 IP 識別為客戶端 IP,如需記錄真實客戶端 IP,需通過以下配置實現:

    (1)Nginx 反向代理添加標識字段

    在代理規則中添加X-REAL-IPX-Forwarded-For字段,傳遞客戶端真實 IP:

    location /mp3 {proxy_pass http://192.168.140.11/music;# 傳遞客戶端真實IP給后端proxy_set_header X-REAL-IP $remote_addr;# 若后端為多代理架構,使用X-Forwarded-For記錄代理鏈proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    (2)
    ① 后端為 Apache(httpd)時的配置

    修改 Apache 的日志格式,使其解析X-REAL-IP字段:

    # 在httpd.conf中修改combined日志格式
    LogFormat "%{X-REAL-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    
    ② 后端為 Nginx 時的配置

    修改后端 Nginx 的日志格式,使用$http_x_forwarded_for獲取真實 IP:

    # 在后端Nginx的main日志格式中添加
    log_format main '$http_x_forwarded_for [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';

    二、負載均衡(upstream 模塊)

    ????????Nginx 的?upstream 模塊是用于管理后端服務器集群的核心組件,通過它可以實現對多臺后端服務器的統一調度、狀態監控和故障處理。

    1、 作用

    • 提升并發能力:將客戶端請求分發到多個后端服務器,避免單節點壓力過大,提高系統整體吞吐量。
    • 增強可用性:通過健康檢查自動剔除故障節點,確保服務持續可用;同時支持備用節點,進一步提升可靠性。
    • 靈活擴展:可根據業務需求動態增減后端節點,實現無縫擴容。

    2、工作流程

    (以 Nginx 為負載均衡器為例)

    1. 定義后端服務器組:通過upstream塊定義一組后端服務器(如192.168.1.10:8080、192.168.1.11:8080),并配置調度算法和節點參數。
    2. 接收客戶端請求:客戶端請求首先到達 Nginx 負載均衡器(通常是前端入口服務器)。
    3. 選擇后端節點:Nginx 根據upstream中配置的調度算法(如輪詢、IP 哈希等),從服務器組中選擇一臺 “合適” 的后端服務器。
    4. 轉發請求并返回響應:Nginx 將客戶端請求轉發到選中的后端服務器,后端處理后將響應返回給 Nginx,再由 Nginx 返回給客戶端。

    3、 調度算法 / 策略

    Nginx 提供多種負載均衡算法,可根據業務場景選擇:

    ① rr(Round Robin,輪詢)

    upstream app_servers {server 192.168.140.10:9000 weight=3;  # 權重3,接收3/5的請求server 192.168.140.11:9000 weight=2;  # 權重2,接收2/5的請求
    }
    
    • 默認算法,請求按順序輪流分配到后端節點。
    • 支持通過 weight 設置權重(權重越高,分配的請求越多),適用于后端節點性能不均的場景。
    • 會話持久問題(見補充)

    ② sh(Source Hash,源哈希)

    upstream app_servers {ip_hash;  # 啟用源哈希算法server 192.168.140.10:9000;server 192.168.140.11:9000;
    }
    
    • 根據客戶端 IP 計算哈希值,將同一客戶端的請求固定分配到同一后端節點。
    • 適用于需要會話保持的場景(如未使用分布式會話的系統)。

    ③ lc(Least Connections,最少連接)

    upstream app_servers {least_conn;  # 啟用最少連接算法server 192.168.140.10:9000;server 192.168.140.11:9000;
    }
    
    • 優先將請求分配到當前連接數最少的后端節點,適用于請求處理時間差異較大的場景。

    4、健康狀態檢查與故障隔離

    自動檢測后端服務器的可用性,對故障節點進行隔離,避免請求轉發到不可用的服務器,保障服務穩定性。

    5、配置語法與示例

    # 定義后端服務器組
    upstream 服務器組名稱 {[調度算法];  # 可選,默認rrserver IP:port [參數];  # 后端節點及可選參數server IP:port [參數];
    }# 引用服務器組
    location URI {proxy_pass http://服務器組名稱;
    }
    
    常用參數說明
    • weight=數值:設置節點權重(默認 1),數值越大優先級越高。
    • max_fails=次數:允許請求失敗的最大次數(默認 1),超過則標記節點為不可用。
    • fail_timeout=秒數:標記節點不可用的時間(默認 10 秒),超時后會重新檢測節點。
    • backup:標記為備用節點,僅當所有非備用節點不可用時才接收請求。
    • down:標記節點為永久不可用(手動下線時使用)。
    完整配置示例
    # 定義Java應用服務器組(使用輪詢算法)
    upstream java_servers {server 192.168.140.10:9000 weight=1 max_fails=2 fail_timeout=3s;  # 權重1,失敗2次后3秒內不分配server 192.168.140.10:9001 weight=1 max_fails=2 fail_timeout=3s;server 127.0.0.1:8000 backup;  # 備用節點,主節點全故障時啟用
    }# 轉發所有根路徑請求到java_servers
    location / {proxy_pass http://java_servers/project/;proxy_set_header X-REAL-IP $remote_addr;  # 傳遞真實客戶端IPproxy_set_header Host $host;  # 傳遞原始請求的Host頭
    }# 轉發/music路徑請求到java_servers的/music目錄
    location /mp3 {proxy_pass http://java_servers/music/;proxy_set_header X-REAL-IP $remote_addr;
    }# 備用節點的本地服務配置(當主節點故障時提供降級頁面)
    server {listen 8000;server_name localhost;location / {root /usr/share/nginx/sorry;  # 存放降級頁面的目錄index index.html;  # 降級頁面}
    }

    演示:

    環境準備

    假設有 3 臺機器,IP 分別為:

    • 負載均衡器(Nginx)192.168.140.20(接收客戶端請求,分發到后端)

    • 后端服務器 1(nginx)192.168.140.10

    • 后端服務器 2(httpd)192.168.140.30

    步驟 1:配置后端服務器(10?和 30)

    在 10 和 30 上安裝 Nginx/httpd(模擬 Web 服務)

    創建測試頁面(區分兩臺服務器,方便驗證負載均衡效果)

    • echo "This is backend server 10 " ?> /usr/local/nginx/html/index.html?? ? //在 10?上執行
    • echo "This is backend server 30" > /usr/share/nginx/html/index.html? ?? //在 30?上執行

    驗證后端服務

    ????????分別訪問 http://192.168.140.10 和 http://192.168.140.30,?應顯示各自的測試內容。

    步驟 2:配置負載均衡器(100)

    ????????在負載均衡器上安裝 Nginx,并通過 upstream 模塊定義后端服務器集群,實現請求分發。

    安裝 Nginx:

    ????????修改 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),在http塊中添加 upstream(后端集群)和server(負載均衡規則):

    http {# ... 其他默認配置(保留不動)# 1. 定義后端服務器集群(包含101和102)upstream backend_servers {# 調度算法:默認輪詢(可按需改為weight、ip_hash等)server 192.168.1.101:80;  # 后端服務器1server 192.168.1.102:80;  # 后端服務器2server 127.0.0.1:8000 backup;  # 備用節點,主節點全故障時啟用# 可選:添加健康檢查參數(自動剔除故障節點)# max_fails=2:允許2次請求失敗# fail_timeout=10s:失敗后隔離10秒# server 192.168.1.101:80 max_fails=2 fail_timeout=10s;}# 2. 配置負載均衡入口(接收客戶端請求)server {listen 80;  # 監聽80端口(客戶端訪問的端口)server_name 192.168.1.100;  # 負載均衡器的IP# 所有請求轉發到后端集群location / {proxy_pass http://backend_servers;  # 轉發到upstream定義的集群proxy_set_header Host $host;  # 傳遞客戶端訪問的Host(如192.168.1.100)proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;  # 傳遞協議(http/https)}}server {listen 8000;  # 備用服務端口server_name 127.0.0.1;location / {root /usr/local/nginx/backup_html;  # 備用服務的網頁目錄index index.html;}}
    }
    

    # 創建備用服務的測試頁面:
    mkdir -p /usr/local/nginx/backup_html
    # 寫入備用內容(如“主節點故障,已切換至備用服務”)
    echo "This is backup server (local 8000)" > /usr/local/nginx/backup_html/index.html

    //?加權輪詢:若后端服務器性能不同,可通過weight分配請求比例(值越高,接收請求越多):

    upstream backend_servers {server 192.168.1.101:80 weight=3;  # 承擔3/5的請求server 192.168.1.102:80 weight=2;  # 承擔2/5的請求
    }
    

    // 若需同一客戶端請求固定到同一后端(如未做會話共享),使用ip_hash:

    upstream backend_servers {ip_hash;  # 基于客戶端IP哈希server 192.168.1.101:80;server 192.168.1.102:80;
    }

    檢查配置并重啟 Nginx

    步驟 3:修改httpd/nginx配置文件

    • vim /etc/httpd/conf/httpd.conf?
    • vim /usr/local/nginx/conf/nginx.conf

    步驟 4:測試負載均衡效果

    通過客戶端訪問負載均衡器的 IP(192.168.140.20),驗證請求是否被分發到兩臺后端服務器。

    1、多次訪問測試:
    在瀏覽器或終端多次訪問?http://192.168.140.20,應交替顯示:

    • This is backend server 10

    • This is backend server 30

    • (默認輪詢算法下,請求會依次分發到 10 和 30)。

    2、模擬故障測試:

    • 停止后端10 的 Nginx(systemctl stop nginx),再次訪問?http://192.168.140.20,應始終顯示 30 的內容(Nginx 會自動剔除故障節點)。
    • 停止后端10 和20的,再次訪問?http://192.168.140.20,應始終顯示備用節點

    特殊的:如果負載均衡如此設置

    • echo "This is backend server 10/ab " ?> /usr/local/nginx/html/ab/index.html?
    • echo "This is backend server 30/ab" > /var/www/html/ab/index.html?

    此時搜索192.168.140.20依次顯示This is backend server 10/ab、This is backend server 20/ab


    一、什么是會話?

    ????????在計算機網絡和 Web 開發中,會話(Session) 指的是用戶與系統(通常是服務器)之間的一次連續交互過程,核心作用是記錄用戶的狀態信息,解決 HTTP 協議 “無狀態” 的問題。

    二、為什么需要會話?

    ????????HTTP 協議本身是 “無狀態” 的:每次客戶端(如瀏覽器)向服務器發送請求時,服務器無法默認記住 “這個請求來自哪個用戶”“用戶之前做過什么操作”。例如:

    • 你在電商網站登錄后,瀏覽商品、加入購物車,如果沒有會話,服務器會 “忘記” 你已登錄,也記不住你的購物車內容;
    • 你在論壇發帖時,服務器需要知道 “你是誰” 才能關聯到你的賬號。

    ????????會話的出現,就是為了讓服務器 “記住” 用戶的狀態(如登錄信息、操作歷史、偏好設置等),讓交互更連貫。

    ????????會話的核心邏輯:會話的實現依賴 “會話標識(Session ID)”,流程大致如下:

    • 創建會話:用戶第一次訪問服務器時,服務器生成一個唯一的 Session ID(如一串隨機字符串),并創建一個對應的 “會話空間”(存儲用戶狀態,如登錄狀態、購物車數據等);
    • 傳遞標識:服務器將 Session ID 通過Cookie(主流方式)或 URL 參數返回給客戶端,客戶端后續請求時會自動攜帶這個 ID;
    • 識別用戶:服務器收到請求后,通過 Session ID 找到對應的 “會話空間”,從而識別用戶身份和狀態,繼續處理請求(如確認 “已登錄”、讀取購物車內容);
    • 銷毀會話:當用戶主動退出(點擊 “退出登錄”)或會話超時(如 30 分鐘未操作),服務器會刪除對應的會話數據,Session ID 失效。

    二、什么是 “會話持久問題”?

    ????????在負載均衡(多后端服務器)環境中,用戶的請求會被分發到不同的服務器。但默認情況下,用戶的會話信息(如登錄狀態、臨時數據)是存儲在單個服務器的本地內存 / 文件中的。這會導致一個問題:

    • 用戶第一次請求被分到服務器 A,登錄狀態保存在 A 的本地;
    • 第二次請求被負載均衡器分到服務器 B,B 沒有用戶的登錄狀態,用戶需要重新登錄。

    這種 “用戶狀態無法在多服務器間共享” 的問題,就是會話持久問題。

    三、如何解決?—— 會話共享

    ????????核心思路:將用戶的會話信息從 “單服務器本地存儲” 遷移到 “所有服務器都能訪問的集中式存儲”,讓所有后端服務器都能讀取到相同的會話數據。

    NoSQL 數據庫非關系型數據庫(如 Redis、MongoDB、memached)實現會話共享。

    • 高性能:NoSQL(尤其是 Redis)支持內存存儲,讀寫速度極快,適合會話這種高頻訪問的數據;(對內存要求高)
    • 鍵值結構適配:會話數據通常是 “會話 ID→用戶信息” 的鍵值對形式,與 NoSQL 的存儲模型天然匹配;
    • 支持過期時間:可直接為會話數據設置過期時間(如 2 小時),自動清理無效會話,無需手動維護;
    • 高可用:NoSQL 可通過集群部署(如 Redis 主從、哨兵)避免單點故障,確保會話數據不丟失。

    四、基于 NoSQL 的會話共享流程

    以最常用的 Redis 為例,完整流程如下:

    用戶首次登錄:

    • 用戶在瀏覽器輸入賬號密碼,請求被負載均衡器分發到某臺后端服務器(如服務器 A);
    • 服務器 A 驗證通過后,生成一個唯一的會話 ID(如session_id=xxxx);
    • 將用戶的會話數據(如用戶 ID、登錄時間、權限等)以session_id為鍵,存儲到 Redis 中(例如:SET session:xxxx "{user_id:100, status:login}" EX 7200,設置 2 小時過期);
    • 服務器 A 將session_id通過 Cookie 或 URL 參數返回給客戶端(瀏覽器),客戶端后續請求會自動攜帶該session_id。

    用戶后續請求:

    • 客戶端攜帶 session_id 發送請求,被負載均衡器分發到任意服務器(如服務器 B);
    • 服務器 B 收到請求后,從 Redis 中通過session_id查詢會話數據(GET session:xxxx);
    • 若查詢到有效數據,說明用戶已登錄,直接返回請求結果;若未查詢到(過期或無效),則要求用戶重新登錄。

    會話過期 / 注銷:

    • 若用戶主動退出登錄,服務器刪除 Redis 中對應的session_id數據;
    • 若用戶長時間未操作,Redis 會自動根據預設的過期時間刪除會話數據,實現 “自動登出”。

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

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

    相關文章

    vue中配置 ts

    在 Vue 項目中配置 TypeScript(TS)可以提升代碼的類型安全性和開發體驗。以下是在 Vue 項目(基于 Vite)中配置 TypeScript 的詳細步驟和關鍵配置: 一、創建支持 TypeScript 的 Vue 項目 如果是新建項目,推…

    阿里云鏡像地址獲取,并安裝 docker的mysql和nginx等服務,java,python,ffmpeg,go等環境

    阿里云那個鏡像地址獲取 阿里云鏡像加速器不是一個通用的 registry.cn-hangzhou.aliyuncs.com,而是你賬號專屬的,比如這樣: https://abcd1234.mirror.aliyuncs.com👉 登錄阿里云控制臺獲取: 阿里云鏡像加速器 然后替…

    conda環境導出

    1. 激活你想要打包的環境首先,確保你激活了你要打包的 conda 環境:conda activate qwen2. 導出環境配置使用 conda 命令將當前環境的配置導出為一個 .yml 文件,記錄下環境中所有的依賴和版本:conda list --export > techgpt_en…

    openEuler2403安裝部署Kafka

    文章目錄 openEuler2403安裝部署Kafka with KRaft一、前言1.簡介2.架構3.環境 二、正文1.部署服務器2.基礎環境1)JDK 安裝部署2)關閉防火墻 3.單機部署1)下載軟件包2)修改配置文件3)格式化存儲目錄4)單機啟…

    發布工業智能體,云從科技打造制造業AI“運營大腦”

    近日,在2025世界智能產業博覽會重慶市工業智能體首發儀式現場,云從科技重磅發布經營決策-產線運營智能體,為制造業的智能化轉型提供了全新的解決方案。該智能體的亮相,不僅代表著人工智能技術在工業領域的深度應用,更標…

    【Linux基礎】parted命令詳解:從入門到精通的磁盤分區管理完全指南

    目錄 前言 1 parted命令概述 1.1 什么是parted 1.2 parted與fdisk的對比 1.3 parted的主要優勢 2 parted命令的安裝與基本語法 2.1 在不同Linux發行版中安裝parted 2.2 parted的基本語法 2.3 parted的工作模式 3 parted交互式命令詳解 3.1 交互式操作流程 3.2 主要…

    如何在路由器上配置DHCP服務器?

    在路由器上配置DHCP服務器的步驟因品牌(如TP-Link、華為、小米、華碩等)略有差異,但核心流程一致,主要包括登錄管理界面、開啟DHCP功能、設置IP地址池及相關參數。以下是通用操作指南: 一、準備工作 確保電腦/手機已連…

    HTML和CSS學習

    HTML學習 注釋 <!-- -->組成 告訴瀏覽器我是html文件<!DOCTYPE html> <title>瀏覽器標簽</title> <body> <!--- 其中是主要內容 ---> <p> 段落 </p> </body> </html> (結束點…

    OpenTenBase vs MySQL vs Oracle,企業級應用數據庫實盤對比分析

    摘要 因為工作久了的緣故&#xff0c;接觸過不少數據庫。公司的管理系統用的MySQL&#xff0c;財務系統用的Oracle。隨著時代發展&#xff0c;國產開源數據庫已經在性能上能與這些國際知名頂尖數據庫品牌相媲美&#xff0c;其中OpenTenBase以其開放環境和優越性能脫穎而出&…

    Oracle 備份與恢復常見的七大問題

    為了最大限度保障數據的安全性&#xff0c;同時能在不可預計災難的情況下保證數據的快速恢復&#xff0c;需要根據數據的類型和重要程度制定相應的備份和恢復方案。在這個過程中&#xff0c;DBA的職責就是要保證數據庫&#xff08;其它數據由其它崗位負責&#xff09;的高可用和…

    StringBuilder類的數據結構和擴容方式解讀

    目錄 StringBuilder是什么 核心特性&#xff1a; StringBuilder數據結構 1. 核心存儲結構&#xff08;基于父類 AbstractStringBuilder&#xff09; 2. 類定義與繼承關系 3. 數據結構的核心特點 StringBuilder數據結構的初始化方式 1. 無參構造&#xff1a;默認初始容量…

    LangChain實戰(十七):構建與PDF/PPT文檔對話的AI助手

    本文是《LangChain實戰課》系列的第十七篇,將專篇深入講解如何構建能夠與PDF和PPT文檔進行智能對話的AI助手。通過學習本文,您將掌握復雜格式文檔的解析技巧、文本與表格處理技術,以及實現精準問答的系統方法。 前言 在日常工作和學習中,PDF和PPT文檔是我們最常接觸的文檔…

    魚眼相機模型

    魚眼相機模型 最近涉及魚眼相機模型、標定使用等&#xff0c;作為記錄&#xff0c;更新很久不曾更新的博客。 文章目錄魚眼相機模型1 相機成像2 魚眼模型3 畸變3.1 適用針孔和MEI3.2 Kannala-Brandt魚眼模型4 代碼實現1 相機成像 針孔相機&#xff1a;所有光線從一個孔&#xf…

    大語言模型提示詞工程詳盡實戰指南

    引言&#xff1a;與大型語言模型&#xff08;LLM&#xff09;高效對話的藝術大型語言模型&#xff08;LLM&#xff09;——例如我們熟知的GPT系列、Claude、Llama等——在自然語言處理&#xff08;NLP&#xff09;領域展現了驚人的能力&#xff0c;能夠執行文本摘要、翻譯、代碼…

    HTTP 請求體格式詳解

    1. 概覽與概念 Content-Type&#xff1a;HTTP 請求/響應頭&#xff0c;表示消息體的媒體類型&#xff08;MIME type&#xff09;。服務端用它決定如何解析請求體。常見場景&#xff1a; 純結構化數據&#xff08;JSON&#xff09; → application/json表單 文件上傳 → multip…

    事務設置和消息分發

    事務 RabbitMQ是基于AMQP協議實現的&#xff0c;該協議實現了事務機制&#xff0c;因此RabbitMQ也支持事務機制. SpringAMQP也提供了對事務相關的操作&#xff0c;RabbitMQ事務允許開發者確保消息的發送和接收是原子性的&#xff0c;要么 全部成功&#xff0c;要么全部失敗.| 前…

    Python 中 try / except / else / finally 異常處理詳解

    1. 基本結構 try:# 可能會拋出異常的代碼 except SomeException as e:# 捕獲并處理異常 else:# 如果 try 中代碼沒有異常&#xff0c;就執行這里 finally:# 無論是否發生異常&#xff0c;最后都會執行這里2. 各部分的作用 try 用途&#xff1a;包含可能發生異常的代碼段。如果代…

    冰火島 Tech 傳:Apple Foundation Models 心法解密(下集)

    引子 上集說到冰火島冰屋內,謝遜、張翠山、殷素素三人親見 “指令(Instructions)” 如何讓 AI 脫胎換骨,從木訥報地名的 “愣頭青”,變身為文采斐然的 “旅行作家”。 正當素素驚嘆這 AI 武學的奇妙時,謝遜卻突然神色一凜,指著手腕上用冰屑刻的 “4096” 字樣道:“這等…

    Qt信號與槽機制全面解析

    ? 1. 核心概念信號與槽是Qt獨創的一種對象間通信機制&#xff0c;它使得一個對象的狀態變化或事件發生能夠自動通知其他對象作出響應&#xff0c;從而實現高度解耦的代碼設計。1.1 信號&#xff08;Signals&#xff09;定義&#xff1a;信號是由對象在特定事件發生時發出&…

    2025年COR SCI2區,基于近似細胞分解的能源高效無人機路徑規劃問題用于地質災害監測,深度解析+性能實測

    目錄1.摘要2.問題描述與數學模型3.能源網格混合元啟發式算法4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 本文提出了一種能源高效的無人機路徑規劃方法&#xff08;EURP&#xff09;用于監測分散的地質災害易發區域&#xff0c;通過建立無人機飛行模式的…