现在的config-server集群只有一个注册中心,如果注册中心蹦了,将无法正常运行,所以需要搭建高可用的注册中心集群。
现在开始在本机搭建eureka-server集群,使用之前的工程server1。
一.搭建注册中心
1.运行3个server1的实例,无需创建三个工程,在本机搭建集群:
在server1工程中,创建3个配置文件,并且把applicaiton.properties内容注释掉:
三个配置文件端口号分别是:
# 注册到eureka-server的服务名,三个文件必须相同 spring.application.name=server1 # 表示三个配置文件的端口号 server.port=9761/9762/9763 # 表示是否注册自身到eureka服务器,集群下为true,默认值 eureka.client.register-with-eureka=true # 是否从eureka上获取注册信息,集群下为true,默认值 eureka.client.fetch-registry=true # 表示三个配置文件的hostname eureka.instance.hostname=server1/server2/server3 # 提供服务的路径 eureka.client.serviceUrl.defaultZone=http://server2:9762/eureka/,http://server1:9761/eureka/,http://server3:9763/eureka/ |
---|
修改host文件,用127.0.0.1来对应server1 / server2 / server3:
注意:此处是在本机上演示,需要修改Hosts和设置eureka.instance.hostname,如果是在不同的主机上,只需设置:
eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} |
---|
无需修改hosts文件和设置eureka.instance.hostname。
在idea工具中,选择菜单:
创建三个springboot,都是从server1创建,active profile分别是1,2,3,对应之前创建的配置文件:
现在创建好了三个server1工程的副本,分别是server1-1,server1-2,server1-3:
启动这3个工程,然后前往http://localhost:9761/,http://localhost:9762/,http://localhost:9763/ 的任意一个,都可以看到已经注册了三个服务,并且DS Replicas,available-replicas,registered-replicas都是集群中除去自己的另外两个,表示副本,因为eureka-server集群的原理就是相互注册,并且互相复制达到同步配置,所以集群中的一个节点的副本就是除自己之外的其他节点。如果配置文件中将eureka.client.register-with-eureka和eureka.client.fetch-registry的值设置为false,那么服务本身将不会注册到设定的地址,并且available-replicas的内容将会变到unavailable-replicas去,节点之间将无法通信,失去了集群的意义,如下图第三张:
二.config-server集群注册到eureka-server集群
1.改造config-server和config-server2的配置文件,将 eureka.clent.serviceUrl.defaultZone=http://localhost:8761/eureka/
改为 eureka.client.serviceUrl.defaultZone=http://server1:9761/eureka/,http://server2:9762/eureka/,http://server3:9763/eureka/ ,将服务注册到eureka-server集群。
2. 此时启动config-server 和 config-server2工程,在http://localhost:9761/,http://localhost:9762/,http://localhost:9763/ 的任意一个都可以看到,两个config-server的服务已经被注册到注册中心:
三.验证config-client获取配置
1.改造config-client 和 config-client2的配置文件,和config-server的改造方式一样,不再赘述。
2. 启动config-client 和 config-client2工程,在http://localhost:9761/,http://localhost:9762/,http://localhost:9763/ 的任意一个都可以看到,两个客户端已经注册到注册中心:
3. 调用config-client 或者 config-client2的接口,获取到了配置,得到的结果如下,:
4.此时关闭掉2个注册中心,仅剩下server1-1,由于eureka-server的配置中,默认开启了保护模式,所以网页上的管理界面中依旧还有3个server1,但是实际上只有server1-1:
5.修改git中的配置:
6.在rabbitmq开启的情况下,调用任意客户端的/bus/refresh接口:
7.调用config-client 和 config-client2的接口,发现配置都已经更新了:
8.此时将server1-1也关闭,然后调用config-client 和 config-client2的接口,发现依旧可以正常获取到结果,因为config-client中缓存了配置。但此时无法调用接口更新配置,因为注册中心已经全部关闭了,config-server无法再注册。
9.此时开启server1-2工程,保持server1-1和server1-3关闭,打开http://localhost:9762/,另外两个注册中心都到了unavailable-replicas,界面如下:
10.此时再次修改git中的配置:
11.调用config-client 或者 config-client2任意一个的/bus/refresh接口更新配置:
12.访问config-client 和 config-client2 的接口,发现配置已经更新:
至此,实现了注册中心的高可用,只要有一个注册中心还在运行状态,就可以实现服务的注册和发现,当所有的注册中心都崩掉的时候,无法注册和发现服务,但配置已经缓存下来,项目依旧可以运行;此时再开启至少一个注册中心,又可以注册和发现服务了。