搭建eureka集群时,各节点之间互相注册成功,但是,节点均出现在unavailable-replicas的问题;
(开发环境)配置文件(错误的配置文件)如下:

  # eureka服务端的实例名称
spring:
  application:
    name: eureka
eureka:
  instance:
    prefer-ip-address: false
  client:
    #表示是否将自己注册到Eureka Server
    register-with-eureka: true
    #表示是否从Eureka Server获取注册的服务信息
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: true
    service-url:
      defaultZone: http://euk1.com:7900/eureka/,http://euk2.com:7901/eureka/,http://euk3.com:7902/eureka/
  server:
    # 设置eureka是否启动自我保护   true指开启eureka的自我保护   false指关闭eureka的自我保护
    # 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
    enable-self-preservation: false
    # eureka的阈值(默认值)是0.85(当注册在eureka中的正常服务占比低于85%时会开启eureka的自我保护)
    # 也就是说Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
    renewal-percent-threshold: 0.85
    # 剔除服务的时间间隔毫秒数(单位:毫秒)  扫描失效服务的时间间隔(默认是60*1000 即60秒)
    eviction-interval-timer-in-ms: 1000
    # 是否从readonly(只读缓存)中读取实例(默认是true)
    use-read-only-response-cache: false
    # 设置 readwrite 和 readonly 两级缓存的同步时间间隔
    response-cache-update-interval-ms: 1000

---
spring:
  profiles: 7900
server:
  port: 7900
eureka:
  instance:
    hostname: euk1-7900
---
spring:
  profiles: 7901
server:
  port: 7901
eureka:
  instance:
    hostname: euk2-7901
---
spring:
  profiles: 7902
server:
  port: 7902
eureka:
  instance:
    hostname: euk3-7902

启动之后,发现如下问题(unavailable-replicas):三个节点的服务都处于不可用的状态
在这里插入图片描述
经查阅资料,总结出以下几点:
1、defaultZone 后面的eureka注册中心的地址要写成域名;
2、eureka.client.register-with-eureka的值要写为true
3、eureka.client.fetch-registry的值要写为true
4、eureka集群中多个eureka服务的spring.application.name的值要一致
5、eureka.instance.prefer-ip-address的值必须设置为false
;prefer-ip-address:true代表使用ip地址的形式来定义注册中心的地址,而不使用主机名,而defaultZone中是以域名的方式向注册中心注册的,最终导致分片节点不能识别匹配(ip地址和域名),而认为分片均处于不可达状态;
6、各个eureka server节点要配置自己的hostname,各节点的hostname必须是各自的域名;如果是开发环境或测试环境下,一定要和电脑中的hosts(C:\Windows\System32\drivers\etc\hosts)文件中的配置一样;如下所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyZOq0zS-1625244705855)(springboot.md_pic/image-20210703003824039.png)]
配置文件应写为以下内容:
在这里插入图片描述
正确的配置文件:

  # eureka服务端的实例名称
spring:
  application:
    name: eureka
eureka:
  instance:
    prefer-ip-address: false
  client:
    #表示是否将自己注册到Eureka Server
    register-with-eureka: true
    #表示是否从Eureka Server获取注册的服务信息
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: true
    service-url:
      defaultZone: http://euk1.com:7900/eureka/,http://euk2.com:7901/eureka/,http://euk3.com:7902/eureka/
  server:
    # 设置eureka是否启动自我保护   true指开启eureka的自我保护   false指关闭eureka的自我保护
    # 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
    enable-self-preservation: false
    # eureka的阈值(默认值)是0.85(当注册在eureka中的正常服务占比低于85%时会开启eureka的自我保护)
    # 也就是说Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
    renewal-percent-threshold: 0.85
    # 剔除服务的时间间隔毫秒数(单位:毫秒)  扫描失效服务的时间间隔(默认是60*1000 即60秒)
    eviction-interval-timer-in-ms: 1000
    # 是否从readonly(只读缓存)中读取实例(默认是true)
    use-read-only-response-cache: false
    # 设置 readwrite 和 readonly 两级缓存的同步时间间隔
    response-cache-update-interval-ms: 1000

---
spring:
  profiles: 7900
server:
  port: 7900
eureka:
  instance:
    hostname: euk1.com
---
spring:
  profiles: 7901
server:
  port: 7901
eureka:
  instance:
    hostname: euk2.com
---
spring:
  profiles: 7902
server:
  port: 7902
eureka:
  instance:
    hostname: euk3.com

至此,问题解决,如下图所示:
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐