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

0、认识Eureka

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

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

  2. Eureka 包含两个组件∶Eureka Server 和 **Eureka 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: false
    service-url:
      #设置与eureka server 交互模块, 查询服务和注册服务都需要依赖这个地址
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #相互注册,这里应该注册到eureka server9002
      defaultZone: 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: true
    service-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-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      #defaultZone: http://localhost:9001/eureka
      defaultZone: 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 ConsumerService ProviderEurekaServer的维护机制

三者的协同流程​

  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端每隔两秒就在删除超时的服务

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

相关推荐
古城小栈1 天前
微服务网格:Istio 流量管理实战
微服务·架构·istio
ChaITSimpleLove1 天前
基于 .NET Garnet 1.0.91 实现高性能分布式锁(使用 Lua 脚本)
分布式·.net·lua
檀越剑指大厂1 天前
查看 Docker 镜像详情的几种常用方法
docker·容器·eureka
原神启动11 天前
Kafka详解
分布式·kafka
yumgpkpm1 天前
Iceberg在Hadoop集群使用步骤(适配AI大模型)
大数据·hadoop·分布式·华为·zookeeper·开源·cloudera
rocksun1 天前
Tigris对象存储正式开源MCP OIDC身份提供商
redis·安全·微服务
元气满满-樱1 天前
分布式LNMP部署
分布式
Wang's Blog1 天前
RabbitMQ: 声明式配置简化管理
分布式·rabbitmq
叫致寒吧1 天前
zookeeper与kafka
分布式·zookeeper·云原生
赵得C1 天前
2025下半年软件设计师考前几页纸
java·开发语言·分布式·设计模式·性能优化·软考·软件设计师