先來看我們以前利用RestTemplate發起遠程調用的代碼:
String url = "http://localhost:8081/user/" + order.getUserId();
String url = "http://user-service/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
存在下面的問題:
•代碼可讀性差,編程體驗不統一
•參數復雜URL難以維護
Feign是一個聲明式的http客戶端,官方地址:https://github.com/OpenFeign/feign
其作用就是幫助我們優雅的實現http請求的發送,解決上面提到的問題。
1 Feign替代RestTemplate
1.1 依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 添加注解
在order-service的啟動類添加注解開啟Feign的功能:
1.3 編寫Feign的客戶端
在order-service中新建一個接口,內容如下:
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
這個客戶端主要是基於SpringMVC的注解來聲明遠程調用的信息,比如:
- 服務名稱:userservice
- 請求方式:GET
- 請求路徑:/user/{id}
- 請求參數:Long id
- 返回值類型:User
這樣,Feign就可以幫助我們發送http請求,無需自己使用RestTemplate來發送了。
1.4 測試
修改order-service中的OrderService類中的queryOrderById方法,使用Feign客戶端代替RestTemplate:
2 自定義配置
Feign可以支持很多的自定義配置,如下表所示: |
一般情況下,默認值就能滿足我們使用,如果要自定義時,只需要創建自定義的@Bean覆蓋默認Bean即可。 |
下面以日志為例來演示如何自定義配置。
2.1 配置文件方式
2.2.1.配置文件方式
基於配置文件修改feign的日志級別可以針對單個服務:
feign:
client:
config:
userservice: # 針對某個微服務的配置
loggerLevel: FULL # 日志級別
也可以針對所有服務:
feign:
client:
config:
default: # 這里用default就是全局配置,如果是寫服務名稱,則是針對某個微服務的配置
loggerLevel: FULL # 日志級別
而日志的級別分為四種:
- NONE:不記錄任何日志信息,這是默認值。
- BASIC:僅記錄請求的方法,URL以及響應狀態碼和執行時間
- HEADERS:在BASIC的基礎上,額外記錄了請求和響應的頭信息
- FULL:記錄所有請求和響應的明細,包括頭信息、請求體、元數據。
2.2 Java代碼方式
也可以基於Java代碼來修改日志級別,先聲明一個類,然后聲明一個Logger.Level的對象:
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志級別為BASIC
}
}
如果要全局生效,將其放到啟動類的@EnableFeignClients這個注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
如果是局部生效,則把它放到對應的@FeignClient這個注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
3 Feign使用優化
Feign底層發起http請求,依賴於其它的框架。其底層客戶端實現包括:
•URLConnection:默認實現,不支持連接池
•Apache HttpClient :支持連接池
•OKHttp:支持連接池
因此提高Feign的性能主要手段就是使用連接池代替默認的URLConnection。
這里我們用Apache的HttpClient來演示。
1)引入依賴
在order-service的pom文件中引入Apache的HttpClient依賴:
<!--httpClient的依賴 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)配置連接池
在order-service的application.yml中添加配置:
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志級別,BASIC就是基本的請求和響應信息
httpclient:
enabled: true # 開啟feign對HttpClient的支持
max-connections: 200 # 最大的連接數
max-connections-per-route: 50 # 每個路徑的最大連接數
總結,Feign的優化:
1.日志級別盡量用basic
2.使用HttpClient或OKHttp代替URLConnection
① 引入feign-httpClient依賴
② 配置文件開啟httpClient功能,設置連接池參數