1.简介
Feign 是由 Netflix 开源的声明式的 HTTP 客户端,目前已经捐献给 OpenFeign 社区。
Spring Cloud OpenFeign 组件,将 Feign 集成到 Spring Cloud 体系中,实现服务的声明式 HTTP 调用。相比使用 RestTemplate 实现服务的调用,Feign 简化了代码的编写,提高了代码的可读性,大大提升了开发的效率。
Spring Cloud OpenFeign 除了支持 Feign 自带的注解之外,额外提供了对 JAX-RS 注解、SpringMVC 注解的支持。特别是对 SpringMVC 注解的支持,简直是神来之笔,让我们不用学习 Feign 自带的注解,而直接使用超级熟悉的 SpringMVC 注解。
同时,Spring Cloud OpenFeign 进一步将 Feign 和 Ribbon 整合,提供了负载均衡的功能。另外,Feign 自身已经完成和 Hystrix 整合,提供了服务容错的功能。
如此,我们基于注解,极其简单的实现服务的调用,并且具有负载均衡、服务容错的功能。
2.入门案例
基于上一篇Riibon入门使用总结的使用案例的基础上修改消费者
依赖引入
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
新建Feign接口
/**
* 服务提供者feign
*
* @author xiao7
*/
@FeignClient(value = "cloud-provider")
public interface ProviderFeignService {
/**
* provider测试接口
*
* @param name
* @return
*/
@GetMapping("/provider/index/{name}")
String testProvider(@PathVariable("name") String name);
}
配置启动类
@EnableFeignClients
:开启Feign,会扫描启动类的包注册需要的Bean
/**
* @author xiao7
*/
@EnableDiscoveryClient
@SpringBootApplication
@RibbonClient(value = "cloud-provider", configuration = FiveTimeRule.class)
@EnableFeignClients
public class ConsumerApplication8082 {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication8082.class, args);
}
}
3. 自定义 Feign 配置
实现 Feign
自定义配置,可以通过配置文件
和 Spring JavaConfig
两种方式。
3.1.日志配置
在 Feign
中,定义了四种日志级别:
NONE
:不打印日志BASIC
:只打印基本信息,包括请求方法、请求地址、响应状态码、请求时长HEADERS
:在BASIC
基础信息的基础之上,增加请求头、响应头FULL
:打印完整信息,包括请求和响应的所有信息。
开启日志需要扫描的包:
logging:
level:
xiao7.cloud.consumer.feign: DEBUG
配置文件方式:
feign:
# Feign 客户端配置,对应 FeignClientProperties 配置属性类
client:
# config 配置项是 Map 类型。key 为 Feign 客户端的名字,value 为 FeignClientConfiguration 对象
config:
# 全局级别配置
default:
logger-level: BASIC
# 客户端级别配置
cloud-provider:
logger-level: FULL
通过 FeignClientConfiguration 配置属性类,我们可以看到配置文件所支持的 FeignClient 的所有配置项。
代码如下:
// Feign 日志级别。默认为 NONE
private Logger.Level loggerLevel;
// 请求的连接超时时长,单位:毫秒。默认为 10 * 1000 毫秒
private Integer connectTimeout;
// 请求的读取超时时长,单位:毫秒。默认为 60 * 1000 毫秒
private Integer readTimeout;
// 重试策略。默认为不重试
private Class<Retryer> retryer;
// 错误解码器
private Class<ErrorDecoder> errorDecoder;
// 请求拦截器
private List<Class<RequestInterceptor>> requestInterceptors;
// 是否对响应状态码为 404 时,进行解码。默认为 false
private Boolean decode404;
// 解码器。
// 为空时,默认创建 SpringDecoder Bean
private Class<Decoder> decoder;
// 解码器。默认为 SpringEncoder
// 为空时,默认创建 SpringEncoder Bean
private Class<Encoder> encoder;
// 契约。
// 为空时,默认创建 SpringMvcContract Bean,提供对 SpringMVC 注解的支持
private Class<Contract> contract;
Java Config方式:
@Configuration
public class CloudConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
}
@Bean
public Logger.Level defaultFeignClientLoggerLevel() {
return Logger.Level.FULL;
}
}
启动测试即可