feign与openfeign

背景介绍

 在微服务架构中,一个请求需要调用多个服务才能完成。为了缩短请求耗时,提升服务的吞吐量,服务之间的互相调用变得格外重要。

  微服务调用方式有两种:一种是RPC方式,另外一种是事件驱动(Event—driven)方式。

事件驱动(Event—driven):也是发消息方式,服务 A 发消息给服务 B,服务 B 接收到消息执行任务,服务 A 不依赖服务 B 的执行结果。例如:mq、zk发布订阅模式 RPC:远程函数调用,服务 A 基于网络通信调用服务 B,服务 A 依赖服务 B 返回结果,调用方式可以是同步,也可以是异步。例如:restful、gRPC、dubbo等

feign介绍

 Feign 旨在使编写 Java Http 客户端变得更容易。在使用 Ribbon+RestTemplate 时,利用 RestTemplate 对 HTTP请求技术框架,如 OkHttp/HttpClient。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。Feign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。。(Feign 集成了 RestTemplate + Ribbon + hystrix)

openfeign介绍

OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等,便于开发人员读懂。

使用

一般来说有两种方式 一是以硬编码的方式存下目标服务ip和端口 一是配置数据动态的存入注册中心,以推送和通知服务的方式来动态变化

# 依赖(例)
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
      <version>1.4.7.RELEASE</version>
</dependency>

@EnableFeignClients //开启feign接口扫描

下面是一个简单的service例子

// 提供者 applicationName
@FeignClient(value = "myService")
public interface UserClient {

    @PostMapping("/user//getUser/{id}")
	@LoadBalanced //负载均衡
    String getUser(Integer id);

}

关于优化

开启feign日志

OpenFeign 提供了日志增强功能,它的日志级别有以下几个:

  • NONE: 默认的,不显示任何日志。
  • BASIC: 仅记录请求方法、URL、响应状态码及执行时间。
  • HEADERS: 除了 BASIC 中定义的信息之外,还有请求和响应的头信息
  • FULL: 除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

通过配置文件来设置日志级别,配置信息如下:

feign:
    client:
        config:
            default:
                loggerLevel: full
logging:
    level:
        com.liangnianban.feign: debug
 
#其中 com.liangnianban.feign 为 OpenFeign 接口所在的包名。
#虽然 OpenFeign 默认是不输出任何日志,但在开发阶段可能会被修改,因此在生产环境中
#我们应仔细检查并设置合理的日志级别,以提高 OpenFeign 的运行效率。
feign超时

OpenFeign 底层内置了 Ribbon 框架,并且使用了 Ribbon 的请求连接超时时间和请求处理超时时间作为其超时时间,而 Ribbon 默认的请求连接超时时间和请求处理超时时间都是 1s

1s在真正的生产使用中是不合理的,我们需要调整一下时间,有一下两种方法:

  • 通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。
  • 直接修改 OpenFeign 的超时时间(推荐使用)。
#1.通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。
ribbon:
  ConnectTimeout: 5000 #请求连接的超时时间
  ReadTimeout: 5000 #请求处理的超时时间
 
 
#2.直接修改 OpenFeign 的超时时间(推荐使用)
feign:
  client:
    config:
      default:
        ConnectTimeout: 5000 #请求连接的超时时间
        ReadTimeout: 5000 #请求处理的超时时间
http连接池

专用通信组件自带连接池可以更好地对 HTTP 连接对象进行重用与管理,同时也能大大的提升 HTTP 请求的效率

        <!--Spring Cloud OpenFeign Starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--http连接池-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
 feign:
  httpclient:
    enabled: true #开启httpclient (只需引入依赖,程序默认开启)
其他优化

还有一点就是可以对响应数据进行gzip压缩,一般浏览器都默认支持,但这样会额外消耗一些cpu资源,视情况而定,详细信息可参考我之前写的blog springboot压缩http响应数据

优化总结

OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件,在生产环境中我们可以通过以下配置来优化 OpenFeign 的运行:

  • 修改 OpenFeign 的超时时间,让 OpenFeign 能够正确的处理业务。
  • 通过配置专用的通信组件 Apache HttpClient 或 OKHttp,让 OpenFeign 可以更好地对 HTTP 连接对象进行重用和管理,以提高其性能。
  • 开启数据压缩功能,可以提高宽带利用率和加速数据传输速度。
  • 检查生成环境中 OpenFeign 的日志级别,选择合适的日志输出级别,防止无效的日志输出。