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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Absinthe_苦艾酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值