Spring Cloud OpenFeign 是一个基于Java的声明式HTTP客户端框架,用于简化编写HTTP请求和处理HTTP响应的过程。它是Spring Cloud生态系统中的一部分,旨在简化微服务架构中的服务间通信。
Feign 是 NetFlix 开发的一个轻量级 RESTful 的 HTTP 服务客户端(用它来发起请求,远程调用的),是以 Java 接口注解的方式调用 Http请求。
OpenFeign 是 Spring Cloud 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequesMapping 等等。
OpenFeign 的 @Feignclient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
新建 openfeign-consumer80 模块,然后在 pom.xml 文件中加入以下依赖:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
写 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 类,注入此接口,然后就可以实现远程调用啦~
OpenFeign 虽然提供了日志增强功能,但是默认是不显示任何日志的,不过开发者在调试阶段可以自己配置日志的级别。
OpenFeign的日志级别如下:
在上面模块中加入 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 接口,控制台会显示对应日志信息。
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。在某个峰值时刻,大呈的请求都在同时请求服务消费者,会造成线程的大呈堆积,势必会造成雪崩。
利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,
超时机制也是保护服务的一种手段
在 application.yaml 配置文件中加入以下配置:
feign:
client:
# 配置超时时间
config:
default:
# 连接超时时间, 单位为毫秒
connectTimeout: 2000
# 读取超时时间
readTimeout: 2000
我们可以在提供者模块中模拟超时场景,例如在接口中让线程睡 5 秒,我们设置的超时时间为 2 秒,在调用远端接口时,时间达到 2 秒还没有响应,程序会报错。此处就不在展示对应代码。