我们都知道,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
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/
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/
现在一切正常,双方你中有我我中有你,能够正常的进行信息的同步。
eureka7001
和eureka7002
是从哪里得到的? 配置的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.
咦? DS Replicas仍然是eureka7001 和 eureka7002 ,值没有变。所以暂且可以得出一个结论
结论: DS Replicas下面的值不是eureka.instance.hostname
。
那么它是哪里配置的呢? 纵观整个配置文件,只有以下配置的地方有用到eureka7001和eureka7002
client:
service-url:
defaultZone: http://eureka7002:7002/eureka/
所以可以肯定,DS Replicas的值,来自于defaultZone。
好,改一下配置:
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/
启动测试:
把鼠标放到链接上面,浏览器左下角会显示ip+端口:
同样eureka7002也有同样的效果,我这里就不截图了。。
所以这里我们可以做一个结论,
结论: 用127.0.0.1配置也是可以的。
看一下我的本机ip地址:
我的链接路由器的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/
好像结果并不像我们想的那样,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/
另外一个配置这里就不贴出来了。。。 启动测试:
发现是可以的。
除了把ip全部配置成本机真实ip,其它情况都是可以的。目前就是没搞明白,为什么把hostname改成真实ip地址不行。。。 如果有哪位知道答案,麻烦告知,不甚感激。。。,如果我后面知道了答案,会在这里公布出来。