当前位置: 首页 > news >正文

OpenFeign服务调用与负载均衡

目录

  • 介绍
  • 使用
  • 高级特性
    • 超时控制
    • 重试机制
    • 默认HttpClient修改
    • 请求/响应报文压缩
    • 日志打印功能
  • 相关文献

介绍

官网说明:
在这里插入图片描述

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 或具有默认构造函数。

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

全局配置:

spring:cloud:openfeign:client:config:default:connectTimeout: 5000readTimeout: 5000loggerLevel: basic

指定配置

spring:cloud:openfeign:client:config:your-server-name:connectTimeout: 5000readTimeout: 5000loggerLevel: 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。
在这里插入图片描述
引入依赖

<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

spring:cloud:openfeign:httpclient:hc5:anabled: true

修改成功后,日志发生改变
在这里插入图片描述

在这里插入图片描述

请求/响应报文压缩

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

spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true

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

## 开启请求压缩
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日志全面打印

@Configuration
public class FooConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

Feign 会为创建的每个 Feign 客户端创建一个记录器。
默认情况下,记录器的名称是用于创建 Feign 客户端的接口的完整类名。
例如我要监控我的UserClient接口的日志,UserClient类在com.demo.apis包下,那么yml配置如下:

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

相关文章:

  • 信息检索(43):SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking
  • 高校新闻头条系统
  • MySQL的DML语句
  • 软件工程复习
  • centOS Stream9配置NAT8网络
  • Java 面试题:谈谈 final、finally、 finalize 有什么不同?
  • 【信息学奥赛】CSP-J/S初赛03 计算机网络与编程语言分类
  • idea和maven搭配问题,maven下载失败
  • 面试题 08.14. 布尔运算
  • DOM 加载函数
  • 【C++】平衡二叉树(AVL树)的实现
  • 状态压缩DP——AcWing 291. 蒙德里安的梦想
  • 【国际化I18n使用方法】vue2使用i18简单实现多语种切换,刷新保持,动态数据处理
  • 有哪些重大影响的算法?
  • 如何修复“AI的原罪”
  • 【comparator, comparable】小总结
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Angular Elements 及其运作原理
  • JavaScript函数式编程(一)
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel 菜鸟晋级之路
  • pdf文件如何在线转换为jpg图片
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Rancher-k8s加速安装文档
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 阿里云前端周刊 - 第 26 期
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 构建工具 - 收藏集 - 掘金
  • 力扣(LeetCode)357
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端路由实现-history
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 问题之ssh中Host key verification failed的解决
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ‌移动管家手机智能控制汽车系统
  • # dbt source dbt source freshness命令详解
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (1)Android开发优化---------UI优化
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (pytorch进阶之路)扩散概率模型
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (四)鸿鹄云架构一服务注册中心
  • (学习日记)2024.01.19
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)linux下的时间函数使用
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .cfg\.dat\.mak(持续补充)