zoukankan      html  css  js  c++  java
  • 记一次eureka客户端注册失败的问题

      最近老大给了一台新服务器,做测试用,从装软件开始,到把整个环境搭起来,因为之前没有完成搭过,所以费了几天时间,最后总算是成功跑起来了。昨天早上来更新下项目,在测试服务器上重新发布了一下,结果发现服务注册不上了。。。…(⊙_⊙;)…,主要报错信息是跟下图一样的:

      自己整理了一下,主要报错信息包括下面这些:

    There was a problem with the instance info replicator com.netflix.discovery.shared.transport.TransportException:Cannot execute request on any know server
    
    com.netflix.client.ClientException:Load balancer dose not have avaliable server for client
    
    DiscoveryClient_DYSERVICE/172.17.16.6:dyservice:2001-was unable to send heartbeat

      好吧,既然错误来了,总得解决吧,按着报错信息一个一个翻牌吧一 一+ ,可能的原因如下:

    1.eureka注册中心的配置

      如下两项配置需要设置为false,这是因为在默认设置下,eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为;

    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false

      若是未禁用eureka服务注册中心的客户端注册行为,也行,但是需提供service-url注册中心地址,配置示例如下:

    spring.application.name=stock-service
    spring.jmx.default-domain=stock-service
    server.port=8083
    eureka.instance.hostname=localhost
    eureka.client.register-with-eureka=true
    eureka.client.fetch-registry=true
    eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

      然后,要注意eureka服务器的SpringBoot启动类标注 @EnableEurekaServer 注解

    2.服务提供方的配置

      SpringBoot启动类标注 @EnableEurekaClient 或者 @EnableDiscoveryClient 注解;

      在配置文件中配置注册中心地址:

    spring.application.name=service
    spring.jmx.default-domain=service
    server.port=3030
    eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

    3.确定本机是否关闭防火墙

      如果你的注册中心和服务提供方是跑在不同的电脑上需要注意这个;

    4.是否导入eureka的jar包

      这个就自己注意了;

    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

      我基本上是按照如上的步骤来的,可是依然报错,这个当时很困惑,后来我想到直接根据注册中心的端口号来访问注册中心,正常来说我们应该能打开一个eureka的页面的,可是我什么都打不开,到这里终于意识到问题在哪里了(前面的都没有问题,白白浪费了一堆时间),我猜测是注册中心自己的问题,要么是不可用,要么是不能访问,接着看端口,通过lsof命令发现提供服务的工程的端口是listen的,而eureka的端口是未被listen的,哦,原来是注册中心用的端口号小于1024,而我是在普通用户下启动的项目,而普通用户对1024以下的端口是没有权限的,问题终于找到了。

      这是一次排查问题的经历,其实很多问题在我们百思不得其解的时候,可能是我们的方向没搞对(所谓当局者迷),及时转换思路也是一项能力。高手的问题排查能力强,我觉得在单位时间内高手试的次数比我们多也是一个原因。

    参考文献:

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

    SpringCloud问题解决:spring-cloud-eureka启动出错Cannot execute request on any known server

    SpringCloud系列第02节之注册中心Eureka

    解决SpringCloud的bug的神经历

  • 相关阅读:
    mybatis
    Hello mybatis
    linux各种终端类型的区别和概念
    页面对象的定位
    laravel 操作 redis
    Python应用与实践
    Mysql与Oracle区别
    PHP 中 call_user_func 函数 和 call_user_func_array 函数的区别
    php依赖注入
    Linux/Unix 怎样找出并删除某一时间点的文件
  • 原文地址:https://www.cnblogs.com/volcano-liu/p/9771691.html
Copyright © 2011-2022 走看看