使用 Feign 實現宣告式 REST 呼叫
阿新 • • 發佈:2020-12-02
使用 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