服务接口调用 OpenFeign
Spring Cloud OpenFeign 是一个基于Java的声明式HTTP客户端框架,用于简化编写HTTP请求和处理HTTP响应的过程。它是Spring Cloud生态系统中的一部分,旨在简化微服务架构中的服务间通信。
1. 介绍
Feign 是 NetFlix 开发的一个轻量级 RESTful 的 HTTP 服务客户端(用它来发起请求,远程调用的),是以 Java 接口注解的方式调用 Http请求。
OpenFeign 是 Spring Cloud 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequesMapping 等等。
OpenFeign 的 @Feignclient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
2. 入门案例
新建 openfeign-consumer80 模块,然后在 pom.xml 文件中加入以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 加入上篇文章中[服务注册中心Eureka](https://blog.csdn.net/m0_53067943/article/details/132428158?spm=1001.2014.3001.5501) Eureka 客户端的相关依赖,这里就不在展示~ -->
写 application.yaml 配置文件,具体如下:
server:
port: 80
spring:
application:
name: cloud-openfeign-consumer-80
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: cloud-consumer-80
在启动类上面加入下面两个注解:
@EnableFeignClients
@EnableEurekaClient
创建远程调用接口 IOpenFeignService,用来调用提供者提供的接口,具体如下:
@Component
@FeignClient(value = "cloud-provider-8001")
public interface IOpenFeignService {
/**
* 调用生产者的对应接口
*/
@GetMapping("/provider/index")
String index();
}
说明:
@FeignClient 注解的参数说明要调用的哪个远端服务,在注册中心可以获取到。
@GetMapping 注解对应的路径为远端服务的接口路径。
这个接口和我们日常写的接口是一样的,只是这个不需要我们去实现,因为远端服务已经实现过了,我们只是通过注解的方式将它配置过来。
最后编写对应的 consumerController 类,注入此接口,然后就可以实现远程调用啦~
3. 日志增强
OpenFeign 虽然提供了日志增强功能,但是默认是不显示任何日志的,不过开发者在调试阶段可以自己配置日志的级别。
OpenFeign的日志级别如下:
- NONE:默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
- FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
在上面模块中加入 OpenFeignConfig 配置类,具体如下:
import feign.Logger;
@Configuration
public class OpenFeignConfig {
/**
* 日志级别定义
*/
@Bean
Logger.Level feginLogLevel() {
return Logger.Level.FULL;
}
}
在 application.yaml 配置文件中加入以下配置:
logging:
level:
# openfeign接口所在的包名
com.cloud.service: debug
再次请求上面的 index 接口,控制台会显示对应日志信息。
4. 超时处理
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。在某个峰值时刻,大呈的请求都在同时请求服务消费者,会造成线程的大呈堆积,势必会造成雪崩。
利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,
超时机制也是保护服务的一种手段
在 application.yaml 配置文件中加入以下配置:
feign:
client:
# 配置超时时间
config:
default:
# 连接超时时间, 单位为毫秒
connectTimeout: 2000
# 读取超时时间
readTimeout: 2000
我们可以在提供者模块中模拟超时场景,例如在接口中让线程睡 5 秒,我们设置的超时时间为 2 秒,在调用远端接口时,时间达到 2 秒还没有响应,程序会报错。此处就不在展示对应代码。