1、什么是Feign
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。
2、快速使用
2.1、pom.xml文件中引入以来
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2、编写Feign调用接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import com.cnblogs.javalouvre.api.hystrix.StockApiHystrix;
@FeignClient(name = "stock-service", fallback = StockApiHystrix.class)
public interface StockApi {
@PutMapping(path = "/stock/reduce/{id}/{num}")
String reduce(@PathVariable(name = "id") Long id, @PathVariable(name = "num") Integer num);
}
注意:这里返回参数、请求参数务必与Controller中相关方法保持一致,@PathVariable必须指定参数
3、配置
3.1、日志配置
3.1.1、全局日志配置,对当前微服务下所有Feign接口都起效果
3.1.1.1、application.yml文件中设置日志级别
logging:
level:
com.cnblogs.javalouvre.api: debug
3.1.1.2、编写配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public feign.Logger.Level getFeignLoggerLevel() {
return feign.Logger.Level.FULL;
}
}
3.1.2、局部日志配置,对当前微服务下所指定Feign接口都起效果
3.1.2.1、application.yml文件中设置日志级别
logging:
level:
com.cnblogs.javalouvre.api: debug
3.1.2.2、application.yml配置feign日志级别,需要指定针对服务名称
feign:
client:
config:
stock-service:
loggerLevel: FULL
3.2、超时时间设置
设置超市时间有两种方式
3.2.1、方式一:配置类
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public feign.Request.Options getFeignRequestOptions() {
return new feign.Request.Options(5000, MILLISECONDS, 3000, MILLISECONDS, true);
}
}
3.2.1、方式二:配置文件
在application.yml文件中,设置连接超时时间、读取超时时间
feign:
client:
config:
stock-service:
connectTimeout: 5000
readTimeout: 3000