使用Feign通過服務名調用服務,找不到服務


報錯環境:

  1. eureka注冊中心在遠程服務器上
  2. 本地服務注冊到遠程的eureka注冊中心
  3. 本地服務通過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問題,導致本地服務無法通過服務名字找到相應的服務.

  1. 遠程項目和eureka服務部署在同一台服務器上,所以通過127.0.0.1去服務中心注冊服務是沒問題的
  2. 本地項目通過遠程服務器ip來注冊服務,也沒問題
  3. 在同一個注冊中心上,可以互相發現服務,就是通過名字可以找到對方,沒錯
  4. 問題在於, 當本地SERVICE-HOT服務在eureka中心找到SERVICE-REDIS服務后,redis服務告訴他,我的服務ip地址是127.0.0.1:4046.那么,這就有問題了!!!
  5. 本地服務和遠程服務不在一台服務器上,你的127.0.0.1是自己的服務器ip,本地服務肯定找不到
  6. 所以,注冊服務時,統一都使用服務器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 {


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM