是一个轻量级RESTful的HTTP服务客户端(用它来发起请求, 远程调用的组件)  
以Java接口注解的方式调用Http请求,而不用像Java中通过封装 HTTP请求报文的方式直接调用
类似于Dubbo,服务消费者拿到服务提供者的接口,然后像调用本地接口方法一样去调用,实际发出的是远程的请求
1、 使用Feign非常简单,创建一个接口(在消费者,也就是服务调用方这一端),并在接口上添加一些注解
2、 SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解      
本质:封装了Http调用流程,更符合面向接口化的编程习惯,类似于Dubbo的服务调用。 Dubbo的调用方式其实就是很好的面向接口编程  
Feign配置应用
 在服务调用者工程(消费端)创建接口(添加注解)  
 (效果)Feign = RestTemplate+Ribbon+Hystrix
1、引入Feign依赖
服务消费者工程(自动投递微服务)这一端
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2、启动类开启Feign远程支持
服务消费者工程(自动投递微服务)启动类使用注解@EnableFeignClients 添加 Feign支持
注意:此时去掉Hystrix熔断的支持注解**reaker即可包括引入的依赖,因为Feign会自动引入 
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients // 开启Feign 客户端功能public class AutodeliverApplication8096 {public static void main(String[] args) {SpringApplication.run(AutodeliverApplication8096.class,args);}}
3、创建Feign接口
1、@FeignClient表明当前类是一个Feign客户端,value是指向要请求的服务名称(登记到注册中心上的服务提供者的服务名称)
2、接口中的接口方法,就好比是远程服务提供者Controller中的Hander方法 (只不过如同本地调用了),那么在进行参数绑定的时,可以使用@PathVariable、@RequestParam、@RequestHeader等,这也是OpenFeign 对SpringMVC注解的支持,但是需要注意value必须设置,否则会抛出异常  
@FeignClient(value = "lagou-service-resume",path = "/resume")public interface ResumeServiceFeignClient {// Feign要做的事情就是,拼装url发起请求// 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求@GetMapping("/openstate/{userId}")public Integer findDefaultResumeState(@PathVariable("userId") Long userId);}
4、注入接口再进行远程调用
@RestController@RequestMapping("/autodeliver")public class AutodeliverController { //在controller中// 注入远程调用的接口类@Autowiredprivate ResumeServiceFeignClient resumeServiceFeignClient;@GetMapping("/checkState/{userId}")public Integer findResumeOpenState(@PathVariable Long userId) {//通过调用接口的方式进行远程调用Integer defaultResumeState = resumeServiceFeignClient.findDefaultResumeState(userId);return defaultResumeState;}}
Feign对负载均衡的支持
 Feign 本身已经集成了Ribbon依赖和自动配置 , Feign默认的请求处理超时时长1s,有时候我们的业务确实执行的需要一定时间,那么这个时候,我们就需要调整请求处理超时时长,Feign自己有超时设置,如果配置 Ribbon的超时,则会以Ribbon的为准。  
可以继续在application.yml中配置
#针对的被调用方微服务名称,不加就是全局生效lagou-service-resume:ribbon:#请求连接超时时间ConnectTimeout: 2000#请求处理超时时间##########################################Feign超时时长设置ReadTimeout: 3000#对所有操作都进行重试OkToRetryOnAllOperations: true####根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),####如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),####如果依然不行,返回失败信息。MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第一次调用MaxAutoRetriesNextServer: 0 #切换实例的重试次数NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整
Feign对熔断器的支持
1、配置中开启Feign对熔断器的支持 、
Feign的超时时长设置那其实就上面Ribbon的超时时长设置
# 开启Feign的熔断功能feign:hystrix:enabled: false
2、配置中进行Hystrix超时设置
1)开启Hystrix之后,Feign中的方法都会被进行一个管理了,一旦出现问题就进行对应的回退逻辑处理 
2)针对超时这一点,当前有两个超时时间设置(Feign/hystrix),熔断的时候是根 据这两个时间的最小值来进行的,即处理时长超过最短的那个超时时间了就熔断进行回退降级逻辑  
hystrix:command:default:execution:isolation:thread:##########################################Hystrix的超时时长设置timeoutInMilliseconds: 15000
3、创建回退类并实现远程调用接口
降级回退逻辑需要自定义一个类,实现FeignClient接口,实现接口中的方法
@Component // 别忘了这个注解,还应该被扫描到public class ResumeFallback implements ResumeServiceFeignClient {@Overridepublic Integer findDefaultResumeState(Long userId) {return -6;}}
4、FeignClient注解中关联fallback类
这里已经添加了自定义的服务降级的类ResumeFallback
@FeignClient(value = "lagou-service-resume",fallback = ResumeFallback.class,path = "/resume")public interface ResumeServiceFeignClient {// Feign要做的事情就是,拼装url发起请求// 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求@GetMapping("/openstate/{userId}")public Integer findDefaultResumeState(@PathVariable("userId") Long userId);}
Feign对请求压缩和响应压缩的支持
Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数 即可开启请求与响应的压缩功能:
feign:compression:request:enabled: true # 开启请求压缩mime-types: text/html,application/xml,application/json # 设置压缩的数据类型,此处也是默认值min-request-size: 2048 # 设置触发压缩的⼤⼩下限,此处也是默认值response:enabled: true # 开启响应压缩
Feign的日志级别配置
如果我们想看到Feign请求时的日志,我们可以进行配置,默认情况下Feign的日志 没有开启。
1、创建Feign日志类并设置级别
// Feign的日志级别(Feign请求过程信息) 
// NONE:默认的,不显示任何日志——性能最好 
// BASIC:仅记录请求方法、URL、响应状态码以及执行时间——日产问题追踪 
// HEADERS:在BASIC级别的基础上,记录请求和响应的header 
// FULL:记录请求和响应的header、body和元数据——适合于开发及测试环境定位问 题  
@Configurationpublic class FeignLog {@BeanLogger.Level feignLevel() {return Logger.Level.FULL;}}
2、 配置log日志级别为debug
logging:level:# Feign日志只会对日志级别为debug的做出响应com.lagou.edu.controller.service.ResumeServiceFeignClient: debugorg.springframework.web.servlet.DispatcherServlet: debugorg.springframework.cloud.sleuth: debug
