一直在网上查阅资料,配置高可用的集群,看完了发现还是不明白,或者按照文章的内容一步一步去实现发现根本实现不了,真的很怀疑他们写的时候是否真的自己测试过了还是大家都是转发来转发去的,自己弄了好久,发现没有一个拿来就可以用的,并且里面很多的东西也没有讲解清楚,于是打算自己写一篇总结一下。
环境:IDEA2017,Maven(3.3.9),JDK(1.8),SpringBoot(2.0.3)
本篇文章基于我的Spring Cloud的第一篇文章,可以点击直接跳转,非常简单,就是新建一个SpringBoot配置成Eureka服务端。
服务的注册与发现(Eureka)
之所以进行eureka集群的搭建,在于我们平时的生产环境中,很难保证单节点的eureka服务能提供百分百不间断的服务,如果eureka无响应了,整个项目应用都会出现问题,因此要保证eureka随时都能提供服务的情况下,最好的方式就是采用eureka的集群模式,也就是搭建eureka的高可用,在eureka的集群模式下,多个eureka server之间可以同步注册服务,因此,在一个eureka宕掉的情况下,仍然可以提供服务注册和服务发现的能力,从而达到注册中心的高可用。
我们使用之前的Mall_EurekaCenter模块进行改造
首先:新增两个配置文件分别为application-server1.yml和application-server2.yml
其中application.yml文件如下:
#注册中心应用名称
spring:
application:
name: eureka-server
#使用的配置文件名
profiles:
active: server1
application-server1.yml文件如下:
#注册中心运行的端口号
server:
port: 8761
#注册中心应用名称
#spring:
# application:
# name: eureka-server
#eureka.server.enableSelfPreservation:是否向注册中心注册自己
#通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
eureka:
# server:
# enableSelfPreservation: false
instance:
hostname: server1
prefer-ip-address: false
# ip-address: 172.193.225.185
# instance-id: ${spring.cloud.client.ipAddress}:${server.port}
client:
fetch-registry: true//一定要设置为true或者不写,否则会出现unavailable-replicas
register-with-eureka: true//一定要设置为true或者不写,否则会出现unavailable-replicas
service-url:
defaultZone: http://server2:8762/eureka/
application-server2.yml文件如下:
#注册中心运行的端口号
server:
port: 8762
#注册中心应用名称
#spring:
# application:
# name: eureka-server
#eureka.server.enableSelfPreservation:是否向注册中心注册自己
#通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
eureka:
# server:
# enableSelfPreservation: false
instance:
hostname: server2
prefer-ip-address: false
# ip-address: 172.193.225.185
# instance-id: ${spring.cloud.client.ipAddress}:${server.port}
client:
fetch-registry: true//一定要设置为true或者不写,否则会出现unavailable-replicas
register-with-eureka: true//一定要设置为true或者不写,否则会出现unavailable-replicas
service-url:
defaultZone: http://server1:8761/eureka/
由于我们的eureka.instance.hostname分别配置成了server1和server2,所以需要去修改本机的hosts文件。
我们前面讲过如何在IDEA当中多次启动同一个工程,我们只需要修改application.yml文件当中的spring.profiles.active分别为server1和server2,分别启动项目,访问各自的端口,页面如下:
http://localhost:8761/:
http://localhost:8762/:
问题一:eureka.instance.hostname我单独使用的时候配置的时候都是使用localhost,你这里使用的是server1和server2,这样就需要去修改hosts文件太麻烦了,能不这么麻烦吗?
假如需要搭建eureka集群的话,那么eureka.instance.hostname不能重复,否则集群失败,所以不能为localhost或者ip地址。在测试中我刚开始使用的是localhost去进行集群发现无法成功。service-url.defaultZone写的地址记得使用如下格式:http://其他eurekaServer的hostname:其它eurekaServer的port/eureka/,多台集群这样的格式用逗号隔开。
问题二:你的eureka.instance.prefer-ip-address为false,这样就会导致我们看到的服务实例不显示ip,怎么办?
我把这个值设置为true,结果在http://localhost:8761/页面上发现,另外一个注册中心失效了。
问题三:分布式注册中心出现在unavaliable-replicas上面
把eureka.instance.prefer-ip-address为false
把eureka.client.fetch-registry设置为true
把eureka.clinet.register-with-eureka设置为true
我们使用之前的工程,改造Mall_ManagerService,只需要把application.yml文件当中的注册中心的地址更改一下就可以:
启动该工程,我们访问http://localhost:8761/和http://localhost:8762/,可以看到能够正常注册服务。
由于eureka之间有同步机制,我们可以简化一下这一配置。多个eureka实例需要两两互相注册,就可以实现集群中节点完全对等的效果,此时只要服务注册到其中一个注册中心,就会同步到其他注册中心。我们可以在服务当中看下只向一个注册中心注册,看下效果。
更改Mall_ManagerService的配置文件,只填写一个注册中心的地址。
这个时候我们再去访问http://localhost:8762/,发现一样可以看到Mall_ManagerService的信息。
但是这样做有一个缺点就是,当我们把服务给关掉之后,过段时间我们发现,我们服务注册的注册中心server1已经进入保护状态,但是服务server2却把服务给剔除掉了。
http://localhost:8761/
http://localhost:8762/
所以我们把服务注册到eureka集群当中,尽量注册到所有的eureka服务端上,以实现高可用。