在项目中,分布式环境下微服务的治理要充分考虑发生故障的情况,单台Eureka实例是不足以增强系统的可用性的,Eureka是支持高可用集群部署的,Eureka所有的节点即是服务提供方,也是服务消费方,通过如下两个参数配置,默认是true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
Eureka Server的高可用实际上是将自己作为服务向相邻的节点注册自己,形成一组相互注册的服务注册中心,以实现服务清单的相互同步
下面我们用docke-compose搭建eureka集群,这里搭建三个eureka server节点,遵循两两注册原则
application.yml
spring:
application:
name: chu-eureka-ha
management:
security:
enabled: false
security:
basic:
enabled: true
user:
password: chu
name: chu
---
spring:
profiles: peer1
server:
port: 8761
eureka:
server:
enable-self-preservation: false # 开发环境关掉保护机制,快速发现已经挂掉的服务,生产环境需要设置为true提升服务稳定性
instance:
hostname: peer1
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
client:
serviceUrl:
defaultZone: http://chu:chu@peer2:8762/eureka/,http://chu:chu@peer3:8763/eureka/
register-with-eureka: true
---
spring:
profiles: peer2
server:
port: 8762
eureka:
server:
enable-self-preservation: false # 开发环境关掉保护机制,快速发现已经挂掉的服务,生产环境需要设置为true提升服务稳定性
instance:
hostname: peer2
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
client:
serviceUrl:
defaultZone: http://chu:chu@peer1:8761/eureka/,http://chu:chu@peer3:8763/eureka/
register-with-eureka: true
---
spring:
profiles: peer3
server:
port: 8763
eureka:
server:
enable-self-preservation: false # 开发环境关掉保护机制,快速发现已经挂掉的服务,生产环境需要设置为true提升服务稳定性
instance:
hostname: peer3
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
client:
serviceUrl:
defaultZone: http://chu:chu@peer1:8761/eureka/,http://chu:chu@peer2:8762/eureka/
register-with-eureka: true
docker-compose.yml
version: "2"
services:
peer1: # 默认情况下,其他服务可以使用服务名称连接到该服务。因此,对于peer2的节点,它需要连接http://peer1:8761/eureka/,因此需要配置该服务的名称是peer1。
image: chu-eureka-ha:2.0.0-SNAPSHOT
networks:
- eureka-net
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
peer2:
image: chu-eureka-ha:2.0.0-SNAPSHOT
hostname: peer2
networks:
- eureka-net
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2
peer3:
image: chu-eureka-ha:2.0.0-SNAPSHOT
hostname: peer3
networks:
- eureka-net
ports:
- "8763:8763"
environment:
- spring.profiles.active=peer3
networks:
eureka-net:
driver: bridge
运行 docker-compose up -d
他们之间相互维护一个心跳,若开启了Eureka Server自我保护机制,Eureka Server会将服务信息保存起来,让这些实例不会过期,尽可能的保护这些注册信息,当客户端向eureka集群注册时,发现有其他节点出现故障,会出现在不可用分片(unavailable-replicas,)但仍会向另一个正常工作的节点注册,等故障的两个节点排查好问题重新上线,正常的eureka会将客户端注册的请求转发给与它相连的其他注册中心,从而实现注册中心之间服务的同步,