SpringCloud之Eureka基础认识-服务注册中心

0、认识Eureka

Eureka 是 Netflix 开源的服务发现组件,后来被集成到 Spring Cloud 生态中,成为 Spring Cloud Netflix 的核心模块之一。它主要用于解决分布式系统中​​服务注册与发现​​的问题。

  1. Eureka Server 有必要的话,也可以做成集群

  2. Eureka 包含两个组件∶Eureka ServerEureka Client(服务提供端(Provider)​​和​​服务消费端(Consumer)

  3. Eureka Server 提供注册服务, 各个微服务节点通过配置启动后,会在 Eureka Server 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。

  4. EurekaClient 通过注册中心进行访问, 是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin) 负载算法的负载均衡器。在应 用启动后,将会向 Eureka Server 发送心跳(默认周期为 30 秒)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除(默认 90 秒)

1、如何创建Eureka

 1.建议单独的创建一个模块,然后配置yaml文件

server:port: 9001#配置eureka-server
eureka:instance:hostname: eureka9001.com #服务实例名client:#配置不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心,作用就是维护注册服务实例, 不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server 交互模块, 查询服务和注册服务都需要依赖这个地址#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/#相互注册,这里应该注册到eureka server9002defaultZone: http://eureka9002.com:9002/eureka/
#  server:
#    #禁用自我保护模式
#    enable-self-preservation: false
#    #设置超时时间为2秒,在2秒钟,收不到心跳包,就认为是超时
#    eviction-interval-timer-in-ms: 2000

第二步再启动代码中加入注解,@EnableEurekaServer 表示该程序作为 EurekaServer

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

当然,必不可少的pom依赖

<dependencies><!--引入eureka-server 场景启动器starter: 使用版本仲裁--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
</dependencies>

完成后可以访问http://localhost:9001查看仪表盘

2、将服务提供端和服务消费端作为Eureka Client注册到Eureka Server

老规矩引入依赖,消费端和提供端都要

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改Client的yaml文件和启动类

provider:

#配置eureka-client
eureka:client:register-with-eureka: true #将自己注册到Eureka-Server#表示从Eureka-Server 抓取注册信息#如果是单节点,是可以不配置的,但是如果是一个集群,则必须配置true,#才能配合Ribbon使用负载均衡fetch-registry: trueservice-url:#表示将自己注册到哪个eureka-server#将本微服务注册到多个eureka-server ,使用逗号间隔即可defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
#  instance:
#    #客户端向服务端发送心跳的时间间隔 1s(默认是30)
#    lease-renewal-interval-in-seconds: 1
#    #服务端收到最后一次心跳后等待的时间上限
#    #时间单位(秒),默认是90s, 超时将剔除服务
#    lease-expiration-duration-in-seconds: 2

 @EnableEurekaClient 将程序标识为eureka client

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

consume:

#配置eureka-client
eureka:client:register-with-eureka: true #将自己注册到Eureka-Serverfetch-registry: trueservice-url:#表示将自己注册到哪个eureka-server#这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔#defaultZone: http://localhost:9001/eurekadefaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

@EnableEurekaClient 将程序标识为eureka client

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

启动之后可以访问http://localhost:9001查看,昵称是yaml文件中的昵称 

3.Service Consumer Service Provider EurekaServer 的维护机制

三者的协同流程​

  1. ​服务注册​​:
    Provider(MEMBER-SERVICE:10000)启动 → 向 Eureka Server(9001)注册
  2. ​服务发现​​:
    Consumer(80端口应用)需要调用服务时 → 从 Server 获取 Provider 地址
  3. ​服务调用​​:
    Consumer 通过 HTTP Client(如RestTemplate/Feign)访问 Provider
  4. ​状态维护​​:
    • Provider 持续发送心跳
    • Server 定时清理失效实例
    • Consumer 定期更新服务列表

Eureka Server(注册中心)​

  • ​核心职责​
    • 维护所有服务的注册信息(服务名 → 调用地址的映射)
    • 提供服务的注册、发现、续约和剔除功能
  • ​关键机制​
    • ​服务注册表​​:存储服务提供者的元数据(IP、端口、健康状态等)
    • ​心跳机制​​:通过 Provider 的定期心跳(默认30秒)判断服务存活,超时(默认90秒)自动剔除失效实例
    • ​自我保护模式​​:当超过85%实例心跳丢失时,暂停剔除操作,防止网络分区导致误删
    • 定期清理任务​​:默认每60秒检查并清理过期实例

Service Provider(服务提供方)​

  • ​核心职责​
    • 向 Eureka Server 注册自身服务信息
    • 维持服务的可用状态
  • ​关键机制​
    • ​启动注册​​:启动时提交注册请求(包含服务名、IP、端口等),详情参考yaml文件

 Service Consumer(服务消费方)​

  • ​核心职责​
    • 从 Eureka Server 获取服务提供者地址
    • 发起远程调用(如HTTP/RPC)
  • ​关键机制​
    • ​服务发现​​:
      • 通过服务别名在 Eureka Server 查询获取真实调用地址,获取实际的RPC(Remote Procedure Call  远程过程调用)远程地址,实际上是HttpClient技术实现(通过RestTemplate实现的“RPC”本质是​​HTTP REST调用​​,底层依赖HTTPClient)
      • 默认每30秒更新一次远程调用地址,提高分布式系统可用性
    • ​本地缓存​​:将服务地址缓存到JVM内存,避免每次调用都访问 Server,直接去访问provider端
    • ​负载均衡​​:结合Ribbon等组件从多个Provider实例中选择一个(如轮询、权重)
    • ​故障恢复​​:调用失败时自动重试或切换其他实例

 4.自我保护模式

  • 默认情况下EurekaClient定时向EurekaServer端发送心跳包
  • 如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务册列表中剔除该服务
  • 如果Eureka 开启了自我保护模式/机制, 那么在短时间(90秒中)内丢失了大量的服务实例心跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通或者阻塞) 因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的
  1. 自我保护是 属于 CAP 里面的 AP 分支, 保证高可用和分区容错性
  2. 自我保护模式是—种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务(容忍你一段时间不心跳) 。 使 用 自 我 保 护 模 式 , 可 以 让 Eureka 集 群 更 加 的 健 壮 、 稳 定 。 参 考 :https://blog.csdn.net/wangliangluang/article/details/120626014

在Eureka Server的yaml文件中添加

  server:#禁用自我保护模式enable-self-preservation: false #默认是true#设置超时时间为2秒,在2秒钟,收不到心跳包,就认为是超时eviction-interval-timer-in-ms: 2000

provider:

eureka:instance:#客户端向服务端发送心跳的时间间隔 1s(默认是30)lease-renewal-interval-in-seconds: 1#服务端收到最后一次心跳后等待的时间上限#时间单位(秒),默认是90s, 超时将剔除服务lease-expiration-duration-in-seconds: 3

解释一下:设置这个eviction-interval-timer-in-ms: 2000和设置lease-expiration-duration-in-seconds: 3 的意思就是等待3秒,如果3秒没有发送心跳就标记为超时,与此同时,Eureka server端每隔两秒就在删除超时的服务 

出现红字,代表自我保护机制已经出现了 

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

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

相关文章

【氮化镓】电子辐照下温度对GaN位移阈能的影响

2024年,华东师范大学的彭胜国等人基于从头算分子动力学(AIMD)方法,研究了低能电子束辐照下温度对氮化镓(GaN)位移阈能(TDE)的影响。实验结果表明,在初始动能40至80 eV的范围内,镓(Ga)和氮(N)原子作为初级击出原子(PKAs)引发的位移对温度呈现不同的敏感性:Ga 的…

Java 中的数据类型误导点!!!

在 Java 中&#xff0c;数据类型分为两大类&#xff1a;基本类型&#xff08;Primitive Types&#xff09; 和 引用类型&#xff08;Reference Types&#xff09;。它们的存储方式和行为完全不同。 1. 基本类型 Java 有 8 种基本数据类型&#xff0c;它们直接存储值&#xff…

二次封装 el-dialog 组件:打造更灵活的对话框解决方案

文章目录 引言为什么需要二次封装&#xff1f;封装思路代码实现1. 基础封装组件 (Dialog.vue)2. Vue中引入使用示例 封装后的优势进阶优化建议 总结 引言 在 Vue 项目中&#xff0c;Element UI 的 el-dialog 是一个非常实用的对话框组件。但在实际开发中&#xff0c;我们经常会…

框架篇八股(自用)

框架篇 Spring框架中的bean不是线程安全的 Scope&#xff08;&#xff09; singleton单例 prototype多例 一个类中有可修改的成员变量需要考虑线程安全 bean没有可变状态&#xff08;service类&#xff0c;DAO类&#xff09; 某种程度单例bean是线程安全的 AOP面向切面编程…

Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)

1.protobuf简介 protobuf 即 Protocol Buffers&#xff0c;是一种轻便高效的结构化数据存储格式&#xff0c;与语言、平台无关&#xff0c;可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的&#xff0c;占用空…

rust-candle学习笔记11-实现一个简单的自注意力

参考&#xff1a;about-pytorch 定义ScaledDotProductAttention结构体&#xff1a; use candle_core::{Result, Device, Tensor}; use candle_nn::{Linear, Module, linear_no_bias, VarMap, VarBuilder, ops};struct ScaledDotProductAttention {wq: Linear,wk: Linear,wv: …

spark MySQL数据库配置

Spark 连接 MySQL 数据库的配置 要让 Spark 与 MySQL 数据库实现连接&#xff0c;需要进行以下配置步骤。下面为你提供详细的操作指南和示例代码&#xff1a; 1. 添加 MySQL JDBC 驱动依赖 你得把 MySQL 的 JDBC 驱动添加到 Spark 的类路径中。可以通过以下两种方式来完成&a…

web 自动化之 KDT 关键字驱动详解

一、什么是关键字驱动&#xff1f; 1、什么是关键字驱动&#xff1f;&#xff08;以关键字函数驱动测试&#xff09; 关键字驱动又叫动作字驱动&#xff0c;把项目业务封装成关键字函数&#xff0c;再基于关键字函数实现自动化测试 2、关键字驱动测试原理 关键字驱动测试是一…

Java使用POI+反射灵活的控制字段导出Excel

前端传入哪些字段&#xff0c;后端就导出哪些到Excel表格中&#xff0c;具体代码实现如下 controller /*** 用户导出* param dto*/PostMapping("/exportUser")public void exportCharterOrder(RequestBody UserExportDTO dto){userService.exportUser(dto);} serv…

Qt/C++面试【速通笔记八】—Qt的事件处理机制

在Qt中&#xff0c;事件处理机制是应用程序与用户或系统交互的核心。通过事件处理&#xff0c;Qt能够响应用户的输入、窗口的变化、定时器的触发等各种情况。 1. 事件循环&#xff08;Event Loop&#xff09; 在Qt应用程序中&#xff0c;事件循环是事件处理机制的基础。事件循…

TTL (Time-To-Live) 解析

文章目录 TTL (Time-To-Live) 解析&#xff1a;网络与Java中的应用一、TTL的定义二、TTL在网络中的应用1. **路由和数据包的生命周期**2. **DNS中的TTL**3. **防止环路** 三、TTL在Java中的应用1. **缓存管理**2. **Java中的ThreadLocal**3. **网络通信中的TTL** 四、TTL的注意…

HDFS的客户端操作(2)文件上传

我们向/maven下上传一个文件。 要用到的api是put (或者copyFormLocalFile&#xff09;。核心代码如下。 public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {// 1 获取文件系统Configuration configuration new Configurati…

光谱相机的光电信号转换

光谱相机的光电信号转换是将分光后的光学信息转化为可处理的数字信号的核心环节&#xff0c;具体分为以下关键步骤&#xff1a; 一、分光后光信号接收与光电转换 ‌分光元件作用‌ 光栅/棱镜/滤光片等分光元件将入射光分解为不同波长单色光&#xff0c;投射至探测器阵列表面…

网络协议分析 实验二 IP分片与IPv6

文章目录 索引及重要内容实验2 IP 高级实验实验2.1 IPv4协议分片实验实验2.2 IPV6协议实验2.3 ARP初级 索引及重要内容 实验2 IP 高级实验 实验2.1 IPv4协议分片实验 icmp的不可达报文 实验2.2 IPV6协议 实验2.3 ARP初级 arp –a 查看ARP缓存表内容 arp –s IP地址(格式&…

20、map和set、unordered_map、un_ordered_set的复现

一、map 1、了解 map的使用和常考面试题等等&#xff0c;看这篇文章 map的key是有序的 &#xff0c;值不可重复 。插入使用 insert的效率更高&#xff0c;而在"更新map的键值对时&#xff0c;使用 [ ]运算符效率更高 。" 注意 map 的lower和upper那2个函数&#x…

基于 Amazon Bedrock 和 Amazon Connect 打造智能客服自助服务 – 设计篇

随着 GenAI 技术不断的发展和演进&#xff0c;人工智能技术广泛地被应用在呼叫中心服务领域&#xff0c;主要包括虚拟坐席&#xff08;即自助服务&#xff09;、坐席助手和呼叫中心运营的数据洞察和智能分析。本博客主要针对自助服务应用场景的实现。 1. 传统自助服务系统瓶颈 …

java高效实现爬虫

一、前言 在Web爬虫技术中&#xff0c;Selenium作为一款强大的浏览器自动化工具&#xff0c;能够模拟真实用户操作&#xff0c;有效应对JavaScript渲染、Ajax加载等复杂场景。而集成代理服务则能够解决IP限制、地域访问限制等问题。本文将详细介绍如何利用JavaSelenium快代理实…

【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析

基于OpenCV的车牌识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理1) 自适应光照补偿2) 边缘增强 2.2 车牌定位1) 颜色空间筛选2) 形态学操作3) 轮廓分析 2.3 字符分割1) 投影分析2) 连通域筛选 2.4 字符识别 3. 实战部署指南3.1 环境配置3.2 项目代码解析 4.…

Python核心数据类型全解析:字符串、列表、元组、字典与集合

导读&#xff1a; Python 是一门功能强大且灵活的编程语言&#xff0c;而其核心数据类型是构建高效程序的基础。本文深入剖析了 Python 的五大核心数据类型——字符串、列表、元组、字典和集合&#xff0c;结合实际应用场景与最佳实践&#xff0c;帮助读者全面掌握这些数据类型…

GPT-4.1和GPT-4.1-mini系列模型支持微调功能,助力企业级智能应用深度契合业务需求

微软继不久前发布GPT-4.1系列模型后&#xff0c;Azure OpenAI服务&#xff08;国际版&#xff09;现已正式开放对GPT-4.1和GPT-4.1-mini的微调功能&#xff0c;并通过Azure AI Foundry&#xff08;国际版&#xff09;提供完整的部署和管理解决方案。这一重大升级标志着企业级AI…