最近老大給了一台新服務器,做測試用,從裝軟件開始,到把整個環境搭起來,因為之前沒有完成搭過,所以費了幾天時間,最后總算是成功跑起來了。昨天早上來更新下項目,在測試服務器上重新發布了一下,結果發現服務注冊不上了。。。…(⊙_⊙;)…,主要報錯信息是跟下圖一樣的:
自己整理了一下,主要報錯信息包括下面這些:
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以下的端口是沒有權限的,問題終於找到了。
這是一次排查問題的經歷,其實很多問題在我們百思不得其解的時候,可能是我們的方向沒搞對(所謂當局者迷),及時轉換思路也是一項能力。高手的問題排查能力強,我覺得在單位時間內高手試的次數比我們多也是一個原因。
參考文獻:
SpringCloud問題解決:spring-cloud-eureka啟動出錯Cannot execute request on any known server