《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》
从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南
本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理,结合生产级实践经验优化
实验环境:IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich.SR2项目源码:本文完整示例代码已开源至 GitHub,建议结合实践阅读
🔗 https://github.com/hongmengchen/spring-cloud-eureka-ha-demo
前言:为什么需要高可用Eureka集群?
在微服务架构中,注册中心是服务发现与治理的核心枢纽。单节点Eureka Server存在单点故障风险,一旦宕机将导致整个系统服务发现失效。高可用集群通过多节点互备,实现服务注册表同步与故障自动转移,保障系统99.99%的可用性。
本文是《从零到一!Spring Cloud Eureka 微服务注册中心手把手搭建指南》的进阶篇,将带领读者完成以下目标:
- 集群架构设计:基于CAP理论(一致性、可用性、分区容错性)选择AP模式,确保网络波动时仍可提供服务发现。
- 实战搭建:通过双节点互注册实现数据同步,结合Hosts配置模拟多服务器环境。
- 全链路改造:覆盖服务提供者、消费者的集群适配,并验证故障切换能力。
实施路线图
基本流程:
- 系统环境准备(Hosts配置)
- Eureka Server 双节点改造
- 服务提供者集群适配
- 改造服务消费者
- 测试运行
1. 系统环境准备(Hosts配置)
作用:通过域名映射实现本地多节点模拟
以 Windows 系统为例,如果要构建集群,需要修改 hosts 文件,为其添加主机名的映射。
Windows系统操作指南:
- 以管理员身份运行记事本
- 打开
C:\Windows\System32\drivers\etc\hosts - 添加以下映射规则:
# Eureka 集群节点映射
127.0.0.1 server1 # 主节点域名
127.0.0.1 server2 # 备用节点域名


在修改 hosts 文件时,部分同学可能会遇到无法修改的问题,我另写了一篇博客以解决大家的问题:Windows 系统 hosts 文件无法保存?三步搞定权限设置!
建议:大家在修改 hosts 文件权限之后,建议使用完再改会来,也是为了安全考虑嗷
关键验证命令:
ping server1 # 应返回127.0.0.1
ping server2 # 应返回127.0.0.1
2. Eureka Server 双节点改造
核心逻辑:节点间互相注册形成环形依赖
按照搭建 eureka-server 的方式,再搭建一个名为 eureka-server-another 的 Eureka Server。
eureka-server-another 的 application.yml 配置文件内容如下:
节点2配置(server2:7009)
server:port: 7009
spring:application:name: eurake-server-another
eureka:client:fetch-registry: falseregister-with-eureka: falseservice-url:defaultZone: http://server1:7000/eureka/ # 指向节点1instance:hostname: server2 # 必须与Hosts配置一致
创建项目每次都差不多

接下来就是补齐这个初创项目的框架
- 补充 pom.xml
- 添加目录结构
- 完善配置文件 application.yml
- 写上启动类
- eureka-server-another 和 eureka-server 一样都是 Eureka Server,因此 pom.xml 文件内容也是一样的,大家复制粘贴过来就行,记得点击更新

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 父项目 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/></parent><!-- 基本信息 --><groupId>cn.hmck</groupId><artifactId>eureka-server-another</artifactId><version>1.0-SNAPSHOT</version><!-- 属性 --><properties><!-- jdk版本 --><java.version>1.8</java.version><!-- spring-cloud版本 --><spring-cloud.version>Greenwich.SR2</spring-cloud.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依赖 --><dependencies><!-- spring-boot-starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- spring-boot-starter-test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- spring-cloud-starter-netflix-eureka-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><!-- spring-cloud依赖管理 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 构建 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
- 添加目录结构和之前也是一样的

- 接着就是补充 application.yml 配置文件

- 最后就是写上启动类 EurekaServerApplication.java
新项目的启动类命名与之前一样或者不一样都可以
注意:启动类外层必须加上一个包名,否则会报错无法运行,这也是 Spring Cloud 默认规则

这部分代码和之前依然没什么区别,可以直接复制粘贴
package cn.hmck.eurekaserveranother;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}}
修改项目 eureka-server 的全局配置文件 application.yml。
注意哦!这里是指修改一开始的 eureka-server 项目
eureka-server 的 application.yml 配置文件内容如下:
节点1配置(server1:7000)
server:port: 7000
spring:application:name: eurake-server
eureka:client:fetch-registry: falseregister-with-eureka: falseservice-url:defaultZone: http://server2:7009/eureka/ # 指向节点2instance:hostname: server1 # 必须与Hosts配置一致
关键配置解析:
fetch-registry: false:Server节点不获取注册表(仅Client需要)register-with-eureka: false:Server节点不自我注册- 必须保证:集群节点使用相同的
spring.application.name

简单解释一下

3. 服务提供者集群适配
目标:实现服务多实例注册与负载均衡
按照搭建 eureka-provider 的方式,搭建一个名为 eureka-provider-another 的服务提供者。
eureka-provider-another 的 application.yml 配置文件内容如下:
server:port: 7007
spring:application:name: eureka-provider
eureka:client:service-url:defaultZone: http://localhost:7000/eureka/instance:hostname: localhost
为了体现集群,所以我们还需要再搭建一个服务提供者 eureka-provider-another,流程和前面搭建第二个服务器是一样的。并且主要代码和原来的服务提供者 eureka-provider 是一样的。
- 创建项目 eureka-provider-another
- 补充目录结构、配置文件及启动类
- 创建项目 eureka-provider-another

- 补充目录结构、配置文件及启动类
pom.xml 文件代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 父项目 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/></parent><!-- 基本信息 --><groupId>cn.hmck</groupId><artifactId>eureka-provider-another</artifactId><version>1.0-SNAPSHOT</version><!-- 属性 --><properties><!-- jdk版本 --><java.version>1.8</java.version><!-- spring-cloud版本 --><spring-cloud.version>Greenwich.SR2</spring-cloud.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依赖 --><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.1.7.RELEASE</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.7.RELEASE</version></dependency></dependencies><!-- spring-cloud依赖管理 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 构建 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
启动类 EurekaProviderApplication.java 代码
package cn.hmck.eurekaprovider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
public class EurekaProviderApplication {public static void main(String[] args) {SpringApplication.run(EurekaProviderApplication.class, args);}
}
最终结果展示

4. 改造服务消费者
核心能力:自动故障转移与请求重试
修改项目 eureka-consumer 中的全局配置文件 application.yml。
作为消费者的 eureka-consumer ,我们并没有添加其他的,也没有对其进行修改,代码未作变动。
eureka-consumer 的 application.yml 配置文件内容如下:
server:port: 7002
spring:application: name: eureka-consumer
eureka:client:service-url:defaultZone: http://localhost:7000/eurekainstance:hostname: localhost
5. 启动测试
依次启动两个 Eureka Server、两个服务提供者、一个服务消费者。启动成功后,无论访问哪个 Eureka Server,Eureka Server 的注册实例都是一样的,访问 server1:7000 的页面效果如下图所示。

访问server2:7009的页面效果如下图所示。

Eureka 的常用配置
1. 心跳机制
Eureka 的心跳机制用于客户端(服务提供者)与 Eureka Server 之间的健康状态维护。通过心跳,客户端定期向 Server 发送信号以表明自身存活状态,避免被 Server 自动剔除。
核心配置参数
在服务提供者的 application.yml 中配置以下参数:
eureka:instance:# 心跳间隔时间(默认30秒)lease-renewal-interval-in-seconds: 30# 心跳超时时间(默认90秒)lease-expiration-duration-in-seconds: 90
- lease-renewal-interval-in-seconds:客户端每隔多少秒向 Eureka Server 发送一次心跳。
- lease-expiration-duration-in-seconds:如果 Server 在此时间内未收到心跳,则认为实例不可用并剔除注册信息。
工作原理
- 客户端启动后向 Server 注册,并开始周期性发送心跳。
- Server 接收到心跳后会重置该实例的租约时间。
- 若 Server 在
lease-expiration-duration-in-seconds内未收到心跳,则标记实例为DOWN并从注册表中移除。
2. 自我保护机制
Eureka Server 的自我保护机制旨在应对网络分区故障场景。当短时间内丢失大量客户端心跳时,Server 会进入保护模式,保留现有注册信息,避免因网络抖动导致服务被误删。
核心配置参数
在 Eureka Server 的 application.yml 中配置以下参数:
eureka:server:# 启用自我保护机制(默认true)enable-self-preservation: true# 触发保护模式的阈值(默认0.85,即85%心跳丢失)renewal-percent-threshold: 0.85
- enable-self-preservation:是否启用自我保护机制,生产环境建议保持
true。 - renewal-percent-threshold:触发保护模式的心跳丢失比例阈值(例如 0.85 表示 85% 的心跳未更新时触发)。
工作机制
- Server 每分钟统计心跳续约失败的比例。
- 若失败比例超过
renewal-percent-threshold,则进入保护模式:- 不再剔除任何实例(即使心跳超时)。
- 在 Eureka 控制台显示警告信息:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP...
- 当心跳恢复正常后,Server 会自动退出保护模式。
配置建议
- 开发环境:可关闭自我保护机制(
enable-self-preservation: false),方便快速发现失效实例。 - 生产环境:务必启用自我保护机制,避免因网络波动导致服务列表频繁变更。
- 调试技巧:若发现实例未被剔除,需检查是否因保护模式触发导致,可通过日志或控制台提示确认。
特别说明
本次技术实践文档的整理与验证,部分配置优化方案通过 DeepSeek 的智能辅助工具实现效能提升,在此对技术伙伴的支持表示感谢。
技术无界,协作共生
DeepSeek 智能开发平台
📣 我是鸿·蒙,若有不解之处或发现疏漏,欢迎随时私信交流!
(虽然不一定秒回,但每条消息都会认真看嗷~ (๑•̀ㅂ•́)و✧)
相关文章:
《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》
从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理,结合生产级实践经验优化 实验环境:IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…...
PyQt6实例_批量下载pdf工具_主线程启用线程池
目录 前置: 代码: 视频: 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点: 线程池:QThreadPool,QRunnable; 信号与…...
DSP+AI综合应用案例1——三种波形识别(预告)
采用1kHz采样率,识别方波、正弦波、三角波三种波形,算法采用傅里叶变换与神经网络,识别结果如下: 可以达到1ms内实现检测,逐渐完善到CanMV K230 或MCU中,待续...
去噪算法大比拼
目录 效果图: 实现代码: 密集抖动 pip install pykalman 效果图: 实现代码: import numpy as np import cv2 import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter1d from scipy.signal import butter, filtfilt, savgol_filter from pykalma…...
浅拷贝或深拷贝js数组或对象的方法
在js中,直接通过赋值操作拷贝数组,会导致新旧数组互相影响。 这是因为数组、对象等数据属于引用类型(Reference Type)数据。对引用类型数据进行赋值操作时,实际上拷贝的是其内存地址的引用(即指向堆内存中对…...
CKS认证 | Day3 K8s容器运行环境安全加固
一、最小特权原则(POLP) 1)最小特权原则 (Principle of least privilege,POLP) : 是一种信息安全概念,即为用户提供执行其工作职责所需的最 小权限等级或许可。 最小特权原则被广泛认为是网络安全的最佳实…...
28_跨域
目录 promise promise的基本语法 async await try catch promise 静态方法 跨域 跨域的解决方案 1-cors 编辑 2-jsonp方案 3-代理服务器 promise promise 是一个es6新增的语法 承诺的意思 作用:是专门用来解决回调地狱!!!! promise的基本语法 // 基本语法:// Pr…...
Stable Diffusion太慢?国内Midjourney平替方案—商用合规部署
一、AI绘画商用核心痛点(为什么需要替代Stable Diffusion/Midjourney?) 1. 速度慢,高并发支持差 Stable Diffusion:单卡GPU生成1张图需3-10秒,并发超过10任务易崩溃Midjourney:排队制…...
综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey
论文题目:Retrieval-Augmented Generation for AI-Generated Content: A Survey 论文地址:https://arxiv.org/abs/2402.19473 bib引用: misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…...
Spring @EnableAutoConfiguration 注解执行过程详解
Spring EnableAutoConfiguration 注解执行过程详解 核心流程 触发自动配置:通过 EnableAutoConfiguration 注解开启自动配置。加载配置类:根据 META-INF/spring.factories 文件加载默认的自动配置类。条件判断:每个自动配置类通过 Condition…...
JavaScript中的Math对象和随机数
目录 一、常用数学方法 1. 数值处理 2. 极值与运算 3. 三角函数(参数为弧度) 4. 对数与指数 5. 常量 二、随机数生成 Math.random() 1. 基础范围控制 2. 整数随机数 三、实际应用场景 1. 随机颜色生成 2. 数组随机排序 3. 概率控制 四、注…...
lxd-dashboard 图形管理LXD/LXC
前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…...
python纯终端实现图片查看器(全彩)(windows)
很多人作为命令行爱好者,无法在终端内直接查看图片是无法忍受的, 那就写一个! 先直接上代码 import os import sys from PIL import Image import numpy as np import colorama import msvcrt # Windows专用# 初始化colorama colorama.ini…...
【动态规划篇】- 路径问题
62. 不同路径 题目链接: 62. 不同路径 题目解析: 状态表示 dp[i][j]表示:以[i][j]为终点时,一共有多少种路径。 状态转移方程 以[i][j]最近的几步来分析问题,要么从[i-1][j]位置向下走一步到达[i][j],要么从[i][j-1…...
《新凯来:半导体设备制造领域的“国家队”》
《新凯来:半导体设备制造领域的“国家队”》 一、SEMICON China 爆火出圈:31 款设备背后的 “深圳力量” 1.1 展会现象级热度 在 2025 年 SEMICON China 展会现场,新凯来展台成了整届展会当之无愧的 “顶流”,被来自全球各地的专…...
AI大模型最新发布[update@202503]
OpenAI GPT-4o:多模态,“o”代表Omni,即全能的意思,凸显了其多功能的特性。 多模态交互,GPT-4o可以接受文本、音频和图像的任意组合作为输入,并生成文本、音频和图像的任意组合输出。实时推理能力&#x…...
深入浅出 Embedding
1. 什么是 Embedding? Embedding(嵌入)是一种将高维数据映射到低维连续空间的技术,用于表达数据的语义关系。简单来说,它是一种向量化表示,将文本、图像、用户行为等信息转换为数值向量,使得相似的数据在向量空间中距离更近。 2. 如何理解 Embedding? 2.1 浅显易懂的…...
java项目之基于ssm的乡镇自来水收费系统(源码+文档)
项目简介 乡镇自来水收费系统实现了以下功能: 乡镇自来水收费系统在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员管理水表,审核用户更换…...
Java实战:实现用户的登录注册功能
系列文章目录 Java文件 I/O流的操作实战和高级UI组件和事件监听的综合 文章目录 系列文章目录前言一、大致流程思路分析:二、定义用户类:三、服务层的实现: 1.保护用户数据功能的实现2.登录操作的实现 四、实现用户的注册界面: 大…...
Spring AI MCP 架构详解
Spring AI MCP 架构详解 1.什么是MCP? MCP 是一种开放协议,它对应用程序向大语言模型(LLMs)提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种…...
目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库
环境情况 ubuntu 18.04 → 20.04(最终) 安装Ubuntu1804虚拟机系统 Anaconda:可参考我的另一篇文章 Python 3.6.13 → 3.8(最终)Anaconda3-2021.05 目标识别:YOLOv5相关 1、安装git sudo apt install gi…...
OpenAI API - Agent
文章目录 代理概述模型工具知识与记忆防护栏编排入门 语音代理选择正确的架构语音到语音(多模态)架构链式架构 构建语音代理使用语音到语音架构进行实时处理将音频输入链接到文本处理 → 音频输出 代理 了解如何使用 OpenAI API 构建代理。 https://pl…...
excel 时间戳 转日期
在Excel中,将时间戳转换为日期格式,可以使用以下步骤和方法: 一、了解时间戳 时间戳(Timestamp)通常是从1970年1月1日(UTC时间)开始的秒数或毫秒数。这个时间点被称为“Unix纪元”或“Unix时间…...
Strawberry perl的下载,查询版本号,配置Path环境变量,查找perl解释器的位置
Strawberry Perl 是一个适用于 Microsoft Windows 的 Perl 环境,包含运行和开发 Perl 应用程序所需的一切。它旨在尽可能接近 UNIX 系统上的 Perl 环境。 下载 官网: Strawberry Perl for Windows - Releases 各个版本: Strawberry Perl for Windows - Releases …...
MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )
目录 一、字符串函数 1.常见字符串函数 编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数(如下): 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…...
5G_WiFi_CE_杂散测试
目录 一、规范要求 1、法规目录: 2、限值: (1)带外发射杂散 (2)带内发射杂散 (3)接收杂散 二、测试方法 1、带外发射杂散 (1)测试条件 (…...
理解Kubernetes中CoreDNS域名解析与DNS策略
CoreDNS是什么 CoreDNS是一个灵活可扩展的DNS服务器,使用Go语言编写,旨在提供快速、灵活的DNS服务 为什么需要CoreDNS CoreDNS为Kubernetes集群内部的DNS解析提供服务,使得服务之间能够通过域名互相通信 Kubernetes集群中, CoreDNS是运行在…...
大数据Spark(五十五):Spark框架及特点
文章目录 Spark框架及特点 一、Spark框架介绍 二、Spark计算框架具备以下特点 Spark框架及特点 一、Spark框架介绍 Apache Spark 是一个专为大规模数据处理而设计的快速、通用的计算引擎。最初由加州大学伯克利分校的 AMP 实验室(Algorithms, Machines, and Pe…...
UI产品经理基础(六):如何解决用户的质疑?
在需求调查中遇到用户质疑“不专业”或“不了解需求”,本质上是用户对产品经理的信任缺失或沟通鸿沟导致的。要化解这种质疑,需从专业能力展示、沟通方式优化、用户参与感提升三个维度切入,结合具体场景采取针对性策略。以下是系统化的解决方…...
【大数据技术】大数据技术概念及概述
1. 大数据概念 数据 是实时或观察的结果是对客观事务的逻辑归纳是用于表示客观事物的未经加工的原始素材 数据的产生 对客观事务的计量和记录尝试的数据 单位换算1 byte8 bit1 k1024 byte1 mb1024 k1 g1024 m1 t1024 g1 p1024 t1 e1024 p1 z1024 e1 y1024 z1 b1024 y1 n10…...
