SpringCloud之Eureka基础认识-服务注册中心
0、认识Eureka
Eureka 是 Netflix 开源的服务发现组件,后来被集成到 Spring Cloud 生态中,成为 Spring Cloud Netflix 的核心模块之一。它主要用于解决分布式系统中服务注册与发现的问题。
-
Eureka Server 有必要的话,也可以做成集群
-
Eureka 包含两个组件∶Eureka Server 和 Eureka Client(服务提供端(Provider)和服务消费端(Consumer))
-
Eureka Server 提供注册服务, 各个微服务节点通过配置启动后,会在 Eureka Server 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
- 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 的维护机制
三者的协同流程
- 服务注册:
Provider(MEMBER-SERVICE:10000
)启动 → 向 Eureka Server(9001
)注册 - 服务发现:
Consumer(80
端口应用)需要调用服务时 → 从 Server 获取 Provider 地址 - 服务调用:
Consumer 通过 HTTP Client(如RestTemplate/Feign)访问 Provider - 状态维护:
- 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秒更新一次远程调用地址,提高分布式系统可用性
- 通过服务别名在 Eureka Server 查询获取真实调用地址,获取实际的RPC(Remote Procedure Call 远程过程调用)远程地址,实际上是HttpClient技术实现(通过
- 本地缓存:将服务地址缓存到JVM内存,避免每次调用都访问 Server,直接去访问provider端
- 负载均衡:结合Ribbon等组件从多个Provider实例中选择一个(如轮询、权重)
- 故障恢复:调用失败时自动重试或切换其他实例
- 服务发现:
4.自我保护模式
- 默认情况下EurekaClient定时向EurekaServer端发送心跳包
- 如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务注册列表中剔除该服务
- 如果Eureka 开启了自我保护模式/机制, 那么在短时间(90秒中)内丢失了大量的服务实例心跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通或者阻塞) 因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的
- 自我保护是 属于 CAP 里面的 AP 分支, 保证高可用和分区容错性
- 自我保护模式是—种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务(容忍你一段时间不心跳) 。 使 用 自 我 保 护 模 式 , 可 以 让 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端每隔两秒就在删除超时的服务
出现红字,代表自我保护机制已经出现了