Eureka集群复制策略问题

前言

我们都知道,Eureka可以很简单的配置高可用,只需要在Eureka server指定该server的其他小伙伴们就可以很简单的实现。但是在实际使用的过程中,也有一些需要注意的点。本文会说明。

本文测试用例我们是两个实例来模拟集群环境。两个spring-boot的小项目:eureka-server-7001和eureka-server-7002。 win10环境,先配置hosts:

127.0.0.1   eureka7001  eureka7002

本文代码地址:https://github.com/lchpersonal/eureka-parent

配置文件 application.yml

eureka-server-7001

server: 
  port: 7001
 
eureka: 
  instance:
    hostname: eureka7001 #eureka服务端的实例名称
    prefer-ip-address: true

  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
      defaultZone: http://eureka7002:7002/eureka/
      

eureka-server-7002

server: 
  port: 7002
 
eureka: 
  instance:
    hostname: eureka7002 #eureka服务端的实例名称
    prefer-ip-address: true

  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
      defaultZone: http://eureka7001:7001/eureka/ 

启动测试

分别启动两个项目,打开浏览器访问http://eureka7001:7001/http://eureka7002:7002/
Eureka集群复制策略问题
Eureka集群复制策略问题
现在一切正常,双方你中有我我中有你,能够正常的进行信息的同步。

问题一!!!

问题: DS Replicas下面的 eureka7001eureka7002是从哪里得到的? 配置的hostname吗?

好,带着这个问题,我们来修改一点配置:
我们两个服务的把eureka.instance.hostname:的值改成127.0.0.1

eureka: 
  instance:
    hostname: 127.0.0.1  #eureka服务端的实例名称
    prefer-ip-address: true

两个服务的hostname都修改成127.0.0.1.

重新启动两个程序:
Eureka集群复制策略问题
Eureka集群复制策略问题

咦? DS Replicas仍然是eureka7001 和 eureka7002 ,值没有变。所以暂且可以得出一个结论
结论: DS Replicas下面的值不是eureka.instance.hostname
那么它是哪里配置的呢? 纵观整个配置文件,只有以下配置的地方有用到eureka7001和eureka7002

client: 
    service-url: 
        defaultZone: http://eureka7002:7002/eureka/

所以可以肯定,DS Replicas的值,来自于defaultZone。

问题二 !!!

问题: 本文是通过一台机器模拟的,那么我们可不可以不配置域名? 直接使用ip地址来配置所有的信息呢?

好,改一下配置:
eureka-server-7001改成如下:

server: 
  port: 7001
 
eureka: 
  instance:
    hostname: 127.0.0.1
    prefer-ip-address: true

  client: 
    register-with-eureka: false   
    fetch-registry: false    
    service-url: 
      defaultZone: http://127.0.0.1:7002/eureka/

同样eureka-server-7002改成如下:

server: 
  port: 7002
eureka: 
  instance:
    hostname: 127.0.0.1
    prefer-ip-address: true
  client: 
    register-with-eureka: false  
    fetch-registry: false    
    service-url: 
         defaultZone: http://127.0.0.1:7001/eureka/
 

启动测试:
Eureka集群复制策略问题
把鼠标放到链接上面,浏览器左下角会显示ip+端口:
Eureka集群复制策略问题
同样eureka7002也有同样的效果,我这里就不截图了。。
所以这里我们可以做一个结论,
结论: 用127.0.0.1配置也是可以的。

问题三 !!!

问题: 不使用本地环路地址,直接使用真实地址行不行?

看一下我的本机ip地址:
Eureka集群复制策略问题
我的链接路由器的ip地址是192.168.0.125, 假如我们把上面所有的127.0.0.1 全部改为192.168.0.125可以吗? 这里大家是不是认为肯定可以啊? 哈哈,往下看测试结果:
好,改一下配置:
eureka-server-7001改成如下:

server: 
  port: 7001
 
eureka: 
  instance:
    hostname: 192.168.0.125
    prefer-ip-address: true

  client: 
    register-with-eureka: false   
    fetch-registry: false    
    service-url: 
      defaultZone: http://192.168.0.125:7002/eureka/

同样eureka-server-7002改成如下:

server: 
  port: 7002
eureka: 
  instance:
    hostname: 192.168.0.125
    prefer-ip-address: true
  client: 
    register-with-eureka: false  
    fetch-registry: false    
    service-url: 
         defaultZone: http://192.168.0.125:7001/eureka/
 

启动测试:
Eureka集群复制策略问题

Eureka集群复制策略问题
好像结果并不像我们想的那样,DS Replicas下面什么都没有。。。

其实这个问题是我在搭建Apollo分布式配置中心的时候遇到的问题。Apollo中使用的就是Eureka。 当时我是在同一台机器上,用docker来模拟伪分布式,当时就没有配置域名,直接使用的事docker宿主机的ip地址,发现总有一个节点运行不正常,不能够正常复制另外一个节点的内容。 这才来研究了一下Eureka。

其实,除了127.0.0.1,你用同一个域名,不同端口也是不行的,例如我们配置hosts

127.0.0.1  eureka.

把所有的ip全部换成同一个域名eureka

server: 
  port: 7001 
eureka: 
  instance:
    hostname: eureka  #eureka服务端的实例名称
    prefer-ip-address: true
  client: 
    register-with-eureka: false 
    fetch-registry: false  
    service-url: 
      defaultZone: http://eureka:7002/eureka/

另外一个配置这里就不贴出来了。。。 启动测试:
Eureka集群复制策略问题
发现是可以的。

除了把ip全部配置成本机真实ip,其它情况都是可以的。目前就是没搞明白,为什么把hostname改成真实ip地址不行。。。 如果有哪位知道答案,麻烦告知,不甚感激。。。,如果我后面知道了答案,会在这里公布出来。