報錯環境:
- eureka注冊中心在遠程服務器上
- 本地服務注冊到遠程的eureka注冊中心
- 本地服務通過Fegin組件+服務名調用服務
報錯時,注冊中心的情況:
Application Status
SERVICE-HOT 192.168.22.180:8308
SERVICE-REDIS 127.0.0.1:4046
SERVICE-ZUUL 127.0.0.1:4041
報錯情況:
feign.RetryableException: connect timed out executing GET http://SERVICE-REDIS/redis/NaviKey-24149-1
at feign.FeignException.errorExecuting(FeignException.java:84)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
排查后發現:是因為注冊服務ip問題,導致本地服務無法通過服務名字找到相應的服務.
- 遠程項目和eureka服務部署在同一台服務器上,所以通過127.0.0.1去服務中心注冊服務是沒問題的
- 本地項目通過遠程服務器ip來注冊服務,也沒問題
- 在同一個注冊中心上,可以互相發現服務,就是通過名字可以找到對方,沒錯
- 問題在於, 當本地SERVICE-HOT服務在eureka中心找到SERVICE-REDIS服務后,redis服務告訴他,我的服務ip地址是
127.0.0.1:4046
.那么,這就有問題了!!! - 本地服務和遠程服務不在一台服務器上,你的
127.0.0.1
是自己的服務器ip,本地服務肯定找不到 - 所以,注冊服務時,統一都使用服務器ip來注冊就行了,修改后的配置中心如下:
Application Status
SERVICE-HOT 192.168.22.180:8308
SERVICE-REDIS 192.168.22.180:4046
SERVICE-ZUUL 192.168.22.180:4041
不修改服務注冊配置,還有一種辦法: 使用fegin時,通過url指定訪問服務的ip
@FeignClient(value = "SERVICE-REDIS",
url="http://192.168.22.180:4041/service-redis" ,
fallback = RedisSvcFallback.class)
public interface RedisSvc {