如何正確的配置eureka server集群

將 Eureka Server 實例的 hostname 都配置成相同的值,在 Eureka Server 集群環境同樣是不推薦且通常會導致嚴重問題的

核心問題:Eureka Server 集群的工作機制

Eureka Server 集群通過相互注冊(Peering)來實現高可用和數據同步。每個 Server 節點既是 Server(接收 Client 注冊、提供查詢),同時也是其他 Server 節點的Client(向其他 Server 節點注冊自己,并獲取其他 Server 的注冊表信息)。

如果所有 Eureka Server 實例的 hostname 都配置成一樣(例如 eureka-host

  1. 注冊沖突與覆蓋 (最嚴重問題 - 腦裂風險):

    • 當 Eureka Server A (eureka-host:8761) 啟動時,它會根據配置的 serviceUrl.defaultZone 嘗試向其他 Server 節點(比如 B 和 C)注冊自己(作為 Client)。
    • 同時,Eureka Server B (eureka-host:8761) 和 C (eureka-host:8761) 也會做同樣的事情。
    • 問題在于: 它們都使用相同的 hostname (eureka-host)相同的應用名 (eurekaeureka-server) 進行注冊。即使端口不同(假設 A:8761, B:8762, C:8763),生成的 instanceId 默認通常是 ${hostname}:${appname}:${port}
    • 結果: 在 Eureka Server 集群的注冊表里,它們會被視為同一個 Eureka Server “應用” 的多個實例,但具有相同的 hostname 和不同的 port
    • 致命風險: 如果 Eureka Server B 和 C 嘗試向 A 注冊時,A 會認為這是 eureka-host:eureka:8762eureka-host:eureka:8763 在注冊。但是,當它們之間相互同步注冊表信息時,可能會出現混亂:
      • Server A 可能認為 Server B 和 C 是 eureka-host:eureka:8762eureka-host:eureka:8763
      • Server B 接收同步時,看到 Server A 是 eureka-host:eureka:8761,Server C 是 eureka-host:eureka:8763
      • 關鍵點:每個 Server 節點在同步時,都需要知道其他 Server 節點 的真實、可訪問的網絡位置(hostname:port)來推送注冊表更新和獲取增量。
      • 如果所有 Server 都上報 hostname=eureka-host,那么:
        • Server A (eureka-host:8761) 認為 Server B 位于 eureka-host:8762
        • Server B (eureka-host:8762) 認為 Server A 位于 eureka-host:8761
        • Server C (eureka-host:8763) 認為 Server A 位于 eureka-host:8761, Server B 位于 eureka-host:8762
    • 網絡解析問題: eureka-host 這個主機名必須在運行每個 Eureka Server 實例的機器/容器上,被 DNS 或 /etc/hosts 文件解析到該實例自身所在的機器/容器的 IP 地址這幾乎是不可能正確配置的!
      • 在 Server A 的機器上,eureka-host 必須指向 Server A 的 IP。
      • 在 Server B 的機器上,eureka-host 必須指向 Server B 的 IP。
      • 在 Server C 的機器上,eureka-host 必須指向 Server C 的 IP。
      • 這違背了 DNS/hosts 的基本原理(一個主機名通常全局解析到一個或一組固定IP)。 你無法讓同一個主機名 eureka-host 在不同的機器上解析到不同的 IP。即使使用復雜的 DNS 視圖或本地 hosts 覆蓋,維護成本極高且極易出錯。
    • 后果:
      • 節點間通信失敗: 當 Server A 嘗試向 eureka-host:8762 發送心跳或同步數據時,請求會被發送到它自己機器上配置的 eureka-host 的 IP(即 Server A 自己的 IP),而不是 Server B 的真實 IP。Server A 會嘗試連接自己機器的 8762 端口(如果沒開則失敗)。Server B 根本收不到請求。其他節點間通信同理。
      • 集群分裂 (Brain Split): 節點間無法正常通信,導致注冊表數據無法同步。每個節點可能只包含部分注冊信息,或者認為其他節點不可用。集群的高可用性完全喪失。
      • Client 注冊/發現不穩定: Client 可能注冊到某個 Server,但這個注冊信息無法同步到其他 Server。Client 查詢時,從不同 Server 獲取到的服務列表可能不一致或缺失。
  2. Eureka Dashboard 顯示混亂:

    • 在 Eureka 的管理界面上,你會看到多個名為 EUREKA-SERVER (或你的應用名) 的實例,它們的 hostname 都顯示為 eureka-host,只是端口不同。很難直觀區分哪個實例實際運行在哪臺物理機上。

什么情況下 “可能看起來” 能工作(但仍不推薦)?

  • 使用 preferIpAddress=true (強烈推薦,且是解決此混亂的關鍵):
    • Eureka Server 的配置中,每個實例都應該設置:
      eureka.instance.prefer-ip-address=true
      
    • 作用: 當設置為 true 時,Eureka Server 實例在向其他 Eureka Server 節點注冊自己(作為 Client)時,會使用自己的 IP 地址 而不是 hostname 上報。
    • 結果:
      • 在 Eureka Server 集群的注冊表中,各個 Server 節點的 hostname 字段雖然可能還是 eureka-host,但用于通信的實際地址是 IP
      • 節點間同步數據時,使用的是彼此上報的 IP 地址和端口 來建立連接。只要網絡互通,就能正常工作。
      • 這解決了節點間通信的核心問題! 因為 IP 地址在集群內是唯一的且可直接路由的。
    • 即使這樣,hostname 相同的問題:
      • 在 Dashboard 上看起來還是同一個主機名,不方便運維。
      • 如果某些內部機制(或自定義邏輯)錯誤地依賴了 hostname 字段,仍可能出問題。
      • 不是最佳實踐,缺乏清晰度。

正確的 Eureka Server 集群配置方式

  1. 為每個 Eureka Server 實例配置唯一的、可解析的 hostname (最佳實踐):

    • 每個 Server 實例應該使用其所在物理機/虛擬機/容器的主機名或一個唯一標識它的 DNS 名稱(如 eureka-server-1.mycompany.com, eureka-server-2.mycompany.com, 10.0.0.101, 10.0.0.102)。
    • 配置示例 (application.yml):
      # 在 Server 1 上
      eureka:instance:hostname: eureka-server-1 # 或使用真實IP eureka.instance.preferIpAddress=trueappname: eureka-server # 應用名一致,標識它們是同一個集群client:serviceUrl:defaultZone: http://eureka-server-2:8762/eureka, http://eureka-server-3:8762/eureka # 指向其他節點的唯一hostname/IP和端口
      
      # 在 Server 2 上
      eureka:instance:hostname: eureka-server-2appname: eureka-serverclient:serviceUrl:defaultZone: http://eureka-server-1:8761/eureka, http://eureka-server-3:8762/eureka
      
      (Server 3 配置類似)
  2. 強烈推薦使用 preferIpAddress=true

    • 無論 hostname 是否唯一,都建議在每個 Eureka Server 實例上設置:
      eureka:instance:prefer-ip-address: true # 使用IP注冊,避免任何hostname解析問題
      
    • 這是生產環境最可靠、最常用的配置。它確保節點間通信和 Client 發現 Server 都直接使用 IP 地址,繞開了 DNS 解析的所有潛在麻煩。
  3. 確保 serviceUrl.defaultZone 配置正確:

    • 每個 Server 節點的 defaultZone 必須指向其他 Server 節點的真實、可訪問的網絡地址 (使用它們的唯一 hostname 或 IP + 端口 + /eureka 路徑)。
    • 一個節點不應該把自己包含在 defaultZone 里(雖然 Eureka 允許,但不必要且可能增加復雜性)。

總結

  • 絕對不要將 Eureka Server 集群中所有實例的 eureka.instance.hostname 硬編碼成完全相同的值(如都寫成 eureka-host)。
  • 這樣做會導致:
    • 節點間通信失敗(核心問題,集群無法正常工作)。
    • 集群分裂風險(數據不一致)。
    • 運維困難(Dashboard 顯示混亂,難以定位問題節點)。
  • 解決方案:
    1. 首選: 為每個 Eureka Server 實例配置唯一的、可解析的 hostname (反映其真實部署位置)。
    2. 必須做: 在每個 Eureka Server 實例上配置 eureka.instance.prefer-ip-address=true。這是解決通信問題的關鍵,也是生產環境最佳實踐。
    3. 正確配置 eureka.client.serviceUrl.defaultZone,指向其他節點的唯一地址。

簡而言之:Eureka Server 集群的每個節點也需要一個唯一的網絡標識 (hostname 或 IP),并強烈建議開啟 prefer-ip-address=true 來保證集群內部通信的可靠性。 配置成一樣的 hostname 是錯誤且危險的。

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

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

相關文章

AI支持下的-ArcGIS數據處理、空間分析、可視化及多案例綜合應用

查看原文>>> 從入門到精通-AI支持下的-ArcGIS數據處理、空間分析、可視化及多案例綜合應用 結合ArcGIS和GPT的優勢,本文重點進行AI大模型應用、ArcGIS工作流程及功能、Prompt使用技巧、AI助力工作流程、AI助力數據讀取與處理、AI助力空間分析、AI助力遙感…

vue3-ts: v-model 和 props 的關系

在 Vue.js 中,v-model 是一個語法糖,它實際上是 :value 和 input 事件的組合。 當你使用 v-model 綁定一個組件時,默認情況下,組件會通過 props 接收 value 這個 prop, 并通過觸發 input 事件來更新父組件中的數據。 …

學車筆記 變擋

超15就可以加一檔了 有些人對手動擋的檔位有一些誤解_嗶哩嗶哩_bilibili 獻給所有新司機.開手動檔擺脫頓挫的根本方法.學會看轉速!沒那么復雜!_嗶哩嗶哩_bilibili 減速到怠速降一檔

STM32的DMA簡介

STM32的DMA簡介 一、DMA概述 DMA(Direct Memory Access,直接存儲器存取)是一種硬件機制,它允許外設和存儲器之間或者存儲器和存儲器之間進行高速數據傳輸,而無需CPU的干預。這種機制可以極大地節省CPU資源&#xff0c…

Spring-AOP知識點

一、AOP簡介 1.AOP概念 2.AOP思想實現方案 3.AOP相關概念 二、基于xml配置AOP 1.快速入門 2.AOP配置詳解 3.AOP原理剖析 三、基于注解配置AOP 1.快速入門 2.注解方式AOP配置詳解 抽取切點表達式

Java@Data 與 @NotNull 注解沖突問題

第一章:核心概念解析 1. Data(Lombok 提供) 自動生成以下方法: gettersettertoString()equals()hashCode() 簡化實體類編寫,提高開發效率。 示例: import lombok.Data;Data public class User {private…

離線部署openstack 2024.1 glance

控制節點鏡像服務 離線下載 apt install --download-only glancemkdir /controller/glance mv /var/cache/apt/archives/*.deb /controller/glance/ dpkg -i /controller/glance/*.deb在一個控制節點操作 CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO glan…

.NET AOT 詳解

簡介 AOT(Ahead-Of-Time Compilation)是一種將代碼直接編譯為機器碼的技術,與傳統的 JIT(Just-In-Time Compilation)編譯方式形成對比。在.NET 中,AOT 編譯可以在應用發布時將 IL(中間語言&…

博客系統自動化測試

基于SSM(Spring Spring MVC MyBatis)框架構建的個人博客系統,通過分層架構實現高效協作:Spring負責依賴注入與事務管理,Spring MVC處理HTTP請求分發,MyBatis完成數據持久化操作。系統包含以下核心功能模塊…

animate.css詳解:輕松實現網頁動畫效果

前言 在網頁設計中,動畫效果不僅僅是視覺上的裝飾,更是提升用戶體驗的重要元素。animate.css 作為一個輕量級的 CSS 動畫庫,提供了豐富的預設動畫效果,本文將探討 animate.css 使用方法以及在實際項目中的應用案例,幫助…

【多智能體】基于嵌套進化算法的多代理工作流

😊你好,我是小航,一個正在變禿、變強的文藝傾年。 🔔本專欄《人工智能》旨在記錄最新的科研前沿,包括大模型、具身智能、智能體等相關領域,期待與你一同探索、學習、進步,一起卷起來叭&#xff…

電源知多少?LDO VS DCDC((下)

首先補充幾個上一節沒有提到的知識,我們通常說的DCDC同步整流是指什么? 同步是指采用通態電阻極低的專用功率MOS來取代整流二極管以降低整流損耗,,但是同步整流有以下兩點需要注意:1、MOS在導通之后的壓降比較低&…

數組方法_push()/pop()/數組方法_shift()/unshift()

push 方法用于在數組的末端添加一個或多個元素,并返回添加新元 素后的數組長度。注意,該方法會改變原數組 var arr [];arr.push("顫三") // 1arr.push(itbaizhan) // 2arr.push(true, {}) // 4arr // [顫三 , itbaizhan, true, {}] pop 方法用…

腦機新手指南(八):OpenBCI_GUI:從環境搭建到數據可視化(下)

一、數據處理與分析實戰 (一)實時濾波與參數調整 基礎濾波操作 60Hz 工頻濾波:勾選界面右側 “60Hz” 復選框,可有效抑制電網干擾(適用于北美地區,歐洲用戶可調整為 50Hz)。 平滑處理&…

多頭與空頭:市場博弈的兩面

在金融市場中,多頭(Bull)和空頭(Bear)代表兩種截然相反的投資策略,它們的博弈構成了市場價格波動的核心動力。 1. 概念對比:看漲與看跌的本質區別 多頭(Bull)&#xff0…

Excel 發現此工作表中有一處或多處公式引用錯誤。請檢查公式中的單元格引用、區域名稱、已定義名稱以及到其他工作簿的鏈接是否均正確無誤。彈窗

Excel 提示“發現此工作表中有一處或多處公式引用錯誤”通常表示公式中存在無效引用。以下是系統化的檢查步驟,幫助你定位和修復問題: 1. 檢查單元格引用: 無效單元格引用:檢查公式中的單元格地址(如 A1、B10&…

變量 varablie 聲明- Rust 變量 let mut 聲明與 C/C++ 變量聲明對比分析

一、變量聲明設計:let 與 mut 的哲學解析 Rust 采用 let 聲明變量并通過 mut 顯式標記可變性,這種設計體現了語言的核心哲學。以下是深度解析: 1.1 設計理念剖析 安全優先原則:默認不可變強制開發者明確聲明意圖 let x 5; …

【指針】(適合考研、專升本)

指針 &與*是兩個作用相反的運算符。 二級指針只能保存一級指針變量的地址和指向指針數組,其余情況不考慮。 int *p[2];int a12;int b15;*p&a;*(p1)&b;printf("%d\n%d\n",**p,**(p1));int **rp;printf("%d\n",**r); 普遍變量…

電路圖識圖基礎知識-行程開關自動往返運行控制電路詳解(二十三)

行程開關自動往返運行控制電路詳解 在機床設備運行中,部分工作臺需在特定距離內自動往復循環,行程開關自動往返運行控制電路可實現該功能,通過行程開關自動控制電動機正反轉,保障工作臺有序運動,以下展開詳細解析。 …

SpringBoot學習day1-SpringBoot的簡介與搭建

springboot回顧springspringbootspringboot搭建(新聞為例)springboot中的配置文件spring集成jdbc,mybatis,阿里巴巴數據源**SpringBoot 集成日志功能**(了解)常用日志組件日志級別 springboot統一異常處理 springboot 回顧spring spring是一個輕量級的…