Eureka Server除了单点运行之外,还可以通过运行多个实例,并进行互相注册的方式来实现高可用的部署。所以我们只需要将Eureke Server配置其他可用的 serviceUrl 就能实现高可用部署。
下面我们在上篇文章的基础上来实现Eureka Server的高可用部署。部署图如下图所示:
将 application.yml 文件复制三分:application-9001.yml,application-9002.yml,application-9003.yml,分别添加配置项如下:
application-9001.yml
spring:
application:
name: eureka-server
security:
user:
name: lpf
password: root
server.port: 9001
eureka:
instance:
hostname: eureka-9001.com
instance-id: eureka-9001
client:
service-url:
defaultZone: http://lpf:root@eureka-9002.com:9002/eureka,http://lpf:root@eureka-9003.com:9003/eureka
logging.level.root: info
application-9002.yml
spring:
application:
name: eureka-server
security:
user:
name: lpf
password: root
server.port: 9002
eureka:
instance:
hostname: eureka-9002.com
instance-id: eureka-9002
client:
service-url:
defaultZone: http://lpf:root@eureka-9001.com:9001/eureka,http://lpf:root@eureka-9003.com:9003/eureka
logging.level.root: info
application-9003.yml
spring:
application:
name: eureka-server
security:
user:
name: lpf
password: root
server.port: 9003
eureka:
instance:
hostname: eureka-9003.com
instance-id: eureka-9003
client:
service-url:
defaultZone: http://lpf:root@eureka-9001.com:9001/eureka,http://lpf:root@eureka-9002.com:9002/eureka
logging.level.root: info
最后,在 hosts 文件中添加如下内容:
127.0.0.1 eureka-9001.com
127.0.0.1 eureka-9002.com
127.0.0.1 eureka-9003.com
注意:要把 application.yml 文件中的内容注释掉,否则会影响 Eureka 的集群部署。因为Spring Boot优先加载 application.yml 中的内容。
最后的最后,通过 spring.profiles.active 属性来分别启动三台服务器:
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9001
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9002
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9003
怎样在 IDEA 下打包,参考这里:idea打包java可执行jar包
此时访问 9001 的注册中心:http://eureka-9001.com:9001/ ,如下图所示,我们可以看到 registered-replicas 中已经有 9002 和 9003 节点的 eureka-server 了。同样地,访问 9002 的注册中心:http://eureka-9002.com:9002/ ,能看到 registered-replicas 中已经有 9001 和 9003 节点,并且这些节点在可用分片(available-replicase)之中。我们也可以尝试关闭 9001,刷新http://eureka-9002.com:9002/ ,可以看到 9001 的节点变为了不可用分片(unavailable-replicas)。
相信很多小伙伴在实验的时候都会出现这样一个问题:节点出现在 unavailable-replicas 下。下面我们来说一下可能的几种原因:
原因一:prefer-ip-address 配置项设置错误
比如,9001 服务器设置了prefer-ip-address: true,那么它注册到 9002 和 9003 服务器时应该使用 defaultZone:http://yourIP:9001/eureka/ ,但此时可以发现使用的仍然是 hostname 名,导致错误发生。
另一种原因是,三个9001、9002 和 9003 都设置了prefer-ip-address: true,导致最后解析出来的 hostname 都是相同的IP,使副本不可用。
原因二:register-with-eureka 配置项设置错误
看网上很多博客和资料都把此项设置成了 false,此时 eureka 不会注册到其他服务器上,所以出现错误。
原因三:其他原因
还有一些其他原因大家可以参考这里:Eureka高可用,节点均出现在unavailable-replicas下
大家有没有一个疑问:服务实例的注册信息会在各个 eureka server 之间同步,那么,如果几个服务器的某个配置参数不一致会出现什么情况,比如:eureka.server.eviction-interval-timer-in-ms: 7000。
经过测试,每个服务器会按照自己配置的时间间隔清理注册表。