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

Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用

Feign和OpenFeign

Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端,可以使用⽤它来发起请求,进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求,而不是像RestTemplate那样,在Java中通过封装HTTP请求报⽂的⽅式直接调用。
Feign可帮助我们更加便捷,优雅的调⽤HTTP API:不需要我们去拼接url然后调⽤restTemplate的api,但是Fegin的缺点缺点,它不支持SpringMVC的注解。

Spring Cloud在Feign的基础上进行了封装,从而有了OpenFeign。
Feign githup主页

OpenFeign的使用

OpenFeign的使用非常简单,只需要在服务调用方创建远程调用接口,然后创建和被调用方方法一样的方法,最后在需要使用的地方导入远程调用接口,调用接口的方法即可发起请求了。

在pom文件中添加OpenFeign的依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

在调用方服务的启动类上添加@EnableFeignClients注解

@SpringBootApplication
@EnableFeignClients  //开启Feign的功能
public class Conuserservice01Application {public static void main(String[] args) {try {SpringApplication.run(Conuserservice01Application.class, args);} catch (Exception e) {System.out.println("e.getMessage() = " + e.getMessage());}}}

创建远程调用接口

@FeignClient("providerservice")  //指定要调用的服务需要和被调用的服务的application.name保持一致
public interface ProviderServiceClient {//要调用的服务中的请求,需要被调用的服务中的请求方法保持一致@GetMapping("/user/{userId}")public String getUserById(@PathVariable("userId") String userId);}

在Controller中使用远程调用接口

@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate ProviderServiceClient client;@RequestMapping("/{userId}")public String getUserById(@PathVariable String userId) {LOGGER.info("userId: " + userId);String user = client.getUserById(userId);return user;}
}

访问/consumer/1的请求,会远程调用providerservice服务实例中请求路径为/user/{userId}的请求。
在这里插入图片描述

providerservice服务中被访问的请求,这个请求的方法要和远程调用接口中的方法保持一致。

@RestController
@RequestMapping("/user")
public class UserController {private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);@GetMapping("/{userId}")public String getUserById(@PathVariable String userId) {LOGGER.info("userId: " + userId);return "user1";}
}

Feign的相关配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
在这里插入图片描述
一般我们只需要修改日志级别即可。

日志级别

Feign的日志级别有如下几种:

  • NONE:默认的,不显示任何⽇志,性能最好;
  • BASIC:仅记录请求⽅法、URL、响应状态码以及执⾏时间----⽣产问题追踪;
  • HEADERS:在BASIC级别的基础上,记录请求和响应的header;
  • FULL:记录请求和响应的header、body和元数据,适⽤于开发及测试环境定位问题;

覆盖Feign默认的配置有两个维度,一个是为每个FeignClient单独配置(局部配置),另一个是全局配置;下面先来看局部配置。不过要先在yml中设置SpringBoot的日志输出级别

logging:level:# Feign⽇志只会对⽇志级别为debug的做出响应,这里需要设置SpingBoot的日志级别为debug,否则不会输出feign的日志;因为springBoot日志级别默认为info,这里把ProviderServiceClient接口的日志级别设置为了debug,也可以设置指定目录的日志级别com.example.conuserservice01.client.ProviderServiceClient: debug
局部配置日志级别

在application.yml文件中配置日志级别

logging:level:# ProviderServiceClient接口的方法的日志级别为debug,其它接口的不会生效com.example.conuserservice01.client.ProviderServiceClient: debug

通过@FeignClient注解的configuration属性指定日志配置

@FeignClient(value = "providerservice", contextId = "providerservice",  configuration = FeignConfig.class)  //指定要调用的服务
public interface ProviderServiceClient {//要调用的服务中的请求,需要被调用的服务中的请求方法保持一致@GetMapping("/user/{userId}")public String getUserById(@PathVariable("userId") String userId);}

日志配置类

public class FeignConfig {@BeanLogger.Level feignLevel() {return Logger.Level.FULL;}}
全局配置日志级别

全局配置日志级别可以使用yml文件配置,也可以使用配置文件进行配置。
这里如果使用服务名称则是全局配置,如果使用contextId,则是针对指定的FeignClient接口的单独配置;

spring:cloud:openfeign:client:config:providerservice: # 如果FeignClient注解设置了contextId这里就使用contextId如,果没有设置contextId就使用服务名称loggerLevel: full

使用配置类

@Configuration
public class FeignConfig {@BeanLogger.Level feignLevel() {return Logger.Level.FULL;}}

负载均衡

Cloud 2020.0.X版本开始OpenFeign底层不再使用Ribbon了。所以在配置负载均衡的时候使用之前的方式是不行的。

这里使用的注册中心是Nacos,最后走的是NacosLoadBalancer。choose方法就是根据负载均衡算法选择一个服务实例进行访问。

我们在浏览器输入地址访问,然后调用远程接口访问,会执行到SynchronousMethodHandler的invoke方法。这里面executeAndDecode方法会选择服务实例,发起请求。continueOrPropagate方法则是请求出现问题后的重试。

在这里插入图片描述

在这里插入图片描述

选择服务实例并发送请求的执行流程如下:
在这里插入图片描述

这里会通过choose方法拿到服务实例,最后执行的是NacosLoadBalancer中的choose方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里就完成了获取服务实例的过程。

发送请求的代码在获取到服务实例的步骤后面。
在这里插入图片描述
然后会执行到LoadBalancerUtils的executeWithLoadBalancerLifecycleProcessing方法,通过feignRequest的url可以看到,这个时候已经将服务名转成了根据负载均衡算法选择到的服务实例的ip和端口号
在这里插入图片描述

在这里插入图片描述

最后可以看到是通过HttpURLConnection发送的请求。
在这里插入图片描述

请求压缩和响应压缩

OpenFeign⽀持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。可以在yml文件中配置请求压缩和响应压缩

spring:cloud:openfeign:compression:request:enabled: true #开启请求压缩min-request-size: 2048  #设置触发压缩的大小下限,此处也是默认值mime-types: text/html,application/xml,application/json #设置压缩的数据类型,此处也是默认值response:enabled: true #开启响应压缩

对熔断器的支持

性能优化

通过前面前面的分析可以看到OpenFeign底层使用的是HttpURLConnection发送的请求,但是它不支持连接池。因此主要是针对这一点进行优化。
在这里插入图片描述

OpenFeign使用Apache HttpClient客户端

加入htppClient和feign-httpclient的依赖,feign-httpclient的version要和openfeign-core的version保持一致。

        <!-- 使用Apache HttpClient替换Feign原生httpURLConnection --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId><version>12.1</version></dependency>

开启httpClient的支持,默认是开启的。

spring:cloud:openfeign:httpclient:enabled: true

注入Apache HttpClient

@Beanpublic ApacheHttpClient getApacheHttpClient() {return new ApacheHttpClient();}

到这里使用Apache HttpClient的配置就完成了。

使用Apache HttpClient的原理如下:
在这里插入图片描述

在这里插入图片描述

参考

  1. Spring Cloud OpenFeign
  2. Spring Cloud OpenFeign - - - > 日志级别配置
  3. SpringCloud OpenFeign 全功能配置详解
  4. Cloud 2020.0.X版本开始OpenFeign底层不再使用Ribbon
  5. 源码分析及实践测试OpenFeign负载均衡
  6. springcloud-Feign-HttpClient连接池(提升 Feign 的并发吞吐量)
  7. Nacos负载均衡策略
  8. 怎样配置Feign使用HttpClient

相关文章:

Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用 Feign和OpenFeign Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端&#xff0c;可以使用⽤它来发起请求&#xff0c;进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求&#xff0c;而不是像RestTemplate那样&#xff0c;在Java中通过封装HTTP请求…...

【非比较排序】计算排序算法

目录 CountSort计数排序 整体思想 图解分析 代码实现 时间复杂度&优缺分析 CountSort计数排序 计数排序是一种非比较排序&#xff0c;不需要像前面的排序一样去比较。 计数排序的特性总结&#xff1a; 1. 计数排序在数据范围集中时&#xff0c;效率很高&#xff0c;但…...

数据结构与算法 - 数组与二分查找 + Leetcode典型题

1. 什么是数组 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 C中二维数组在地址空间上也是连续的。 需注意&#xff1a; 数组的下标从0开始。数组内存空间的地址是连续的。数组的元素是不能删的&#xff0c…...

SQL进阶(三):Join 小技巧:提升数据的处理速度

复杂数据结构处理&#xff1a;Join 小技巧&#xff1a;提升数据的处理速度 本文是在原本sql闯关的基础上总结得来&#xff0c;加入了自己的理解以及疑问解答&#xff08;by GPT4&#xff09; 原活动链接 用到的数据&#xff1a;链接 提取码&#xff1a;l03e 目录 1. 课前小问…...

开发知识点-.netC#图形用户界面开发之WPF

C#图形用户界面开发 NuGet框架简介WinForms(Windows Forms):WPF(Windows Presentation Foundation):UWP(Universal Windows Platform):MAUI(Multi-platform App UI):选择控件参考文章随笔分类 - WPF入门基础教程系列...

基于springboot实现流浪动物救助网站系统项目【项目源码+论文说明】

基于springboot实现流浪动物救助网站系统演示 摘要 然而随着生活的加快&#xff0c;也使很多潜在的危险日益突显出来&#xff0c;比如在各种地方会发现很多无家可归的、伤痕累累的、可怜兮兮的动物&#xff0c;当碰到这种情况&#xff0c;是否会立马伸出双手去帮助、救助它们&…...

灰度负载均衡和普通负载均衡有什么区别

灰度负载均衡&#xff08;Gray Load Balancing&#xff09;与普通负载均衡的主要区别在于它们服务发布和流量管理的方式。 灰度负载均衡 目的&#xff1a;主要用于灰度发布&#xff0c;即逐步向用户发布新版本的服务&#xff0c;以减少新版本可能带来的风险。工作方式&#x…...

【二分查找】朴素二分查找

二分查找 题目描述 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9…...

Windows Docker 部署 Redis

部署 Redis 打开 Docker Desktop&#xff0c;切换到 Linux 内核。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 redis 服务。这里安装的是 7.2.4 版本&#xff0c;如果需要安装其他或者最新版本&#xff0c;可以到 Docker Hub 中进行查找。 docker run -d --nam…...

什么是VR虚拟现实|虚拟科技博物馆|VR设备购买

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机技术模拟出的一种全新的人机交互方式。它可以通过专门的设备&#xff08;如头戴式显示器&#xff09;将用户带入一个计算机生成的虚拟环境之中&#xff0c;使用户能够与这个虚拟环境进行交互…...

高性能API云原生网关 APISIX安装与配置指南

Apache APISIX是Apache软件基金会下的顶级项目&#xff0c;由API7.ai开发并捐赠。它是一个高性能的云原生API网关&#xff0c;具有动态、实时等特点。 APISIX网关可作为所有业务的流量入口&#xff0c;为用户提供了丰富的功能&#xff0c;包括动态路由、动态上游、动态证书、A…...

Gradio Dataframe 学习笔记

Gradio Dataframe 学习笔记 0. 简介1. 使用场景2. 测试数据3. 学习代码4. 更多功能5. 学习资源6. 总结 0. 简介 Gradio是一个用于构建交互式机器学习界面的Python库。它可以轻松创建各种类型的界面&#xff0c;包括用于数据可视化和探索的界面。 Gradio Dataframe 组件是 Gra…...

深入理解计算机系统笔记

1.1 嵌套的数组 当我们创建数组的数组时&#xff0c;数组分配和引用的一般原则也是成立的。 例如&#xff0c;声明 int A[5][3]; 等价于下面的声明 typedef int row3_t[3]; row3_t A[5] 要访问多维数组的元素&#xff0c;编译器会以数组起始为基地址&#xff0c; (可能需…...

300分钟吃透分布式缓存(拉钩教育总结)

开篇寄语 开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 你好&#xff0c;我是你的缓存老师陈波&#xff0c;可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚&#xff0c;经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…...

2024亚马逊全球开店注册前需要准备什么?

在2023年出海四小龙SHEIN、Temu、速卖通AliExpress、TikTok Shop快速增长扩张&#xff0c;成为了中国跨境卖家“逃离亚马逊”的新选择。但是&#xff0c;跨境电商看亚马逊。当前&#xff0c;亚马逊仍然是跨境电商行业的绝对老大&#xff0c;占有将近70%成以上的业务份额。 作为…...

android Service 与 activity 通信 并不断传数据

注&#xff1a;这只是个Demo 以下载为案例&#xff0c;实现开启下载&#xff0c;暂停下载&#xff0c;下载进度不断发送给activity class DownloadService : Service() {override fun onBind(intent: Intent?): IBinder? {return MyBinder()}inner class MyBinder : Binder…...

Acwing-基础算法课笔记之数学知识(扩展欧几里得算法)

Acwing-基础算法课笔记之数学知识&#xff08;扩展欧几里得算法&#xff09; 一、扩展欧几里得算法1、裴蜀定理2、过程模拟3、代码模板 二、线性同余方程1、定义2、模拟过程3、结论证明 一、扩展欧几里得算法 1、裴蜀定理 对于任意正整数 a a a&#xff0c; b b b&#xff0…...

简单排列组合题(python版)

文章预览&#xff1a; 题目解法一输出结果 解法二输出结果输出结果 题目 有四个数字:1,2,3,4能组成多少个互不相同且无重复的数字的三位数? 各式多少? 解法一 我们粗略看一下这个题既然我们要组成三位数&#xff0c;那我们就循环3层每一层出一个数&#xff0c;并且if语句判…...

【排坑】搭建 Karmada 环境

git clone 报错 问题&#xff1a;Failed to connect to github.com port 443:connection timed out 解决&#xff1a; git config --global --unset http.proxy【hack/local-up-karmada.sh】 1. karmada ca-certificates (no such package) 问题&#xff1a;fetching http…...

每日一类:Qt GUI开发的基石《QWidget》

深入探索QWidget&#xff1a;Qt GUI开发的基石 在Qt框架中&#xff0c;QWidget类扮演着构建图形用户界面&#xff08;GUI&#xff09;的基础角色。它不仅提供了窗口的基本功能&#xff0c;还允许开发者通过继承和定制来创建各式各样的用户界面元素。本文将详细介绍QWidget的关…...

不止于画图:深入解读GMT6光照参数(-I),让你的地形图更具立体感和专业范儿

不止于画图&#xff1a;深入解读GMT6光照参数(-I)&#xff0c;让你的地形图更具立体感和专业范儿 第一次用GMT绘制地形图时&#xff0c;那种从二维数据中召唤出山川起伏的成就感令人难忘。但当我把成果图发给导师审阅时&#xff0c;他指着阿尔卑斯山脉的阴影说&#xff1a;&quo…...

保姆级教程:用Python和Azure Kinect DK搭建你的第一个3D视觉采集站(附完整代码)

从零搭建3D视觉实验室&#xff1a;PythonAzure Kinect DK实战指南 当第一次将Azure Kinect DK从包装盒中取出时&#xff0c;那块神秘的黑色传感器面板总会让人联想到科幻电影中的场景。这款微软研发的深度感知设备&#xff0c;实际上已经成为现代计算机视觉实验室的标准配置—…...

如何使用宝塔面板配置高性能网站防火墙_启用WAF防御规则

宝塔面板的ngx_lua_waf需手动启用include luawaf.conf并重启Nginx才生效&#xff0c;拦截在access阶段毫秒级响应&#xff1b;须验证403返回及错误日志确认加载&#xff0c;调整init.lua参数防误杀&#xff0c;并配置real_ip支持CDN。宝塔面板自带的 ngx_lua_waf 是开箱即用的高…...

多模态模型体积暴增87%?SITS2026首席架构师亲授:4类跨模态冗余识别法+2种硬件感知剪枝策略

第一章&#xff1a;SITS2026专家&#xff1a;多模态模型压缩 2026奇点智能技术大会(https://ml-summit.org) 多模态压缩的核心挑战 传统单模态压缩方法&#xff08;如图像剪枝、语言模型量化&#xff09;难以直接迁移至多模态场景&#xff0c;因跨模态对齐损失、联合表征耦合…...

知识加工:从事实表达到可用知识体系

通过知识抽取和知识融合&#xff0c;系统已经能够从多源数据中识别并整理出大量事实表达。但这些事实表达还不等于真正可用的知识图谱。一个可用的知识图谱&#xff0c;不仅要有事实&#xff0c;还要有较稳定的概念结构、可用的推理能力和可靠的质量保障。为此&#xff0c;还需…...

容器编排管理

容器编排管理 1. 容器编排的概念与价值 容器编排是指自动化容器的部署、扩展、管理和网络配置的过程。随着容器技术的普及&#xff0c;容器编排已成为管理容器化应用的关键技术。通过采用容器编排&#xff0c;企业可以实现更高效的容器管理、更好的可扩展性和更高的可靠性。 1.…...

达摩院春联模型实战教程:接入钉钉机器人实现群内春联点播

达摩院春联模型实战教程&#xff1a;接入钉钉机器人实现群内春联点播 过年贴春联&#xff0c;是咱们中国人的传统习俗。但每年想一副有新意、有文采的春联可不容易。现在好了&#xff0c;有了AI技术&#xff0c;这事儿变得简单又有趣。 今天要给大家分享的&#xff0c;就是如…...

HTML标签不区分大小写吗_标签大小写规范建议【解答】

HTML标签名必须统一用小写&#xff0c;因HTML5规范强制要求、工具链默认适配、团队协作需要&#xff1b;大写标签虽浏览器可解析&#xff0c;但在XHTML/XML工具、编辑器校验、SSR框架、JSX及TypeScript中均会出错。HTML 标签在解析时确实不区分大小写&#xff0c;但实际开发中必…...

为什么你的多模态产品用户3秒弃用?SITS2026实验数据披露:87%失败源于跨模态时序对齐偏差,附实时校准代码模板

第一章&#xff1a;为什么你的多模态产品用户3秒弃用&#xff1f;SITS2026实验数据披露&#xff1a;87%失败源于跨模态时序对齐偏差&#xff0c;附实时校准代码模板 2026奇点智能技术大会(https://ml-summit.org) 用户在点击启动多模态交互后平均停留仅2.87秒——这一由SITS20…...

鸿蒙应用开发者激励计划2026常见问题FAQ

1、什么是鸿蒙应用开发者激励计划2026&#xff1f; 为了鼓励更多开发者拥抱鸿蒙生态&#xff0c;打造全场景时代的极致体验&#xff0c;我们正式推出“鸿蒙应用开发者激励计划 2026”。 共创鸿蒙生态繁荣未来。 2、本次激励计划持续到什么时间&#xff1f; 本次激励计划报名截…...