目录
使用 Eureka 集群搭建实现高可用服务注册中心
前面我们搭建的注册中心只适合本地开发使用,在生产环境中必须搭建一个集群来保证高可用。Eureka 的集群搭建方法很简单:每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。
下面我们以 2 个节点为例来说明搭建方式。假设我们有 master 和 slave1 两台机器,需要做的就是:
-
将 master 注册到 slave1 上面。
-
将 slave1 注册到 master 上面。
如果是 3 台机器,以此类推:
-
将 master 注册到 slave1 和 slave2 上面。
-
将 slave1 注册到 master 和 slave2 上面。
-
将 slave2 注册到 master 和 slave1 上面。
搭建步骤
前面单机的时候 Eureka 注册中心实例名称 是 localhost ,现在是集群,不能三个实例都是 localhost,这里复杂的办法是搞三个虚拟机,简单办法,直接配置本机 hosts,来实现本机域名映射,找到 C:\Windows\System32\drivers\etc
(如果你使用的是 osx、Linux 系统。可以找到/etc/hosts
文件)打开 hosts,加配置:
127.0.0.1 eureka-master.com
127.0.0.1 eureka-slave1.com
#127.0.0.1 eureka-slave2.com
创建一个新的 module 模块 blog-eureka-server-cluster,配置跟 blog-eureka-server 一样。
首先,我们需要增加 2 个属性文件,在不同的环境下启动不同的实例。
增加 application-master.properties
:
eureka:
client:
service-url:
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka-slave1.com:8762/eureka/
instance:
hostname: eureka-master.com
server:
port: 8761
增加 application-slave1.yml
:
eureka:
client:
service-url:
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka-master.com:8761/eureka/
instance:
hostname: eureka-slave1.com
server:
port: 8762
在 application.yml
中添加下面的配置:
spring:
profiles:
active: master
application:
name: blog-eureka-server-cluster # app名称
security:
user:
name: admin
password: admin
eureka:
client:
# 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为 false
fetch-registry: false
# 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
register-with-eureka: false
在 A 机器上默认用 master 启动,然后在 B 机器上加上 --spring.profiles.active=slave1
启动即可。 这样就将 master 注册到了 slave1 中,将 slaveone 注册到了 master 中,无论谁出现问题,应用都能继续使用存活的注册中心。
之前在客户端中我们通过配置 eureka.client.service-url.defaultZone
来指定对应的注册中心,当我们的注册中心有多个节点后,就需要修改 eureka.client.service-url.defaultZone
的配置为多个节点的地址,多个地址用英文逗号隔开即可:
eureka.client.service-url.defaultZone=http://admin:admin@eureka-master.com:8761/eureka/,http://admin:admin@eureka-slave1.com:8762/eureka/
其实客户端配置任意一个节点即可,Eureka 会同步每个节点的实例信息。
可能你会看到:It seems to be a socket read timeout exception, it will retry later. if it continues to happen and some eureka node occupied all the cpu time, you should set property 'eureka.server.peer-node-read-timeout-ms' to a bigger value.
eureka.server.peer-node-read-timeout-ms
集群节点之间读取超时时间默认200ms,设置大一点值即可。