一、什么是OpenFeign?
要理解OpenFeign,先理解Feign。Feign是一个声明式的WebService客户端,她的目标是让编写JavaHttp客户端更加容易。Spring Cloud对Feign进行了封装,使其支持了Spring MNC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。之前的微服务常规调用是通过Ribbon+RestTemplate,在实际开发中,往往一个接口会被多处调用,所以我们需要把微服务调用模块进行封装,形成调用客户端,Feign在此基础上进行了封装,它帮助我们完成对服务提供方的接口绑定,减化使用springcloudRibbon时自行封装调用客户端的开发量,我们只需要创建一个接口,通过在接口上添加注解来完成功能实现(类似Dao接口上使用@Mapper一样)。
Feign本身集成了Ribbon,实现了客户端的负载均衡,而OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC注解,OpenFeign已经全面替代了Feign。OpenFeign的@FeignClient注解可以解析@RequestMapping注解的接口,动态代理产生实现类,在实现类中做负载均衡并调用微服务。由于OpenFeign的作用是服务调用,因此它使用在服务消费者中,而不是服务提供者中。
二、OpenFeign服务调用
1、使用OpenFeign首先需要引入jar包,引入方式如下
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2、在主启动类中增加@EnableFeignClients注解
3、书写业务逻辑接口,在接口上增加@FeignClient注解,例如:
@Component @Feignclient(value = "CLOUD-PAYMENT-SERVICE") /* value的值为要调用的微服务模块的名称,注意这里不要加http:// */ public interface PaymentFeignservice { GetMapping(value = "/payment/get/id}") /* value的值为服务模块具体的控制器方法 */ public commonResult<Payment> getPaymentById(@Pathvariable("id") Long id); }
注意:通常一个微服务就对应一个接口类,接口类中的方法对应微服务对外提供的方法。上面的代码表示调用CLOUD-PAYMENT-SERVICE 服务的/payment/get/id方法。
4、控制层调用以上封装的接口,完成业务逻辑处理
@Component
public class orderFeigncontroller
{
@Resource
private PaymentFeignservice paymentFeignservice;
@GetMapping(value = "/consumer/payment/get/{fid}") public commonResult<Payment> getPaymentById(@Pathvariable("id") Long id) { return paymentFeignservice.getPaymentById(id); } }
三、OpenFeign超时控制
服务调用一定会产生超时的情况,OpenFeign默认等待调用服务接口的超时时间是1秒,超过1秒后就会自己抛出超时错误。有些情况下我们根据需求需要调整超时等待时间,可以在yml配置文件中开启配置,OpenFeign的超时时间设置是由集成的Ribbon来控制的,代码如下
#设置feign客广端超时时间(openFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时问 connectTimeout: 5000
四、OpenFeign日志增强管理功能
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解服务调用中http请求的细节,它提供了对Feign接口的调用情况进行监控和输出的功能。
1、日志级别说明:
NONE-->默认,不显示任何日志
BASIC-->仅记录请求方法、URL、响应状态码、执行时间
HEADERS-->BASIC+请求头信息+响应头信息
FULL-->HEADERS+请求和响应的正文及元数据
2、配置日志打印功能:新建配置文件夹config,添加配置文件类FeignConfig,导入feign.Logger,写入如下代码
@Configuration public class Feignconfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Leve1.FULL; /* 表示开启详细日志 */ } }
3、yml配置文件中,配置日志以什么级别来监控哪个接口(这里的级别不是1中的级别)。如下表示以dubug级别来监控PaymentFeignservice接口
logging:
level:
# feign日志以什么级别监控哪个接口
com.atguigu.springcloud.service.PaymentFeignservice: debug