Spring Cloud Netflix Eureka 注册中心讲解和案例示范

news2024/11/25 14:43:11

在微服务架构中,服务的发现和注册是至关重要的一环。Netflix Eureka 是一个在云端设计的服务注册与发现系统。它允许各个微服务将自身注册到注册中心,并在需要时发现其他服务,从而实现客户端负载均衡、服务容错以及动态扩展。本文将深入分析 Netflix Eureka 的工作原理、在业务系统中的应用,并通过详细示例和配置参数说明帮助读者理解。

1. Eureka 注册中心介绍

1.1 Eureka 的角色

Netflix Eureka 作为一个分布式的服务注册中心,主要由两个角色组成:

  • Eureka Server:注册中心,负责保存所有已注册的服务实例。
  • Eureka Client:微服务应用程序客户端,负责将服务注册到 Eureka Server 并从 Eureka Server 中获取其他服务的注册信息。
1.2 核心功能

Eureka 提供了以下核心功能:

  • 服务注册:微服务启动时,向 Eureka Server 注册自己。
  • 服务发现:其他微服务可以通过 Eureka Client 获取已注册的服务列表。
  • 心跳检测:微服务定期向 Eureka Server 发送心跳,保证服务的存活状态。
  • 自我保护机制:Eureka Server 可以在出现网络分区问题时不立即注销没有收到心跳的服务,防止误删可用服务。
1.3 在电商交易系统中的应用

在一个典型的电商系统中,可能会涉及到订单服务、库存服务、支付服务等多个微服务。每个服务会注册到 Eureka Server 中,其他服务通过 Eureka Client 来发现并调用这些服务。例如,当订单服务需要检查库存时,它可以通过 Eureka 注册中心来动态发现库存服务并进行调用。


2. Eureka 的工作流程

Eureka 的工作流程涉及到服务注册、服务发现、心跳机制以及自我保护机制等。下面我们将使用 PlantUML 生成的时序图,展示服务注册和服务发现的流程。

2.1 服务注册流程

在这里插入图片描述

2.2 服务发现流程

当一个服务需要调用另一个服务时,它会通过 Eureka Client 查询 Eureka Server,获取所需服务的实例地址。

在这里插入图片描述


3. Netflix Eureka 配置详解

在 Spring Boot 中,集成 Eureka 非常简单。通过 spring-cloud-starter-netflix-eureka-serverspring-cloud-starter-netflix-eureka-client 两个依赖,开发者可以快速搭建 Eureka 服务端和客户端。

3.1 Eureka Server 的配置
3.1.1 添加 Maven 依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.1.2 配置 Eureka Server

application.yml 文件中,配置 Eureka Server 相关的参数:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false  # Eureka Server 不需要注册到自己
    fetch-registry: false         # Eureka Server 不需要获取服务注册表

在 Spring Boot 启动类中,添加 @EnableEurekaServer 注解:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
3.2 Eureka Client 的配置
3.2.1 添加 Maven 依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2.2 配置 Eureka Client

application.yml 文件中,配置 Eureka Client 相关参数:

spring:
  application:
    name: inventory-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

在微服务启动类中,添加 @EnableEurekaClient 注解:

@SpringBootApplication
@EnableEurekaClient
public class InventoryServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(InventoryServiceApplication.class, args);
    }
}

这样,InventoryService 服务就可以注册到 Eureka Server,并通过其他服务进行发现。


4. Eureka 心跳检测机制

Eureka 心跳检测机制是服务注册和发现系统中至关重要的功能之一,它确保了服务的可用性,并使 Eureka Server 了解服务的健康状态。在电商交易系统的微服务架构中,心跳检测有助于实时监控服务实例的健康状态,保证服务发现的准确性和及时性。

4.1 什么是心跳检测?

在 Eureka 中,心跳检测 是 Eureka Client(微服务实例)与 Eureka Server 之间定期通信的过程。微服务实例向 Eureka Server 定期发送心跳消息,告知其自身处于健康状态。通过心跳检测,Eureka Server 可以知道服务实例是否仍然可用。

如果某个服务实例在一段时间内未发送心跳,Eureka Server 会认为该实例可能已经不可用,并将其从服务注册表中移除。这一机制保证了 Eureka Server 中注册的服务都是可用的,从而使服务发现变得可靠。

4.2 心跳检测的工作流程

当微服务启动并向 Eureka Server 注册成功后,Eureka Client 会定期发送心跳请求,以确保它仍然在正常运行。心跳的发送频率可以通过配置调整。

  • 服务注册:微服务启动后,首先向 Eureka Server 发送注册请求。
  • 心跳发送:服务注册后,Eureka Client 定期向 Eureka Server 发送心跳,通知其仍然存活。
  • 服务剔除:如果某个实例在配置的阈值时间内未发送心跳,Eureka Server 会将该实例标记为不可用,并从服务注册表中移除。
  • 自我保护机制:如果网络不稳定导致大批量实例心跳丢失,Eureka 的自我保护机制会启动,防止误将这些实例剔除。
4.3 心跳检测配置项

Eureka 的心跳检测机制可以通过一些配置项进行调整,以满足不同场景的需求。下面是一些常用的配置项说明:

  • eureka.instance.lease-renewal-interval-in-seconds:心跳发送的时间间隔,默认为 30 秒。即每隔 30 秒,Eureka Client 会发送一次心跳。
  • eureka.instance.lease-expiration-duration-in-seconds:Eureka Server 等待心跳超时的时长,默认为 90 秒。如果在 90 秒内没有收到该服务实例的心跳,Eureka Server 将移除该实例。
  • eureka.client.registry-fetch-interval-seconds:Eureka Client 从 Eureka Server 获取服务注册表信息的时间间隔,默认为 30 秒。

下面是一个心跳检测相关的配置示例:

eureka:
  instance:
    lease-renewal-interval-in-seconds: 10  # 设置心跳间隔为10秒
    lease-expiration-duration-in-seconds: 30  # 设置过期时间为30秒
  client:
    registry-fetch-interval-seconds: 5  # 每5秒刷新一次服务注册表

在上述配置中:

  • 微服务实例会每隔 10 秒向 Eureka Server 发送心跳。
  • 如果 Eureka Server 在 30 秒内没有收到该实例的心跳,则认为该实例已不可用。
  • 每隔 5 秒,Eureka Client 会获取一次最新的服务注册表。
4.4 自我保护机制

在大规模的微服务集群中,Eureka 的自我保护机制起到了非常重要的作用。自我保护机制 是为了解决网络不稳定导致的心跳丢失问题而设计的。它允许 Eureka Server 在短时间内收到大量心跳丢失信号时,不立即将服务实例剔除出注册表,防止因为网络抖动或短暂的故障而导致系统误判服务不可用。

当 Eureka Server 检测到心跳丢失率超过了配置的阈值(通常是 85%),自我保护机制会启动,Eureka Server 会停止剔除服务实例,同时保持注册表中的所有服务信息。

自我保护机制的配置项:

eureka:
  server:
    enable-self-preservation: true  # 开启自我保护机制(默认开启)
    renewal-threshold-update-interval-ms: 10000  # 自我保护机制的触发时间间隔

通过自我保护机制,Eureka Server 能够在网络不稳定或大规模实例出现故障时,避免过早剔除服务,并且在网络恢复后重新接收心跳信号。

4.5 集群环境下的心跳机制

在实际生产环境中,Eureka 通常会部署为多个 Eureka Server 实例来组成一个集群。Eureka Server 之间会同步注册表信息,确保整个集群中的注册表数据一致。在这种集群环境下,心跳检测机制同样适用于所有服务实例,它们会向多个 Eureka Server 实例发送心跳信号。

通过配置 defaultZone 指定多个 Eureka Server 地址,客户端可以向多个 Eureka Server 进行注册和发送心跳:

eureka:
  client:
    service-url:
      defaultZone: http://eureka-server1:8761/eureka/,http://eureka-server2:8761/eureka/

在这种集群环境下,如果某个 Eureka Server 实例因故障无法工作,Eureka Client 会继续与其他可用的 Eureka Server 实例保持通信,确保服务注册和发现功能的高可用性。

5. 常见问题及解决方案

在使用 Eureka 的过程中,可能会遇到以下常见问题。我们将逐一讨论并提供解决方案。

5.1 Eureka Client 无法注册到 Eureka Server

问题描述:Eureka Client 启动后,无法成功注册到 Eureka Server,可能是由于网络问题或配置错误。

解决方案

  1. 确认 Eureka Server 的地址在

    application.yml
    

    中配置正确:

    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
  2. 确认 Eureka Server 正在运行,并且可以通过浏览器访问管理页面(http://localhost:8761)。

5.2 服务实例被错误注销

问题描述:在某些情况下,由于网络抖动或服务临时不可用,Eureka Server 会错误地将服务实例注销。

解决方案:启用 Eureka 的自我保护机制,防止错误的服务注销:

eureka:
  server:
    enable-self-preservation: true

自我保护机制会在短暂的网络问题发生时,防止服务被误注销。

5.3 服务调用失败,无法找到服务实例

问题描述:服务调用失败,显示无法找到所需的服务实例。这通常发生在服务刚启动或发生故障后,Eureka Client 的注册表还没有及时更新。

解决方案

  • 增加 Eureka Client 的注册表刷新频率,通过以下配置项调整:

    eureka:
      client:
        registry-fetch-interval-seconds: 5  # 每5秒刷新一次注册表
    
5.4 Eureka Server 集群之间的注册表同步延迟

在集群环境下,Eureka Server 之间通过注册表同步保持数据一致性。如果同步延迟较大,可能会导致某个 Eureka Server 无法及时获取其他服务器上最新的服务状态,影响服务发现的准确性。

  • 解决方案 :

    1. 调整同步频率:可以通过 Eureka Server 的 eureka.server.response-cache-update-interval-ms 配置项调整注册表的同步频率,减少数据延迟。默认情况下,该参数设置为 30 秒,适当调低该值可以提高同步的及时性。
    2. 网络优化:Eureka Server 之间的同步延迟有时是由网络问题引起的。可以通过优化网络拓扑结构和降低跨数据中心的网络延迟来提升同步性能。
eureka:
  server:
    response-cache-update-interval-ms: 5000  # 注册表更新间隔设置为5秒
5.4 Eureka Client 注册失败或注册超时

当 Eureka Client 无法成功注册到 Eureka Server 时,电商交易系统中的某些微服务将无法被发现和调用,导致请求失败。这种情况通常与网络不通、Eureka Server 停止服务或 Eureka Client 配置错误有关。

  • 解决方案 :

    1. 检查 Eureka Server 状态:确保 Eureka Server 正常启动并能够接收请求。
    2. 网络连通性检查:检查 Eureka Client 所在的服务器与 Eureka Server 之间的网络连通性,确保没有防火墙、端口阻塞或网络不通的情况。
    3. 调整超时配置:在某些情况下,网络延迟或负载较高时可能导致注册请求超时。可以适当调整 Eureka Client 的连接和读取超时参数,如 eureka.client.eureka-server-connect-timeout-secondseureka.client.eureka-server-read-timeout-seconds,以适应不同的网络条件。
eureka:
  client:
    eureka-server-connect-timeout-seconds: 5  # 连接超时5秒
    eureka-server-read-timeout-seconds: 5  # 读取超时5秒
5.5 Eureka 服务实例过载导致性能问题

当集群中有大量服务实例注册到 Eureka Server 时,Eureka Server 需要处理大量的心跳检测、注册和同步请求,可能导致 Eureka Server 的性能下降,影响整个微服务架构的稳定性。

  • 解决方案:

    1. 分区部署:可以根据微服务的负载将 Eureka Server 部署为多个分区,并将不同的服务注册到不同的 Eureka Server 上,分散负载。
    2. 增加 Eureka Server 实例:增加 Eureka Server 的节点数量,形成更大的 Eureka 集群,以处理更多的请求和心跳检测。
    3. 缓存优化:Eureka Server 会将服务注册表缓存到内存中,以减少每次请求时的数据库访问。通过调节 eureka.server.response-cache-update-interval-ms 参数,可以提高缓存的更新频率,减少直接查询数据库的压力。
eureka:
  server:
    response-cache-auto-expiration-ms: 30000  # 缓存过期时间设置为30秒
    response-cache-update-interval-ms: 5000  # 缓存更新间隔设置为5秒
5.6 服务实例的频繁上下线

如果服务实例频繁上线和下线,可能导致 Eureka Server 频繁更新注册表,并发送大量的同步请求,影响整个系统的稳定性。这种情况通常与微服务实例的不稳定、网络抖动或配置错误有关。

  • 解决方案 :

    1. 稳定微服务实例:首先需要检查导致服务实例频繁下线的原因,可能与资源不足、内存泄漏或其他错误有关。确保服务实例的稳定性是解决该问题的关键。
    2. 调整剔除时间阈值:可以适当调大 lease-expiration-duration-in-seconds 参数,延长服务实例被剔除的时间,以防止因网络短暂抖动导致实例频繁上下线。
eureka:
  instance:
    lease-expiration-duration-in-seconds: 120  # 延长剔除时间到120秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】vue-admin-template项目搭建

准备 node环境 node&#xff1a;v16.12.0npm&#xff1a;8.1.0 vue-element-admin下载 官网&#xff1a;https://panjiachen.github.io/vue-element-admin-site/guide/ 我这边下载的是4.4.0版本的&#xff0c;使用其他版本可能会因为所需要的node和npm版本过低或过高导致异常…

C++/CLI编程-属性property的封装实现

1.前言 上一篇博文中提到过C/CLI典型使用场景之一是为native C编写的算法封装接口&#xff0c;进而在C#项目中调用。一种典型的应用是作为Wrapper封装层来封装C库的类和接口、做C/C#类型的转换&#xff0c;然后在C#应用程序中调用&#xff0c;开发便捷易用的应用程序。 C/CLI编…

Bellman-Ford算法和SPFA算法

Bellman-Ford算法 能够处理存在负边权的情况。 算法时间复杂度:O(n*m)&#xff0c;n是顶点数&#xff0c;m是边数。 算法实现: 设s为起点&#xff0c;dis[v]即为s到v的最短距离&#xff0c;pre[v]为v前驱。w[j]是边j的长度&#xff0c;且j连接u、v。 dis[s] 0;dis[v] 0x3…

(Linux驱动学习 - 5).Linux 下 DHT11 温湿度传感器驱动编写

DHT11的通信协议是单总线协议&#xff0c;可以用之前学习的pinctl和gpio子系统完成某IO引脚上数据的读与写。 一.在设备树下添加dht11的设备结点 1.流程图 2.设备树代码 &#xff08;1&#xff09;.在设备树的 iomuxc结点下添加 pinctl_dht11 &#xff08;2&#xff09;.在根…

探索大型语言模型在文化常识方面的理解能力与局限性

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2405.04655v1 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;不仅被广泛应用于各个领域&#xff0c;而且通过大量的基准评估&#xff0c;证明它们能够理解人类所拥有的常识&#xff08;Commonsense&#xff09;…

FLUX的ID保持项目也来了! 字节开源PuLID-FLUX-v0.9.0,开启一致性风格写真新纪元!

之前的文章已经和大家介绍过字节开源的ID保持项目PuLID。随着FLUX模型的发布&#xff0c;PuLID也开源了 FLUX 版本的模型&#xff0c;不得不说FLUX的强大&#xff0c;两个月生态就赶上了SDXL。这次新发布PuLID-FLUX-v0.9.0模型&#xff0c;它为FLUX.1-dev提供了无需调整的ID定制…

简单部署vue+springboot项目

vue 参考博客 先将vue项目打包 npm run build 再创建项目文件夹front,在front中新建nginx.conf server {listen 80;server_name localhost;# 请求体的大小限制client_max_body_size 50m;# 日志文件存放地址access_log /var/log/nginx/host.access.log main;error…

嵌入式知识点复习(一)

国庆倒数第二天&#xff0c;进行嵌入式课堂测试的复习&#xff1a; 第一章 绪论 1.1 嵌入式系统的概念 嵌入式系统定义 嵌入式系统定位 嵌入式系统形式 嵌入式系统三要素 嵌入式系统与桌面通用系统的区别 1.2 嵌入式系统的发展历程 微处理器的演进历史 单片机的演进历史 …

学习使用Cube软件

一、点亮LED灯 1、新建项目 File → New → STM32 Project搜索芯片信号项目名称 弹窗点击Yes 2、点亮LED 配置GPIO为输出模式 细化配置 保存&#xff08;ctrl S&#xff09;自动生成代码 手动生成代码 选择跳转到代码页面

【d60】【Java】【力扣】509. 斐波那契数

思路 要做的问题&#xff1a;求F&#xff08;n&#xff09;, F&#xff08;n&#xff09;就等于F(n-1)F(n-2)&#xff0c;要把这个F(n-1)F(n-2)当作常量&#xff0c;已经得到的值&#xff0c; 结束条件&#xff1a;如果是第1 第2 个数字的时候&#xff0c;没有n-1和n-2,所以…

系统设计,如何设计一个秒杀功能

需要解决的问题 瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法 前端设计 利用 CDN 缓存静态资源&#xff0c;减轻服务器的压力在前端随机限流按钮防抖&#xff0c;防止用户重复点击 后端设计 Nginx 做统一接入&#xff0c;进行负载均衡与限流用 sentinel 等…

Kron Reduction消去法如何操作,矩阵推导过程

三阶矩阵消去单节点 在电力系统中,母线上的电流注入始终为0,这样的节点可以通过一定的方法消除。以三节点为例,假设注入节点3的电流为0,则: [ I 1 I 2 I 3 ] = [ I 1 I 2 0 ] = [ Y 11 Y 12 Y 13 Y 21 Y 22 Y 23 Y 31 Y 32 Y 33 ] [ V 1 V 2 V 3 ] \left[\begin{array}{…

交叉熵的数学推导和手撕代码

交叉熵的数学推导和手撕代码 数学推导手撕代码 数学推导 手撕代码 import torch import torch.nn.functional as F# 二元交叉熵损失函数 def binary_cross_entropy(predictions, targets):# predictions应为sigmoid函数的输出&#xff0c;即概率值# targets应为0或1的二进制标…

一个值得关注的3D生成新算法:速度和图像生成平齐,能生成合理的展开贴图和高质量mesh

今天跟大家介绍的GIMDiffusion是一种新的Text-to-3D模型&#xff0c;利用几何图像&#xff08;Geometry Images&#xff09;来高效地表示3D形状&#xff0c;避免了复杂的3D架构。通过结合现有的Text-to-Image模型如Stable Diffusion的2D先验知识&#xff0c;GIMDiffusion能够在…

系统架构设计师论文《论NoSQL数据库技术及其应用》精选试读

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

LeetCode讲解篇之139. 单词拆分

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个数组记录字符串s在[0, i)区间能否使用wordDict组成 我们使用左右指针遍历字符串s的子串&#xff0c;左指针 j 为子串的左端点下标&#xff0c;右指针 i 为右端点下标的下一个 遍历过程中如果字符串s…

利士策分享,哀牢山:网红打卡地背后的探险风险

利士策分享&#xff0c;哀牢山&#xff1a;网红打卡地背后的探险风险 最近&#xff0c;云南的哀牢山因其独特的自然风光和神秘探险氛围而迅速走红网络。许多游客&#xff0c;特别是户外探险爱好者&#xff0c;纷纷涌入这片神秘的山脉&#xff0c;想要亲身体验那份原始与野性的…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-06

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-06 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-06目录1. A LLM-Powered Automatic Grading Framework with Human-Level Guidelines Optimization摘要&#xff1a;研究背景&…

MATLAB智能优化算法-学习笔记(4)——灰狼优化算法求解旅行商问题【过程+代码】

灰狼优化算法(Grey Wolf Optimizer, GWO)是一种基于灰狼社会行为的元启发式算法,主要模拟灰狼群体的捕猎行为(包括围攻、追捕、搜寻猎物等过程)。多旅行商问题(Multi-Traveling Salesman Problem, mTSP)是旅行商问题(TSP)的扩展,它涉及多个旅行商(车辆)从一个起点城…