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屬性的關係請指導的大佬們留言呀。