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