1. 程式人生 > >十、宣告式 REST 客戶端-Feign 的高階特性

十、宣告式 REST 客戶端-Feign 的高階特性

一、 Feign 的預設配置 Spring Cloud Netflix 提供的預設實現類:FeignClientsConfiguration
解碼器:Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder)
編碼器:Encoder feignEncoder: SpringEncoder
日誌框架:Logger feignLogger: Slf4jLogger
契約:Contract feignContract: SpringMvcContract
生成器:Feign.Builder feignBuilder: HystrixFeign.Builder

說明:
解碼器的作用:將 HTTP 響應資料反序列化為 Java 物件
編碼器的作用:將方法簽名中方法引數物件序列化為請求引數放到 HTTP 請求中

二、 自定義配置

package com.comsys.configuration;

import org.springframework.context.annotation.Bean;

import feign.Contract;
import feign.Logger;

//@Configuration
public class RcFeignConfiguration {
    @Bean
    public Logger.Level feignLoggerLevel
() { return feign.Logger.Level.FULL; } /*@Bean public Contract feignContract() { return new feign.Contract.Default(); }*/ }

配置 FeignClient:

@FeignClient(value = "spring-cloud-provider", configuration = RcFeignConfiguration.class)

說明:若配置檔案被 SpringContext 掃描,否則會被@ FeignClien 共用,會覆蓋。

三、 日誌配置

# 日誌配置,預設是不列印任何的日誌 
logging.level.com.drunck.education.feign.IUserBiz=debug

需要在配置類裡面新增以下程式碼

    @Bean
    public Logger.Level feignLoggerLevel() {
        return feign.Logger.Level.FULL;
    }

說明:四種級別
NONE:預設,不列印任何日誌
BASIC:列印請求方法和 URL,和請求返回狀態碼和執行時間。
HEADERS:列印請求和返回的頭部資訊。
FULL:列印以上的全部資訊。

四、 契約配置
1、在配置類裡面新增以下程式碼

@Bean 
public Contract feignContract() { 
 return new feign.Contract.Default(); 
}

2、修改 IuserBiz 類

@RequestLine("GET /api/user/{id}") 
String view1(@Param(value = "id") int id); 

五、 支援壓縮

# 開啟壓縮 
feign.compression.request.enabled=true 
feign.compression.response.enabled=true 
# 更多配置 
feign.compression.request.mime-types=text/xml,application/xml,application/json 
feign.compression.request.min-request-size=2048 

六、 URL 屬性配置

import org.springframework.cloud.netflix.feign.FeignClient; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

/** 
 * @author wujing 
 */ 
@FeignClient(value = "drunck", url = "www.drunck.com") 
public interface IdrunckBiz { 
@RequestMapping(value = "/{url}", method = RequestMethod.GET) 
String get(@PathVariable(name = "url") String url); 

} 

說明:定義了 url 之後,vaule 為必選值,這時的 value 只是一個標識。 

七、 支援繼承
1、定義一個普通介面

public interface UserService { 


@RequestMapping(method = RequestMethod.GET, value = "/api/user/find/{id}") 

User find(@PathVariable(value = "id") int id); 
} 

2、實現介面

import java.util.Date; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RestController; 

import com.drunck.education.bean.User; 
import com.drunck.education.service.UserService; 

/** 
 * @author wujing 
 */ 
@RestController 
public class FeignApiUserController implements UserService { 


protected final Logger logger = LoggerFactory.getLogger(this.getClass()); 


@Override 

public User find(@PathVariable int id) { 

 User user = new User(); 

 user.setId(id); 

 user.setName("無境 1"); 

 user.setCreateTime(new Date()); 

 logger.info("請求介面返回:{}", user); 

 return user; 

} 
} 

說明:springmvc 裡面不支援方法引數對映的繼承
3、繼承

public interface IUserBiz extends UserService{ 
 // … 
}