发布于 

OpenFeign的基本使用

OpenFeign简介

OpenFeign的全称为Spring Cloud OpenFeign,OpenFeign是Spring官方提出替代Netflix公司在2019年停止更新的Feign的服务调用组件。在2018年以前的项目一般使用的是Feign,在之后的项目中一般都使用OpenFeign

Feign与OpenFeign比较

相同点:

  • Feign与OpenFeign都是SpringCloud的服务调用与负载均衡组件
  • Feign与OpenFeign都集成了Ribbon,并利用Ribbon维护了一个可用的服务清单,并通过Ribbon实现负载均衡调用
  • Feign与OpenFeign都是在服务消费者端通过注解方式进行配置,已实现远程服务的调用

不同点:

  • Feign与OpenFeign所需要引入的依赖不同;Feign是spring-cloud-starter-feign,而OpenFeign是spring-cloud-starter-openfeign
  • Feign与OpenFeign所支持的注解不同;Feign支持Feign本身的注解和JAX-RS(JavaTM API for Restful Web Service)注解,而OpenFeign不仅支持Feign本身的注解和JAX-RS注解,还支持SpringMVC注解(@GetMapping,@PostMapping等等)

OpenFeign常用注解

注解 说明
@FeignClient 该注解用于通知OpenFeign组件对该接口下的@RequestMapping注解下的接口通过动态代理生成服务调用的实现代码并实现负载均衡
@EnableFeignClients 该注解作用与项目启动类上,用于开启@FeignClient注解扫描,并生成对应的实现类并注册入Spring容器中
@RequestMapping SpringMVC注解,用来映射请求,类似Servlet中的web.xml
@GetMapping SpringMVC注解,相当于@RequestMapping(method=RequestMapping.GET)
@PostMapping SpringMVC注解,相当于@RequestMapping(method=RequestMapping.POST)

OpenFeign使用

在普通项目中做服务调用使用

1.依赖引入

1
2
3
4
5
<!--添加 OpenFeign 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.在启动类上加上@EnableFeignClients注解,若启动类模块之外的模块使用到了OpenFeign,需要在注解中设置basePackages的值,此注解的作用就是开启对FeignClient注解的扫描,并通过动态代理的方式生成对应Feign的实现类,使用如下:

1
@EnableFeignClients(basePackages = {"com.stitchcodes.xxx.server.feign"})

3.创建OpenFeign接口,在接口上加上FeignClient注解,用于被OpenFeign发现并生成对应实现类,在普通项目中需要设置名称name属性和访问的url属性,name属性必须设置,但在普通项目中无意义,url为请求的地址,使用样例如下:

1
2
3
4
5
6
@FeignClient(name = "heartBeatFeignClient",url = "http://127.0.0.1:8080")
public interface HeartBeatFeignClient {

@GetMapping("/mower/api/heartbeat")
Map<String,Object> getRobotHeartBeat(@RequestParam("robotId") String robotId);
}

注意:

  • OpenFeign对Feign动态实现了Feign接口后会自动将Feign注入到Spring容器中,当需要使用FeignClient时可以直接注入到对应的Bean中直接使用

  • url可以采取读取配置文件中的方式去实现调用,如下

    1
    @FeignClient(name = "heartBeatFeignClient",url = "http://${myfeign.ip}:${myfeign.port}")

在微服务项目中使用

1.在微服务项目中如果需要在客户端实现负载均衡,除了需要引入Feign依赖,还需要引入Ribbon,若不需要负载均衡,则不需要引入Ribbon

1
2
3
4
5
<!-- Ribbon 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

2.在分布式微服务中,我们往往不会在FeignClient上写死调用的地址以及对应的端口,而是从注册中心拉取可用的服务列表,选择一个服务去调用,所以一般FeignClient中只通过设置name属性或者value属性指定需要调用的服务名称,从而实现远程调用,如下:

1
2
3
4
5
6
@FeignClient("FEIGN-EUREKA-CLIENT-PRODUCER")
@RequestMapping("/producer")
public interface ProducerFeignClient {
@GetMapping("/list")
List<String> list();
}

3.同时我们希望服务的消费者能够从服务的注册中心拉取可用的服务列表,以Eureka为例,以下配置是必要的:

1
2
3
eureka:
client:
fetch-registry: true # 从注册中心拉取可用服务列表

4.对于服务提供者,由于我们希望能够通过名称去获取到该服务的信息,所以我们需要配置服务提供者的主机名称,以及希望最后通过IP替换该应用名称进行访问,且服务提供者会向注册中心注册自己,所以服务提供者的Eureka客户端必须包含如下配置:

1
2
3
4
5
6
eureka:
client:
register-with-eureka: true # 向服务注册中心注册自己
instance:
hostname: feign-eureka-client-producer
prefer-ip-address: true

OpenFeign超时控制

OpenFeign在微服务调用过程中的默认处理请求的时间为1s,若处理请求的时间超过了1s,则会报错。为了避免类似的事情发生,我们需要对OpenFeign客户端的超时时间进行控制

在没有使用Ribbon时的超时控制

通过配置Feign的连接时间和读取时间来进行超时控制:

1
2
3
4
5
6
feign:
client:
config:
default:
connect-timeout: 1000
read-timeout: 5000

在使用Ribbon时的超时控制

通过ribbon来设置超时时间控制:

1
2
3
ribbon:
ReadTimeout: 3000
ConnectionTimeout: 3000

FAQ

当将OpenFeign作为普通的远程调用组件使用时,OpenFeign的默认连接超时时间为10s,默认读取超时时间为60s,而将OpenFeign在微服务中作为服务调用组件时,默认连接和读取超时时间都为1s,因为在不同情况下调用OpenFeign的excute方法不一样

OpenFeign日志增强

OpenFeign提供了日志打印功能,我们可以通过配置调整日志级别,从而了解OpenFeign的请求细节,Feign为每一个FeignClient都提供了一个feign.Logger实例,通过他可以对OpenFeign服务绑定接口的调用情况进行监控。

1.通过在application.yml中配置如下内容:

1
2
3
logging:
level:
com.stitchcodes.feign.ProducerFeignClient: debug

2.添加配置类,用于设置展示哪些信息:

1
2
3
4
5
6
7
@Configuration
public class ConfigBean {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL; //展示全部日志信息
}
}

Logger.Level 的具体级别如下:

  • NONE:不记录任何信息。
  • BASIC:仅记录请求方法、URL 以及响应状态码和执行时间。
  • HEADERS:除了记录 BASIC 级别的信息外,还会记录请求和响应的头信息。
  • FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等等。



Copyright © 2023 ChenWei | Powered By Stellar
本站已运行 00 小时 00