Eureka集群搭建

Eureka集群

Eureka是基于AP的分布式服务注册中心,集群中所有的Server节点都互为对方的备份,可以把所有的节点都看作是Master节点,也可以把所有的节点都看作是Slave节点,任一节点接收到新的服务注册请求后,都会在registry完成之后同步给其他的Server节点,续约操作renew和registry的逻辑一样。

image-20200411134658642

当集群中一个Server节点宕机之后,Client会把自动切换到存活的节点,由于集群中的所有Server之间是相互同步的,所以各个Server节点之间的信息是相同的,除非是在一个Client刚注册到Server1还未同步给其他节点时宕机了,会造成信息不一致的情况,但当节点将续约请求发送给其他节点时,如果这个节点没有这个Client的信息,则会重新进行registry,并同步给集群中的其他节点。

image-20200411134915369

因为Eureka集群是基于AP的,所以只要有一个Server节点可用,那么整个集群就是可用的,每一个Server节点都有一个server_id属性,当节点宕机后,会选择server_id值靠的最近的Server接收宕机节点的请求。

搭建集群

Eureka Server搭建很简单,最主要的就是节点配置文件的内容

  1. Eureka Server
  • peer1
1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 9001 #服务端口
eureka:
instance:
hostname: peer1
client:
register-with-eureka: false #是否将eureka自身作为应用注册到eureka注册中心
fetch-registry: false #为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://peer2:9002/eureka/,http://peer3:9003/eureka/
server:
enable-self-preservation: false
  • peer2
1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 9002 #服务端口
eureka:
instance:
hostname: peer2
client:
register-with-eureka: false #是否将eureka自身作为应用注册到eureka注册中心
fetch-registry: false #为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://peer1:9001/eureka/,http://peer3:9003/eureka/
server:
enable-self-preservation: false
  • peer3
1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 9003 #服务端口
eureka:
instance:
hostname: peer3
client:
register-with-eureka: false #是否将eureka自身作为应用注册到eureka注册中心
fetch-registry: false #为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://peer1:9001/eureka/,http://peer2:9002/eureka/
server:
enable-self-preservation: false
  1. Eureka Client
1
2
3
4
5
6
server.port=7080
spring.application.name=eureka-health
eureka.client.service-url.defaultZone=http://127.0.0.1:9001/eureka/
eureka.instance.health-check-url-path=/cc/health
eureka.instance.lease-renewal-interval-in-seconds=5
eureka.instance.lease-expiration-duration-in-seconds=15

在客户端的defaultZone不论设置集群中的哪一个节点或哪几个节点,整个集群的所有节点都会有这个Client的注册信息,这就是因为Server节点的replicate功能。

image-20200411143623870

当我们关闭掉其他Server节点,只留一个可用节点的时候,注册中心仍然可以提供服务。但如果我们在Client的defaultZone只设置一个节点的信息的话,那么在这个节点宕机之后,Client就找不到可以继续renew的节点了,最终整个集群都收不到这个Client的续约,在lease-expiration-duration-in-seconds之后,集群会将这个Client从服务列表移除,这损失可就太大了。

所以应该把Server和Client节点的defaultZone要设置齐全。Client把所有Server节点都设置进来,Server节点也把所有的Server节点都设置进来。

集群参数

1
2
3
4
5
6
7
8
# Eureka Server启动时,从远程Eureka Server读取不到注册信息时,多长时间不允许Client访问,默认5分钟
eureka.server.wait-time-in-ms-when-sync-empty
# Eureka Server 集群节点更新频率,单位:毫秒,默认10分钟
eureka.server.peer-eureka-nodes-update-interval-ms
# 初始化实例信息到Eureka服务端的间隔时间,单位为秒,默认40秒
eureka.client.initial-instance-info-replication-interval-seconds
# 更新实例信息的变化到Eureka服务端的间隔时间,单位为秒,默认30秒
eureka.client.instance-info-replication-interval-seconds