SpringCloud之Feign
文章目录
- 前言
- 一、Feign的介绍
- 二、定义和使用Feign客户端
- 1、导入依赖
- 2、添加@EnableFeignClients注解
- 3、编写FeignClient接口
- 4、用Feign客户端代替RestTemplate
- 三、自定义Feign的配置
- 1、配置文件方式
- 全局生效
- 局部生效
- 2、java代码方式
- 四、Feign的性能优化
- 连接池配置
- 五、Feign的最佳实践
- 1、继承
- 2、抽取
- 3、实现第二种方式(抽取)
- 总结
前言
RestTemplate方式调用存在的问题
以前利用RestTemplate发起远程调用的代码:
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
存在下面的问题:
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
一、Feign的介绍
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

二、定义和使用Feign客户端
1、导入依赖
<!--Feign依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2、添加@EnableFeignClients注解

3、编写FeignClient接口
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/{id}
- 请求参数:Long id
- 返回值类型:User
4、用Feign客户端代替RestTemplate
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//2、利用Feign发起http请求,查询用户User user=userClient.findById(order.getUserId());//3.封装user到orderorder.setUser(user);// 4.返回return order;}
}

三、自定义Feign的配置
Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

一般我们需要配置的就是日志级别。
配置Feign日志有两种方式:
1、配置文件方式
全局生效
feign:client:config:default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置logger-level: FULL # 日志级别
局部生效
feign:client:config:userservice: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置logger-level: FULL # 日志级别
2、java代码方式
先声明一个Bean:
public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}
- 而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
- 如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
四、Feign的性能优化
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好用basic或none
连接池配置
Feign添加HttpClient的支持:
导入依赖
<!--httpClient的依赖 --><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
配置连接池:
feign:client:config:default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置logger-level: BASIC # 日志级别,BASIC就是基本的请求和响应信息 httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数

五、Feign的最佳实践
1、继承
给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
- 服务紧耦合
- 父接口参数列表中的映射不会被继承


2、抽取
将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用


3、实现第二种方式(抽取)
实现最佳实践方式二的步骤如下:
- 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
- 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
- 在order-service中引入feign-api的依赖
- 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
- 重启测试

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:指定FeignClient字节码
@EnableFeignClients(clients = {UserClient.class})

总结
以上就是SpringCloud之Feign的相关知识点,希望对你有所帮助。
相关文章:
SpringCloud之Feign
文章目录 前言一、Feign的介绍二、定义和使用Feign客户端1、导入依赖2、添加EnableFeignClients注解3、编写FeignClient接口4、用Feign客户端代替RestTemplate 三、自定义Feign的配置1、配置文件方式全局生效局部生效 2、java代码方式 四、Feign的性能优化连接池配置 五、Feign…...
股票池(三)
3-股票池 文章目录 3-股票池一. 查询股票池支持的类型二. 查询目前股票池对应的股票信息三 查询股票池内距离今天类型最少/最多的股票数据四. 查询股票的池统计信息 一. 查询股票池支持的类型 接口描述: 接口地址:/StockApi/stockPool/listPoolType 请求方式:GET…...
如何搭建测试环境?一文解决你所有疑惑!
什么是测试环境 测试环境,指为了完成软件测试工作所必需的计算机硬件、软件、网络设备、历史数据的总称,简而言之,测试环境硬件软件网络数据准备测试工具。 硬件:指测试必需的服务器、客户端、网络连接等辅助设备。 软件&#…...
【JVM】JVM异常不打印堆栈信息 [ -XX:-OmitStackTraceInFastThrow ]
文章目录 一、背景二、原因三、 代码验证 一、背景 生产环境日志突然膨胀到100G, 为了定位问题,所以截取了部分报错日志, 问题是 堆栈信息呢? 哪里报的NPE在哪??? 信息如下: [ERROR] 2020-12-09 09:41:50.053 - [taskAppIdTASK-1919-33805-97659]:[156] - wait task qu…...
第十一章 目标检测中的NMS
精度提升 众所周知,非极大值抑制NMS是目标检测常用的后处理算法,用于剔除冗余检测框,本文将对可以提升精度的各种NMS方法及其变体进行阶段性总结。 总体概要: 对NMS进行分类,大致可分为以下六种,这里是依…...
vue项目中使用vant轮播图组件(桌面端)
一. 内容简介 vue使用vant轮播图组件(桌面端) 二. 软件环境 2.1 Visual Studio Code 1.75.0 2.2 chrome浏览器 2.3 node v18.14.0 三.主要流程 3.1 安装环境 3.2 添加代码 3.3 结果展示 四.具体步骤 4.1 安装环境 先安装包 # Vue 3 项目,安装最新版 Va…...
如何做好性能压测 —— 压测环境设计和搭建!
简介:一般来说,保证执行性能压测的环境和生产环境高度一致是执行一次有效性能压测的首要原则。有时候,即便是压测环境和生产环境有很细微的差别,都有可能导致整个压测活动评测出来的结果不准确。 1. 性能环境要考虑的要素 1.1 系…...
手机弱网测试工具:Charles
我们在测试app的时候,需要测试弱网情况下的一些场景,那么使用Charles如何设置弱网呢,请看以下步骤: 前提条件: 手机和电脑要在同一局域网内 Charles连接手机抓包 一、打开Charles,点击代理,…...
Axios七大特性
Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js环境中发起HTTP请求。它有许多强大的特性,下面将介绍Axios的七大特性。 1. 支持浏览器和Node.js Axios既可以在浏览器中使用,也可以在Node.js环境中使用,提供了统一的AP…...
【机器学习基础】K-Means聚类算法
🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!相对完整的机器学习基础教学! ⭐特别提醒:针对机器学习,特别开始专栏:机器学习python实战…...
Vite - 配置 - 自动修改 index.html 中的title
需求描述 在Vue3项目的开发过程中,我们为了能区分正式环境和测试环境, 通常会进行环境配置文件的区分, 例如,开发环境一个配置文件、生产环境一个配置文件。因此,我们就希望 在项目的index.html 的 title 标签中&…...
基于安卓android微信小程序美容理发店预约系统app
项目介绍 为美容院设计一个系统以减少员工的工作量就成为了想法的初始状态。紧接着对美容院进行进一步的调查发现我的想法已然落后。基本上每个美容院都以有了自己的信息系统,并且做的已经较完善了。 在这时我突然想到,现在关注美容养生的人越来越多&am…...
*** stack smashing detected ***: terminated
有一个函数返回值是bool类型,但忘了return了,编译可以通过,但是运行的时候报这个错误。...
鸿蒙系统扫盲(二):再谈鸿蒙是不是安卓套壳?
最近小米发布了澎湃OS,vivo发布了蓝OS,好像自从华为回归后,大伙都开始写自己的OS了,小米官方承认是套壳安卓,然后被大家喷了,于是鸿蒙是不是安卓套壳的话题又回到了大众的视野,今天在讨论下这个…...
PG数据中DBeaver上传csv文件作为数据表
DBeaver 是一个开源的数据库工具,还是蛮好用的,有时候需要我们上传数据做表,数据为CSV格式的,DBeaver本身自带有功能实现的。 可打开连着的数据库,找到模式,点到下面的表里,选择一个表直接导入…...
第十七篇-Awesome ChatGPT Prompts-备份-百度翻译
Awesome ChatGPT Prompts——一个致力于提供挖掘ChatGPT能力的Prompt收集网站 https://prompts.chat/ 第十六篇-Awesome ChatGPT Prompts-备份【英文】 第十七篇-Awesome ChatGPT Prompts-备份-百度翻译 【中文】 高效提示词请参考,各种场景,2023-11-16内容如下(百…...
[Android] Amazon 的 android 音视频开发文档
https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3...
UE4基础篇十六:自定义 EQS 生成器
UE4 中的 EQS 带有一组很好的查询项生成器,但在某些情况下,您可能更喜欢根据需要创建生成器。我决定编写自己的生成器,因为我必须编写一个查询来找到查询器周围的最佳位置,但又不能太靠近它。我知道我可以添加一个距离测试来随着距离增加分数,但我什至不想考虑距查询器一定…...
轿车5+1汽车变速器变速箱同步器操纵机构机械结构设计CAD汽车工程
wx供重浩:创享日记 对话框发送:汽车变速器 获取完整论文报告说明书工程源文件 变速器工程图 操纵机构3D图 一、机械式变速器的概述及其方案的确定 1.1 变速器的功用和要求 变速器的功用是根据汽车在不同的行驶条件下提出的要求,改变发动机…...
STM32F4移植SPI注意事项
一、注意事项 可以看我之前移植的文章,那些就不提了,记得要复用,把IO复用成对应的功能io,然后还要注意时钟,看你需要的功能,去调对应的时钟,把时钟调匹配了,基本上不会有问题。 比如…...
复盘红日Vulnstack1:除了MSF和CS,我们还能用哪些“冷门”工具链完成内网横向?
红日Vulnstack1靶场实战:突破常规工具链的内网横向技术探索 当主流渗透工具遭遇严格监控时,如何构建替代性攻击链?红日安全团队的Vulnstack1靶场作为国内知名的内网渗透训练环境,常被用作测试Metasploit(MSF࿰…...
从商场换灯到建桥选址:5个真实案例带你吃透工程经济学决策方法
从商场换灯到建桥选址:5个真实案例带你吃透工程经济学决策方法 在商业决策中,每分钱都需要精打细算。想象一下,你是一家商场的运营经理,面对200盏需要更换的灯具,是选择价格便宜但耗电量高的传统节能灯,还是…...
Codex CLI与MCP协议集成:打造无缝AI编程工作流
1. 项目概述:当Codex CLI遇上MCP协议如果你和我一样,是个重度AI编程工具使用者,那你肯定对OpenAI的Codex CLI不陌生。这个命令行工具,特别是它最新的GPT-5.4模型,在代码生成和项目理解上的能力,已经让很多开…...
基于SVR与特征选择的系外行星半径预测:数据清洗、模型构建与天文解读
1. 项目概述:从数据到洞察,预测遥远世界的尺寸在系外行星研究的浩瀚星海中,我们获取的数据往往是间接且充满噪声的。当一颗行星从它的母恒星前方经过,我们称之为“凌星”,望远镜会记录下恒星亮度的微小下降。从这些“光…...
CANN/cann-recipes-infer:NPU DeepSeek-V4 TileLang算子开发实践
NPU DeepSeek-V4 TileLang算子开发实践 【免费下载链接】cann-recipes-infer 本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-infer 简介 在大模型异构计算发展背景…...
CANNBot技能:模型推理预取优化
【免费下载链接】cannbot-skills CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。 项目地址: https://gitcode.com/cann/cannbot-skills name: model-infer-prefetch description: 基于 PyTorch 框架的昇腾 N…...
Dify与Langfuse集成:构建可观测AI应用的全链路实践
1. 项目概述:当Dify遇上Langfuse,如何构建可观测的AI应用 如果你正在用Dify搭建AI应用,那你一定遇到过这样的场景:用户反馈说“昨天那个回答挺好的,今天怎么不行了?”;或者产品经理问你“我们调…...
Python 爬虫反爬突破:行为轨迹模拟绕过风控检测
前言 随着网络反爬技术持续迭代,传统基于请求头伪造、IP 代理轮换、验证码破解的基础爬虫方案已无法应对高阶站点风控体系。主流平台不再仅校验请求参数、IP 地址与验证码,而是引入用户行为风控模型,通过采集浏览器操作轨迹、鼠标移动路径、…...
Windows 11安装完全指南:使用MediaCreationTool.bat轻松绕过硬件限制
Windows 11安装完全指南:使用MediaCreationTool.bat轻松绕过硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool…...
Postman面试问题
Postman在工作中使用流程是什么样的? Postman是一款功能强大的接口测试工具 ,它可以帮助开发者和测试者快速地构建、发送、调试和管理各种类型的接口请求。Postman在工作中使用流程大致如下: 根据接口用例所属的模块或功能,新建集…...
