在上一篇中分享了如何使用 Eureka 进行服务治理, 里面搭建的服务注册中心是单体的,
但是在实际的应用中, 分布式系统为了防止单体服务宕机带来严重后果, 一般都会采用服务器集群的形式, 服务注册中心也是一样, 需要多台服务一起工作, 组成高可用的服务注册中心. 这样, 如果有其中一台宕机, 系统也能正常运行.
那么如何来构建高可用的服务注册中心呢?
由于 eureka 注册中心既可以作为服务端 (服务注册中心), 也可以作为客户端 (到别的注册中心注册自己),
我们可以通过在机器上部署 peer1 和 peer2 两个服务, 两个服务相互注册.
一, 代码实现
还是使用上篇文章中的 eureka 服务例子, 在此基础上我们进行修改:
新增 / eureka/src/main/resources/application-peer1.properties
- server.port=1111
- spring.application.name=eureka-service
- # 设定主机名为 peer1
- eureka.instance.hostname=peer1
- #eureka.client.register-with-eureka=false
- #eureka.client.fetch-registry=false
- # 设定 eureka 的 serviceUrl 为 peer2
- eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka
新增 / eureka/src/main/resources/application-peer2.properties
- server.port=1112
- spring.application.name=eureka-service
- eureka.instance.hostname=peer2
- #eureka.client.register-with-eureka=false
- #eureka.client.fetch-registry=false
- # 设定 eureka 的 serviceUrl 为 peer1
- eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka
由于需要 peer1 和 peer2 相互注册, 因此第 1 和第 2 步中, eureka.client.register-with-eureka=false 和 eureka.client.fetch-registry=false 这两个配置就不能要了, 需要注释掉或删掉.
设定 host, 在 C:\Windows\System32\drivers\etc 目录下的 hosts 文件中添加
- 127.0.0.1 peer1
- 127.0.0.1 peer2
以将 peer1 和 peer2 进行解析.
配置两个启动服务
)
)
启动 eureka1 和 eureka2
页面访问 http://localhost:1111/
我们会发现, 在 DS Replicas(分片) 中会有 peer2; 在服务 instance 中会有 2 个, 一个是 1111, 一个是 1112; 在 registered-replicas(注册分片) 和 available-replicas(可用分片) 中出现了 peer2:1112. 同样道理, 我们访问 http://localhost:1112 / 也能看到相似效果. 如果将 peer2 停掉, 那么在访问 http://localhost:1111 / 的时候就会发现 peer2 已经跑到 unavailable-replicas(不可用分片) 中, 具体截图略.
二, 调试中遇到的问题
我在调试以上内容的时候遇到一个问题, 就是在 peer1 和 peer2 一直不能彼此注册成功, 页面表现就是服务 instance 为空并且 available-replicas 为空, 对应的服务在 unavailable-replicas 中. 后来经过多次实现和分析, 终于发现, 原来是在我的 application.properties 文件中还保留着下面两个配置, 服务在启动的时候是会读取到这个配置的,
虽然这两个配置默认是 true, 但是却被 application.properties 覆盖了, 这个时候讲这两个配置注释掉就好了.
如果在 application-{profiles}.properties 中再配置一遍就又可以覆盖 application.properties 里面的配置.
代码读取顺序是这样的:
先读取默认配置 --> 然后读取 application.properties--> 读取 application-{profiles}.properties.
来源: https://www.cnblogs.com/sam-uncle/p/8962170.html