参考: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列表中会出现不应该出现的节点。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐