Spring Cloud Feign 優雅的服務呼叫
阿新 • • 發佈:2020-03-07
Fegin 是由NetFlix開發的宣告式、模板化HTTP客戶端,可用於SpringCloud 的服務呼叫。提供了一套更優雅、便捷的HTTP呼叫API,並且SpringCloud整合了Fegin、Eureka和Ribbon。使其使用更加簡便。替換了之前使用RestTemplate進行硬編碼方式的服務呼叫。
## Feign元件入門
### 匯入依賴
```xml
org.springframework.cloud
spring-cloud-starter-openfeign
```
### 開啟服務
在啟動類上新增 @EnableFeignClients 開啟
```java
@SpringBootApplication
@EnableFeignClients
public class ServiceConsumerApplication {}
```
### 寫服務介面
1. 在專案中建立一個資料夾用來管理Fegin的所有介面
2. 可以按照服務提供者的名字進行二級分類
3. 建立一個介面。這裡我根據服務提供者的名稱建立了一個 **UserServiceFeignClient** 的介面
4. 介面上添加註解 @FeignClient("SERVICE-PROVIDER"),註解的預設值填寫服務提供者的名字
5. 複製提供者的Controller方法,**注意不要遺漏類名上的地址**
```java
package cn.keats.service_consumer.feign;
import cn.keats.service_consumer.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
/**
* @Author: keats_coder
* @Date: 2020/3/7
* @Version 1.0
*/
@FeignClient("SERVICE-PROVIDER")
public interface UserServiceFeignClient {
@GetMapping("/api/v1/user/{age}")
User getUser(@PathVariable("age") Integer age);
/**
* 使用者列表
* @return
*/
@GetMapping("/api/v1/users")
List getUsers();
}
```
### 呼叫
在需要呼叫服務的地方使用 @AutoWired 注入該介面。呼叫其對應的方法
```java
@Autowired
private UserServiceFeignClient userServiceFeignClient;
/**
* 基於 Feign 的優雅的介面呼叫方式
*/
@GetMapping("teacher/user/{age}")
public User getAllUser(@PathVariable Integer age){
return userServiceFeignClient.getUser(age);
}
```
## Feign負載均衡
Feign中已經集成了Ribbon的負載均衡功能,預設情況下使用輪詢的規則,若想要自定義可以參考:[Ribbon進行服務呼叫/負載均衡以及請求重試配置](https://www.cnblogs.com/keatsCoder/p/12398650.html)
## Feign的配置
新版本的Feign支援配置檔案配置,常用的配置有日誌級別的配置。開發環境下可以配置成最細膩級別的日誌方便檢查問題
```yml
# feign的配置
feign:
client:
config:
SERVICE-PROVIDER:
loggerLevel: FULL # NONE(預設選項), BASIC, HEADERS, FULL; 內容依次豐富、效能影響依次增大
logging:
level:
cn.keats.service_consumer.feign.UserServiceFeignClient: debug
```
## Feign的執行原理
1. 在Spring容器啟動時,掃描到 @EnableFeignClients 註解。而該註解又匯入了 FeignClientsRegistrar.class 這個類。該類定義了掃描所有新增 @FeignClient 註解的介面
2. FeignClientsRegistrar 實現了 Spring ImportBeanDefinitionRegistrar 類,用來匯入自定義Bean。其中該方法主要用來匯入Bean.
```java
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
this.registerDefaultConfiguration(metadata, registry); // 註冊配置
this.registerFeignClients(metadata, registry);// 註冊Feign客戶端
}
```
3. 之後通過 registerFeignClient 方法,以**動態代理**的形式生成介面的實現。讓我們得以呼叫