OpenFeign服务调用与负载均衡

目录

介绍

官网说明:

Feign 是一个声明式 Web 服务客户端。它使编写 Web 服务客户端变得更加容易。要使用 Feign,请创建一个接口并对其进行注释。它具有可插拔的注释支持,包括 Feign 注释和 JAX-RS 注释。Feign 还支持可插拔编码器和解码器。Spring Cloud 增加了对 Spring MVC 注解的支持,以及使用 Spring Web 中默认使用的注 HttpMessageConverters 解。Spring Cloud 集成了 Eureka、Spring Cloud CircuitBreaker 以及 Spring Cloud LoadBalancer,以便在使用 Feign 时提供负载均衡的 http 客户端。

使用

创建一个springboot项目,主启动类加注解**@EnableFeignClients**,开启OpenFeign功能并激活

在提供接口的项目模块中引入openfeign依赖,新建接口,并在接口类中配置@FeignClient注解,@FeignClient("xxxx")的xxx是consul或者是其他服务注册中间件中的服务名。

高级特性

超时控制

我们可以在默认客户端和命名客户端上配置超时。OpenFeign 使用两个超时参数:

  • connectTimeout 防止由于服务器处理时间过长而阻止调用方。
  • readTimeout 从建立连接时开始应用,并在返回响应时间过长时触发。

OpenFeign不配置超时时间的话默认等待60秒,超时后会报错

如何自定义配置超时时间如下:

feignName 在此示例中, 是@FeignClient value 它也与 @FeignClient name 和 @FeignClient contextId 别名。在负载均衡方案中,它还对 serviceId 应于将用于检索实例的服务器应用。decoders、retryer 和其他类的指定类必须在 Spring 上下文中具有 bean 或具有默认构造函数。

配置可分全局配置和指定配置,如果一个接口中存在调用多个微服务的接口,每个微服务的请求时间不同,根据业务不同需要特色化配置,就需要用到指定超时时间配置。

全局配置:

yaml 复制代码
spring:
    cloud:
        openfeign:
            client:
                config:
                    default:
                        connectTimeout: 5000
                        readTimeout: 5000
                        loggerLevel: basic

指定配置

yaml 复制代码
spring:
    cloud:
        openfeign:
            client:
                config:
                    your-server-name:
                        connectTimeout: 5000
                        readTimeout: 5000
                        loggerLevel: basic

区别在于config:下级配置名称不同

如果更喜欢使用配置属性来配置所有 @FeignClient ,则可以使用 default 假名创建配置属性,这样是所有的服务接口统一用一套超时时间,如果yml配置文件中同时存在defalut和指定服务名,指定服务名的超时时间是独立的,其他服务是默认,指定服务名的优先级更高。

重试机制

在模块中新增配置类

默认HttpClient修改

OpenFeign中http client如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,

由于默认HpURLConnection没有连接池、性能和效率比较低,如果采用默认,性能上不是最优解,所以要改成http5,且官方回应也是从 Spring Cloud OpenFeign 4 开始,不再支持 Feign Apache HttpClient 4。我们建议改用 Apache HttpClient 5。

引入依赖

xml 复制代码
<1--httpclient5-->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId>
<version>5.3</version>
</dependency>
<1--feign-hc5-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hc5</artifactId>
<version>13.1</version>
</dependency>

修改yml

yaml 复制代码
spring:
 cloud:
  openfeign:
   httpclient:
    hc5:
     anabled: true

修改成功后,日志发生改变

请求/响应报文压缩

对请求和响应进行GZIP压缩

Spring Cloud OpenFeign支持对谐求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的两个参数设置,就能开启请求与相应的压缩功能:

xml 复制代码
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true

细粒度化设置对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型并设置了请求压缩的大小下限,只有超过这个大小的请求才会进行压缩:

xml 复制代码
## 开启请求压缩
spring.cloud.openfeign.compression.request.enabled=true
## 触发压缩数据类型
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json
## 最小触发压缩的大小
spring.cloud.openfeign.compression.request.min-request-size=2048

日志打印功能

Feign 提供了日志打印功能,对Feign接口的调用情况进行监控和输出

日志级别:

  • NONE ,无日志记录 (DEFAULT)。
  • BASIC ,仅记录请求方式和 URL 以及响应状态代码和执行时间。
  • HEADERS ,记录基本信息以及请求和响应标头。
  • FULL ,记录请求和响应的标头、正文和元数据。

新建配置类,对Feign日志全面打印

java 复制代码
@Configuration
public class FooConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

Feign 会为创建的每个 Feign 客户端创建一个记录器。

默认情况下,记录器的名称是用于创建 Feign 客户端的接口的完整类名。

例如我要监控我的UserClient接口的日志,UserClient类在com.demo.apis包下,那么yml配置如下:

yaml 复制代码
logging:
	level:
		com:
			demo:
				apis:
					UserClient: DEBUG

相关文献

Spring Cloud OpenFeign官网链接:https://docs.spring.io/spring-cloud-openfeign/docs/4.0.7-SNAPSHOT/reference/html/#spring-cloud-feign

Spring Cloud OpenFeign properties属性明细链接:https://docs.spring.io/spring-cloud-openfeign/docs/4.0.7-SNAPSHOT/reference/html/appendix.html

Github OpenFeign:https://github.com/OpenFeign/feign

相关推荐
码代码的小农3 小时前
SpringCloud Alibaba微服务工程搭建
spring·spring cloud·微服务
识途老码18 小时前
Ningx负载均衡
运维·负载均衡
小杜-coding20 小时前
黑马头条day02
java·spring boot·spring·spring cloud·java-ee·maven·mybatis
AronTing1 天前
11-Spring Cloud OpenFeign 深度解析:从基础概念到对比实战
后端·spring cloud·架构
2401_890665861 天前
免费送源码:Java+ssm+MySQL 基于PHP在线考试系统的设计与实现 计算机毕业设计原创定制
java·hadoop·spring boot·python·mysql·spring cloud·php
小杨4042 天前
springboot框架项目实践应用十九(nacos配置中心)
spring boot·后端·spring cloud
Neo Yang2 天前
Spring Cloud初探之使用load balance包做负载均衡(三)
spring cloud·负载均衡·load balance
魔道不误砍柴功2 天前
SpringCloud Alibaba 之分布式全局事务 Seata 原理分析
分布式·spring·spring cloud
Charlie__ZS2 天前
Spring Cloud-负载均衡
spring·spring cloud·负载均衡
庸子2 天前
负载均衡集群与高可用集群深度解析
运维·负载均衡