1. 程式人生 > 其它 >微服務(六)Feign遠端呼叫

微服務(六)Feign遠端呼叫

先來看我們以前利用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功能,設定連線池引數