一、OpenFeign 简介
是么是 OpenFeign
Feign 是一个声明式 WebService 客户端,使用 Feign 能让编写 WebService 客户端更加简单。只需创建一个接口并在接口上添加注解即可。Feign 也支持可拔插式的编码器和解码器,SpringCloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HTTPMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用易支持负载均衡。
官网解释:
https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeign
GitHub:
https://github.com/spring-cloud/spring-cloud-openfeign
OpenFeign 的用途
Feign 旨在使编写 Java Http 客户端变得更容易。以前在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 的请求进行封装处理,形成了一套模板化的调用方法。
但是,在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。
所以,Feign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义,在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是 Dao 接口上标注 Mapper 注解,现在是一个微服务接口上面标注一个 Feign 注解),即可完成对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。
需要注意的是:Feign 中集成了 Ribbon
Feign 和 OpenFeign 的区别
Feign
-
Feign 是 Spring Cloud 组件中的一个轻量级 RestFul 的HTTP 服务客户端
-
Feign 内置了 Ribbon,用来做客户端的负载均衡去调用服务注册中心的服务
-
Feign 的使用方式是:使用 Feign 的注解定义接口,调用这个接口就可以调用服务注册中心的服务
-
Feign 的依赖包为:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId> </dependency>
OpenFeign
-
OpenFeign 是 Spring Cloud 在 Feign 的基础上支持了 Spring MVC 的注解,如
@RequestMapping
等等 -
OpenFeign 的 @FeignClient 可以解析 Spring MVC 的
@RequestMapping
注解下的接口,并通过动态代理的方式产生实现类,实现类的负载均衡并调用其他服务 -
OpenFeign 的依赖包为:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
二、OpenFeign 的使用
项目中整合 OpenFeign
1、首先,我们需要引入依赖包:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、然后在主启动类中标注 @EnableFeignClients
注解来开启 Feign 的调用功能:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients
public class MainApplication{
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);}
}
3、创建业务接口层
比如我们需要调用支付服务的接口,则创建支付服务对应的接口类,里面包含目标服务的接口方法,并用 @FeignClient
注解修饰:
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);@GetMapping(value = "/payment/feign/timeout")public String paymentFeignTimeout();
}
注解 @FeignClient
的 value 属性值指明了调用的目标服务名称,该服务名称对应注册中心上的服务名称。
OpenFeign 的超时控制
OpenFeign 默认等待1秒钟,如果超过则报错,但有时服务端处理需要超过1秒钟,所以为了避免这种情况,我们需要设置 Feign 客户端的超时控制。Feign 的超时设置在 yml 文件中进行设置:
# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:# 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间ReadTimeout: 5000# 指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000
OpenFeign 日志打印功能
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节,说白了就是对 Feign 接口的调用情况进行监控和输出。
OpenFeign 的日志级别分为如下几种:
- NONE:默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、相应状态码及执行时间;
- HEADERS:除了 BASIC 中定义的信息外,还有请求和相应的头信息;
- FULL:除了 HEADERS 中定义的之外,还有请求和相应的正文及元数据。
想要修改 OpenFeign 日志的级别需要创建日志配置 bean:
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {
@BeanLogger.Level feignLoggerLevel() {
return Logger.Level.FULL;}
}
然后在 YML 文件里开启日志的 Feign 客户端:
logging:level:# feign 日志以什么级别监控哪个接口com.wang.springcloud.service.PaymentFeignService: debug
配置好后就可以在后台查看输出日志了。