是一个轻量级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中
// 注入远程调用的接口类
@Autowired
private 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 {
@Override
public 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和元数据——适合于开发及测试环境定位问 题
@Configuration
public class FeignLog {
@Bean
Logger.Level feignLevel() {
return Logger.Level.FULL;
}
}
2、 配置log日志级别为debug
logging:
level:
# Feign日志只会对日志级别为debug的做出响应
com.lagou.edu.controller.service.ResumeServiceFeignClient: debug
org.springframework.web.servlet.DispatcherServlet: debug
org.springframework.cloud.sleuth: debug