服务接口调用 OpenFeign

服务接口调用 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.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 类,注入此接口,然后就可以实现远程调用啦~

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 秒还没有响应,程序会报错。此处就不在展示对应代码。

你可能感兴趣的:(SpringCloud,springcloud)