news 2026/4/16 2:07:26

SpringCloud-03-OpenFeign远程调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringCloud-03-OpenFeign远程调用

一、概述

OpenFeign能干什么?

前面在使用SpringCloud LoadBalancer+RestTemplate时,利用RestTemplate对http请求的封装处理形成了一套模版化的调用方法。

但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。

在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可。

OpenFeign同时还集成SpringCloud LoadBalancer,可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。

而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequstMapping等等。

OpenFeign的@FeignClient可用解析SPringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

二、简单入门

<!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
@SpringBootApplication @EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务 @EnableFeignClients//启用feign客户端,定义服务+绑定接口,以声明式的方法优雅而简单的实现服务调用 public class MainOpenFeign80{ public static void main(String[] args){ SpringApplication.run(MainOpenFeign80.class,args); } }

生产者的微服务:

@RestController public class PayController { @PostMapping("/pay/add") public String addPay(@RequestBody Pay pay){ return "新增一条支付信息成功"; } @GetMapping("/pay/get/{id}") public String getPayInfo(@PathVariable("id") Integer id){ return "按照主键记录查询支付流水信息"; } }

对应的微服务接口:

//openfeign天然支持负载均衡演示 @FeignClient(value = "cloud-payment-service") public interface PayFeignApi{ //新增一条支付相关流水记录 @PostMapping("/pay/add") public String addPay(@RequestBody Pay pay); //按照主键记录查询支付流水信息 @GetMapping("/pay/get/{id}") public String getPayInfo(@PathVariable("id") Integer id); }

消费者服务:

@RestController public class OrderController{ @Resource private PayFeignApi payFeignApi; @PostMapping(value = "/feign/pay/add") public String addPay(@RequestBody Pay pay){ String str = payFeignApi.addPay(pay); return str; } @GetMapping(value = "/feign/pay/get/{id}") public ResultData getPayInfo(@PathVariable("id") Integer id){ String str = payFeignApi.getPayInfo(id); return str; }

三、高级特性

1、超时控制

在Spring Cloud微服务架构中,大部分公司都是利用OpenFeign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常,因此定制化配置超时时间就有必要了。

#全局配置 spring: cloud: openfeign: client: config: default: #连接超时时间 connectTimeout: 3000 #读取超时时间 readTimeout: 3000 #单独对某个微服务进行设置 cloud-payment-service: #连接超时时间 connectTimeout: 20000 #读取超时时间 readTimeout: 20000

2、重试机制

//OpenFeign重试设置 @Configuration public class FeignConfig{ @Bean public Retryer myRetryer(){ //return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的 //最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s return new Retryer.Default(100,1,3); } }

3、默认HttpClient修改

OpenFeign中HttpClient如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,由于默认HttpURLConnection没有连接池、性能和效率比较低,如果采用默认,性能上不是最好的,所以加到最大。

<!-- httpclient5--> <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.3</version> </dependency> <!-- feign-hc5--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hc5</artifactId> <version>13.1</version> </dependency>
@Configuration public class FeignConfig{ @Bean public Retryer myRetryer(){ return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的 } }
openfeign: httpclient: hc5: enabled: true

4、请求/响应压缩

对请求和响应进行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 #最小触发压缩的大小
openfeign: compression: request: enabled: true min-request-size: 2048 #最小触发压缩的大小 mime-types: text/xml,application/xml,application/json #触发压缩数据类型 response: enabled: true

5、日志打印

Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节,说白了就是对Feign接口的调用情况进行监控和输出。

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

@Configuration public class FeignConfig{ @Bean public Retryer myRetryer(){ return Retryer.NEVER_RETRY; //默认 } //配置日志级别 @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
# feign日志以什么级别监控哪个接口 logging: level: com: atguigu: cloud: apis: PayFeignApi: debug
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 2:44:46

springboot图片视频综合新闻资讯管理系统vue

目录具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django)、…

作者头像 李华
网站建设 2026/4/16 11:13:46

ssm农产品果蔬销售商城vue 协同过滤算法 echart可视化

目录具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django)、…

作者头像 李华
网站建设 2026/4/16 2:44:33

电动汽车充电负荷的蒙特卡洛预测方法附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/4/16 10:59:06

用Conda还是Docker?PyTorch环境配置对比分析

用Conda还是Docker&#xff1f;PyTorch环境配置的实战抉择 在深度学习项目中&#xff0c;你有没有遇到过这样的场景&#xff1a;本地训练好的模型换一台机器就跑不起来&#xff1f;明明 pip install 全部成功了&#xff0c;却提示 CUDA 版本不兼容&#xff1b;或者同事说“我这…

作者头像 李华
网站建设 2026/4/16 11:01:22

记录一下:电子工业 · 2025 年度优秀作者

记录一下&#xff1a;电子工业 2025 年度优秀作者最近收到一份来自 电子工业出版社博文视点 的认可&#xff1a; 2025 年度优秀作者。这是一次值得记录的肯定&#xff0c;也是一种动力。 它说明这段时间的持续写作&#xff0c;并不是自说自话。但也仅此而已。 这绝不是骄傲的资…

作者头像 李华
网站建设 2026/4/16 11:07:02

Git submodule管理子模块:整合多个PyTorch项目

Git Submodule 与 PyTorch-CUDA 镜像协同&#xff1a;构建可复现的深度学习开发体系 在现代 AI 工程实践中&#xff0c;一个常见的挑战是——如何让多个团队并行开发模型组件的同时&#xff0c;又能快速、稳定地集成到统一训练流程中&#xff1f;更进一步&#xff0c;当新成员加…

作者头像 李华