购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.6 Eureka Server的高可用

有分布式应用开发经验的读者应该能够看出,前文编写的单节点EurekaServer并不适合线上生产环境。Eureka Client会定时连接Eureka Server,获取服务注册表中的信息并缓存在本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Client中的缓存若不被更新,就可能会影响微服务的调用,甚至影响整个应用系统的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。

4.6.1 编写高可用Eureka Server

Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是EurekaServer的默认行为,还记得前文编写单节点EurekaServer时,额外配置了eureka.client.registerWithEureka=false、eureka.client.fetchRegistry=false吗?

本节在前文的基础上,构建一个双节点Eureka Server集群。

1.复制项目microservice-discovery-eureka,将ArtifactId修改为microservice-discovery-eureka-ha。

2.配置系统的hosts,Windows系统的hosts文件路径是C:\Windows\System32\drivers\etc\hosts;Linux及MacOS等系统的文件路径是/etc/hosts。

img

3.将application.yml修改如下,让两个节点的Eureka Server相互注册。

img
img

如上,使用连字符(---)将该application.yml文件分为三段。第二段和第三段分别为spring.properties指定了一个值,该值表示它所在的那段内容应用在哪个Profile里。第一段由于并未指定spring.profiles,因此这段内容会对所有Profile生效。

经过以上分析,不难理解,我们定义了peer1和peer2这两个Profile。当应用以peer1这个Profile启动时,配置该EurekaServer的主机名为peer1,并将其注册到 http://peer2:8762/eureka/ ;反之,当应用以profile=peer2时,EurekaServer会注册到peer1节点的Eureka Server。

img

测试

1.打包项目,并使用以下命令启动两个Eureka Server节点。

img

通过spring.profiles.active指定使用哪个profile启动。

2.访问 http://peer1:8761 ,会发现“registered-replicas”中已有peer2节点;同理,访问 http://peer2:8762 ,也能发现其中的“registered-replicas”有peer1节点,如图4-6所示。

img

图4-6 高可用的Eureka首页

img

事实上,还可使用更精简的配置方式配置Eureka Server集群,例如:

img
img

4.6.2 将应用注册到Eureka Server集群上

以microservice-provider-user项目为例,只需修改eureka.client.serviceUrl.defaultZone,配置多个Eureka Server地址,就可以将其注册到Eureka Server集群了。示例:

img

这样就可以将服务注册到Eureka Server集群上了。

当然,微服务即使只配置EurekaServer集群中的某个节点,也能正常注册到EurekaServer集群,因为多个Eureka Server之间的数据会相互同步。例如:

img

在正常情况下,这种方式与配置多个Server节点的效果是一样的。不过为适应某些极端场景,笔者建议在客户端配置多个Eureka Server节点。 DcJMfOMRN9jLM28rM/Hp6++q0F5WljiPSd5dSgtD18HEIAEBSa/PtHtSmRQ7OuvL

点击中间区域
呼出菜单
上一章
目录
下一章
×