最近公司一個項目技術架構是springcloud全家桶,微服務治理當然就是eureka,客戶端調用是feign調用,接近生產發布階段我們想每個eureka服務部署兩個實例對服務端進行負載均衡,剛開始兩台機子的服務起來后項目跑着看起來是沒問題的,但是我們測試為了驗證多種情況,我們停掉了一個服務器的服務,只保留feign客戶端,當外部請求命中這個feign客戶端的時候就報錯了,
exception is feign.RetryableException: Connection refused (Connection refused) executing GET http://...
於是我打開eureka界面查看服務情況,服務的狀態都是正常的,但是看feign客戶端看上去確實訪問了,我又把feign客戶端所在機器的服務起來,另外一台的服務停掉,再次訪問,ok,不報錯的,很正常,就這樣反復嘗試幾次,發現feign客戶端和服務提供者不在同一個服務器就會報這個錯誤,首先由於剛開始搭建多服務實例環境的時候由於看見實例名字是以localhost:XXX顯示的,所以一開始就用了ip方式注冊上去
eureka.instance.prefer-ip-adderss = true eureka.instance.instance-id = ${spring.cloud.client.ip-address}:${server.port}
上圖所示顯示的都是ip加端口,沒有ip注冊方式之前會有一個實例是localhost:端口的,理論上我覺得feign客戶端訪問的時候就應該可以訪問到服務,但是就是不可以,與我把鼠標懸浮上實例名字上看左下角
這個圖是最后修改后可以訪問的圖,是顯示正確的,在修改之前這里顯示的localhost,說明暴露出來的主機名字還是本機不是實際的服務器,所以eureka服務注冊的時候給定一個主機名為機器IP地址就可以,在之前配置基礎上加如下配置
eureka.instance.hostname= ${spring.cloud.client.ip-address}
重啟服務重新注冊到eureka 成功驗證