首先,eureka的ha基本解决方案是通过部署多eureka实例,并且使任何一实例均注册到其余所有eureka中,互相注册,达到注册列表多备份。
然后,对于client端,启动时,eureka.client.service-url.defaultZone需要将各eureka实例均配置上,通过“,”间隔即可。
预备工作:
以下是ha测试过程:
eureka实例:
实例1:
所在宿主机:10.**.*.193
端口:9099
启动参数(向其余实例注册):--eureka.client.service-url.defaultZone=http://10.**.*.194:9099/eureka
实例2:
所在宿主机:10.**.*.194
端口:9099
启动参数(向其余实例注册):--eureka.client.service-url.defaultZone=http://10.**.*.193:9099/eureka
业务服务:
模块:
- demo-eureka-client-A
- demo-eureka-client-B
示例中B持有A的feignClient,并向A发起请求。
如果eureka-server地址变动,启动参数更改即可。
启动ha测试:
1、启动如上两个(及以上)实例,可看到,两个实例互相注册到了对方的列表中
2、测试场景
- 启动业务服务,仅向194eureka进行注册,启动参数为:--eureka.client.service-url.defaultZone=http://10.***.*.194:9099/eureka,结果:194和193的eureka实例注册列表中均注册了业务服务
- 停止194实例,该服务将不能再次向194进行注册信息的拉取,会重试并报错,即不能再拉取到最新的服务列表,
它能否访问已有的拉取到本地的服务列表呢?如果在eureka停掉前已经拉取过应用列表,那么能,而且只能访问已缓存的原服务列表,新的将不能访问到。 - 启动业务服务,向两个实例注册,启动参数为:--eureka.client.service-url.defaultZone=http://10.***.*.193:9099/eureka,http://10.***.*.194:9099/eureka,结果:194和193的eureka实例注册列表中均注册了该业务服务
- 停止其中一个实例,如194,此时由两种情况:
- 该业务服务启动时优先注册的就是194,此时心跳检测时会报错,并重新向另外的地址发起心跳,若成功,将重定向为向该实例作为主注册中心。
- 该业务启动时优先注册的时193,此时194停止不会对其造成影响。
- 停止所有eureka实例,此时,client仍可以使用缓存去向其他已知服务发起请求
- eureka-server启动时仅注册到自己(不互相注册),业务实例启动时启动参数设置:--eureka.client.service-url.defaultZone=http://10.***.*.193:9099/eureka,http://10.***.*.194:9099/eureka,仍向两个eureka-server注册,观察,得到,两个eureka并未互相注册,且业务实例仅向其中一eureka进行了注册。
3、结论
- eureka-server集群部署时互相注册
- eureka-client启动时应该将所有eureka-server配置上
- 所有eureka-server均宕掉后,对于已经拉取过服务列表的服务,仍可以使用缓存进行服务间调用