在微服务架构这样的分布式环境中,所有的微服务都要注册到注册中心中,那么如果这侧中心发生了故障,结果整个系统都将无法使用,这就需要构建高可用的注册中心。
构建高可用的服务注册中心以增强系统的可用性:在Eureka的服务治理设计中,所有节点既是服务提供方,也是服务消费方,服务注册中心也不例外。
Eureka Server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务注册清单的互相同步,达到高可用的效果。
还记得我们在搭建单节点的服务注册中心时,在application.properties中配置了下面两个参数,让服务注册中心不注册自己:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
模拟高可用的服务注册中心,我们来构建一个双节点的服务注册中心集群:
一、在/etc/hosts文件中添加对peer1和peer2的转换,让下面配置的host形式的serviceUrl能在本地访问到(Windows系统路径为C:\Windows\System32\drivers\etc\hosts):
127.0.0.1 peer1
127.0.0.1 peer2
二、打开我们之前所搭建的注册中心的项目
在src\main\resources\目录下创建application-peer1.properties作为peer1服务中心的配置,并将server-url指向peer2:
#应用名 spring.application.name=eureka-server #提供服务端口1111 server.port=1111 #提供服务的域名,这里在hosts文件中修改了 eureka.instance.hostname=peer1 #向peer2注册中心注册自己 eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
在src\main\resources\目录下创建application-peer2.properties作为peer2服务中心的配置,并将server-url指向peer1:
#应用名称与第一个注册中心一样 spring.application.name=eureka-server #提供服务端口1112 server.port=1112 #提供服务的域名,这里在hosts文件中修改了 eureka.instance.hostname=peer2 #向第一个注册中心注册自己 eureka.client.service-url.defaultZone=http://peer1:1111/eureka/
三、将应用打为jar包:使用mvn package命令
出现以下BUILD SUCCESS字样,证明打包成功:
打好的jar包位于target目录下:
四、通过命令参数的方式启动peer1和peer2:spring-profiles-active
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
首先我们要先进入到target目录下:cd target
通过java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1命令来启动peer1:
再次以同样的方式来启动peer2。
五、访问注册中心
访问peer1的注册中心:http://localhost:1111/,如下图所示,我们可以看到,registered-replicas中已经有peer2节点的eureka-server了。并且该节点在可用分片之中(available-replicase)。
访问peer1的注册中心:http://localhost:1112/,如下图所示,我们可以看到,registered-replicas中已经有peer1节点的eureka-server了。并且该节点在可用分片之中(available-replicase)。
我们可以尝试关闭peer1,在appication-peer1.properties中添加:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
再次刷新http://localhost:1112/,可以看到peer1的节点变为了不可用分片(unabliable-replicase):
六、服务提供方也要做一些简单的配置才能将服务注册到Eureka Server集群中,上一篇文章中的hello-service为例,修改application.properties配置文件:
#为服务命名 spring.application.name=hello-service #指定服务注册中心地址,多个注册中心以,隔开 eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/,
上面的配置主要对eureka.client.service-url.defaultZone属性做了改动,将注册中心指向了之前我们搭建的peer1和peer2。
启动服务提供者和peer1、peer2,访问http://localhost:1111/和http://localhost:1112/,可以观察到hello-service服务同时被注册到了peer1和peer2上。
这时,如果我们断开了peer1,由于hello-service同时也向peer2注册,因此在peer2上的其他服务依然可以访问到hello-service,从而实现了服务注册中心的高可用。
注意:如果我们不想使用主机名来定义注册中心,也可以使用IP地址的形式,但是需要在配置文件中增加配置参数eureka.instance.prefer-ip-address=true,改值默认为false。