参考:
SpringCloud从入门到进阶(三)——源码探究Eureka集群之replicas的unavailable故障
Eureka部署单节点配置如下:
spring:
application:
name: @project.name@
profiles:
active: @profileActive@
eureka:
instance:
prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
client:
register-with-eureka: false
fetch-registry: false
server:
port: 55555
info:
project:
name: @project.name@
version: 1.0.0
prefer-ip-address设置为true以IP地址注册到服务中心,相互注册使用IP地址,访问注册中心页面DS Replicas模块中有一个实例为localhost。
PeerEurekaNodes.resolvePeerUrls会解析集群中其它节点的URL,值来自于eureka.client.serviceUrl配置。并判断当前Eureka实例URL是否在其中并剔除。由于prefer-ip-address设置为true以IP地址注册到服务中心,如果eureka.client.serviceUrl中配置的是hostname,在比较时拿IP和hostname比较自然不想等。对于Eureka单节点部署而言是拿IP和hostname比较自然不想等,出现上述情况。
参考:
Eureka配置问题
未配置eureka.client.serviceUrl.defaultZone值,EurekaClientConfigBean设置的默认值http://localhost:8761/eureka/不会被覆盖,
EurekaInstanceConfigBean实例化时通过InetUtils.findFirstNonLoopbackHostInfo()找到本机第一个非环回主机信息,hostname可能是IP而不是主机名。
在解析集群中其它节点URL时会比较URL中的host和当前机器的hostname是否相同,如果相同则认为是同一实例不会注册为自己的Replicas。
单节点部署单实例Eureka如下配置即可。
spring:
application:
name: @project.name@
profiles:
active: @profileActive@
eureka:
instance:
hostname: localhost
# prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
client:
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
server:
port: 55555
info:
project:
name: @project.name@
version: 1.0.0
单节点部署为分布式Eureka集群,设置当前机器hostname为多个,不同节点eureka.instance.hostname设置为不同值,同时prefer-ip-address禁止设置为true,否则DS Replicas列表中会出现不应该出现的节点。