@FeignClient註解詳解

且吃茶去發表於2020-10-11

Spring Cloud 是目前最火的微服務框架,Feign 作為基礎元件之一,在 Spring Cloud 體系中發揮了重要的作用。

一、FeignClient註解

FeignClient註解被@Target(ElementType.TYPE)修飾,表示FeignClient註解的作用目標在介面上

//@FeignClient(value = "fast-maindata-service",contextId = "MaindataServiceClient")
@FeignClient(url = "47.100.79.142:30041",name = "MaindataServiceClient")
public interface MaindataServiceClient extends IMaindataPharmacyController {

}

宣告介面之後,在程式碼中通過@Resource注入之後即可使用。@FeignClient標籤的常用屬性如下:

  • name:指定FeignClient的名稱,如果專案使用了Ribbon,name屬性會作為微服務的名稱,用於服務發現
  • url: url一般用於除錯,可以手動指定@FeignClient呼叫的地址
  • decode404:當發生http 404錯誤時,如果該欄位位true,會呼叫decoder進行解碼,否則丟擲FeignException
  • configuration: Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定義容錯的處理類,當呼叫遠端介面失敗或超時時,會呼叫對應介面的容錯邏輯,fallback指定的類必須實現@FeignClient標記的介面
  • fallbackFactory: 工廠類,用於生成fallback類示例,通過這個屬性我們可以實現每個介面通用的容錯邏輯,減少重複的程式碼
  • path: 定義當前FeignClient的統一字首
@FeignClient(name = "github-client",
        url = "https://api.github.com",
        configuration = GitHubExampleConfig.class,
        fallback = GitHubClient.DefaultFallback.class)
public interface GitHubClient {
    @RequestMapping(value = "/search/repositories", method = RequestMethod.GET)
    String searchRepo(@RequestParam("q") String queryStr);
 
    /**
     * 容錯處理類,當呼叫失敗時,簡單返回空字串
     */
    @Component
    public class DefaultFallback implements GitHubClient {
        @Override
        public String searchRepo(@RequestParam("q") String queryStr) {
            return "";
        }
    }
}

在使用fallback屬性時,需要使用@Component註解,保證fallback類被Spring容器掃描到,GitHubExampleConfig內容如下:

@Configuration
public class GitHubExampleConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

 在使用FeignClient時,Spring會按name建立不同的ApplicationContext,通過不同的Context來隔離FeignClient的配置資訊,在使用配置類時,不能把配置類放到Spring App Component scan的路徑下,否則,配置類會對所有FeignClient生效.

關於呼叫目前有兩種:

1、介面提供方在註冊中心。

如果服務提供方已經註冊到註冊中心了,那麼name或者value的值為:服務提供方的服務名稱。必須為所有客戶端指定一個name或者value
@FeignClient(value="run-product",fallback = ProductClientServiceFallBack.class)

2、單獨的一個http介面,介面提供方沒有註冊到註冊中心。
@FeignClient(name="runClient11111",url="localhost:8001")
此處name的值為:呼叫客戶端的名稱。

以上兩種方式都能正常呼叫。name可以為註冊中心的例項名稱,加上url屬性時,name的值就與註冊中心例項名稱無關。至於url屬性和name屬性的關係請指導的大佬們留言呀。

相關文章