首頁 > 軟體

通過Feign進行呼叫@FeignClient 找不到的解決方案

2022-03-04 13:01:12

Feign進行呼叫@FeignClient 找不到

通過Feign 進行呼叫

這裡設定spring-cloud 版本為 M8的

 <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.M8</spring-cloud.version>
    </properties>

引入依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.0.RC1</version>
        </dependency>

注意:spring-cloud 版本一定要選好,不然可能會找不到FeignClient,

再網上看到這樣一句話:

Spring Cloud對Feign的支援由org.springframework.cloud:spring-cloud-netflix-core

移到org.springframework.cloud:spring-cloud-openfeign-core下,

Finchley.M8版本下的spring-cloud-starter-openfeign:2.0.0.M2的pom依賴檔案中匯入的是

spring-cloud-netflix-core而非spring-cloud-openfeign-core,

需要我們在pom檔案中新增對應依賴管理使spring-cloud-starter-openfeign版本

更新到2.0.0.RC1

那麼接下來我們進行程式碼整理

編寫介面

@FeignClient(name="eureka-client-1")
public interface EurekaClient {
    @GetMapping("/info")
    String getInfo();
}

呼叫

 @GetMapping("getMessage")
    public String getMessage(){
        String res =  eurekaClient.getInfo();
        return res;
    }

Feign通過服務名呼叫服務,找不到服務

報錯環境

  • 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 {

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com