十、宣告式 REST 客戶端-Feign 的高階特性
阿新 • • 發佈:2019-01-07
一、 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{
// …
}