1. 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 请求中
2. 自定义配置
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 共用,会覆盖。
3. 日志配置
# 日志配置,默认是不打印任何的日志
logging.level.com.drunck.education.feign.IUserBiz=debug
需要在配置类里面添加以下代码:
@Bean
public Logger.Level feignLoggerLevel() {
return feign.Logger.Level.FULL;
}
说明:四种级别
NONE:默认,不打印任何日志
BASIC:打印请求方法和 URL,和请求返回状态码和执行时间。
HEADERS:打印请求和返回的头部信息。
FULL:打印以上的全部信息。
4. 契约配置
在配置类里面添加以下代码
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
修改 IuserBiz 类
@RequestLine("GET /api/user/{id}")
String view1(@Param(value = "id") int id);
5. 支持压缩
# 开启压缩
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
6. 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
*/
@FeignClient(value = "baidu", url = "www.baidu.com")
public interface IdrunckBiz {
@RequestMapping(value = "/{url}", method = RequestMethod.GET)
String get(@PathVariable(name = "url") String url);
}
说明:定义了 url 之后,vaule 为必选值,这时的 value 只是一个标识。
7. 支持继承
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;
/**
* @author*/
@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("张三");
user.setCreateTime(new Date());
logger.info("请求接口返回:{}", user);
return user;
}
}
说明:springmvc 里面不支持方法参数映射的继承
3、继承
public interface IUserBiz extends UserService{
// …
}
原文 SpringCloud学习笔记(10)----Spring Cloud Netflix之声明式 REST客户端 -Feign的高级特性