1. 程式人生 > 實用技巧 >使用 Feign 實現宣告式 REST 呼叫

使用 Feign 實現宣告式 REST 呼叫

使用 Feign 實現宣告式 REST 呼叫

一、基本使用

1、為當前專案引入 Feign

<!-- 宣告書 Rest 呼叫 Feign -->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- end -->

2、在 application.java 啟動類處新增 @EnableFeignClients 註解。

3、編寫 ServerClient,例如針對 user-info-server 服務編寫 UserInfoServerClient 如下:

@FeignClient(name = "user-info-server")
public interface UserInfoServerClient
{
    /**
     * user-info-server 使用情況
     * @return
     */
    @RequestMapping(value = "/sys/usage",method = RequestMethod.GET)
    public Object usage();
}

4、在專案中直接自動注入 UserInfoServerClient 即可使用該介面中的方法實現遠端呼叫。

二、進階使用

上述方法只適合於那些不需要許可權就能無限制訪問的介面,如果遇到需要授權才能訪問的介面呢?

1、為當前專案引入 Feign

<!-- 宣告書 Rest 呼叫 Feign -->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- end -->

2、去掉 @EnableFeignClients 註釋 和 @FeignClient(name = "user-info-server")

3、配置 UserInfoServerClientExt 類,程式碼如下:

package com.zolmk.ms.userregisterserver.rpc.impl;

import com.zolmk.ms.userregisterserver.rpc.UserInfoServerClient;
import feign.Client;
import feign.Contract;
import feign.Feign;
import feign.Logger;
import feign.auth.BasicAuthRequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

/**
 * @author : zolmk
 * @project : user-register-server
 * @date : 2020/11/28 19:48
 **/
@Import(FeignClientsConfiguration.class) // 匯入 FeignClient 的預設配置,該配置中自動裝載了 Decoder Encoder Client Contract。
@Component	// 將其作為一個元件
public class UserInfoServerClientExt
{
    private UserInfoServerClient userClient; // 不同許可權的訪問客戶端
    private UserInfoServerClient adminClient; // 這裡放兩個僅作為示例

    @Autowired
    public UserInfoServerClientExt(Decoder decoder, Encoder encoder, Client client, Contract contract)
    {
        this.userClient = Feign.builder().client(client).encoder(encoder).decoder(decoder)
                .logLevel(Logger.Level.FULL).logger(new Logger.ErrorLogger()) //配置日誌輸出及日誌等級
                .contract(contract)
                .requestInterceptor(new BasicAuthRequestInterceptor("user","user")) // 授權使用者密碼
                .target(UserInfoServerClient.class,"http://user-info-server/"); // 繫結 FeignClient 介面 和 微服務域名
        this.adminClient = Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract)
                .logLevel(Logger.Level.FULL).logger(new Logger.ErrorLogger())
                .requestInterceptor(new BasicAuthRequestInterceptor("admin","admin"))
                .target(UserInfoServerClient.class,"http://user-info-server/");
    }
    public UserInfoServerClient getUserClient()
    {
        return this.userClient;
    }
    public UserInfoServerClient getAdminClient()
    {
        return this.adminClient;
    }
}

4、然後在 Controller 中自動裝載 UserInfoServerClientExt 使用其中的 UserInfoServer 物件即可訪問需要授權的介面。

5、Get 請求多引數的 URL

// 引數少的時候
@RequestMapping(value="/get",method = RequestMethod.GET)
public User get(@RequestParam("id")String id,@RequestParam("name")String name);
// 引數多的時候 使用 map
@RequestMapping(value="/get",method = RequestMethod.GET)
public User get1(@RequestParam Map<String,Object> map);

6、Post 請求多引數

@RequestMapping(value="/post",method=RequestMethod.POST)
public User post(@RequestBody User user);

三、進階知識

1、Feign 對壓縮的支援

需要在 application.yml 中配置 feign.compression.request.enable = true 、feign.compression.response.enable = true

對於請求的壓縮,Feign 還提供了更為詳細的設定,例如:

feign:
	compression:
		request:
			enable: true
			mime-types: text/xml,application/xml,application/json
			min-request-size: 2048 
			

mime-types 代表請求型別

min-request-size 用於設定請求的最小閾值,預設是 2048