記一次eureka客戶端註冊失敗的問題

木瓜芒果發表於2018-10-12

  最近老大給了一臺新伺服器,做測試用,從裝軟體開始,到把整個環境搭起來,因為之前沒有完成搭過,所以費了幾天時間,最後總算是成功跑起來了。昨天早上來更新下專案,在測試伺服器上重新發布了一下,結果發現服務註冊不上了。。。…(⊙_⊙;)…,主要報錯資訊是跟下圖一樣的:

  自己整理了一下,主要報錯資訊包括下面這些:

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的神經歷

 

相關文章