news 2026/4/23 12:19:12

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/18 19:48:10

基于灵动MM32F0140国产32位单片机的Mini-LED应用

在显示技术飞速发展的今天&#xff0c;Mini-LED以其卓越的视觉表现&#xff0c;正逐渐成为高端显示市场的核心技术。与传统LED相比&#xff0c;Mini-LED具备更精细的调光能力、更高的亮度与对比度、更真实的HDR效果以及更广的色彩范围。要实现这些优势&#xff0c;离不开一颗高…

作者头像 李华
网站建设 2026/4/23 8:58:33

Java HashMap 多线程环境下的死链问题详解

HashMap在多线程环境下使用时存在死链问题。让我详细解释一下这个问题的原因以及如何规避&#xff1a; 问题原因分析 在JDK 7及之前版本的HashMap中&#xff0c;resize时采用的是头插法重新排列链表&#xff0c;这会导致链表顺序反转&#xff1a; // JDK 7的resize代码片段 voi…

作者头像 李华
网站建设 2026/4/21 0:50:01

论文写作终极救星:9款免费AI工具一键极速生成,覆盖全场景!

还在为论文选题、结构、写作和降重而彻夜难眠吗&#xff1f;告别焦虑与低效&#xff0c;这篇指南就是你的终极解决方案。我们深度测评了市面上数十款AI工具&#xff0c;为你精选出9款真正能打的免费神器&#xff0c;覆盖从文献检索到终稿润色的全流程。阅读本文&#xff0c;你将…

作者头像 李华
网站建设 2026/4/23 6:38:38

钻井井喷关井期间井筒压力变化特征

钻井井喷关井期间井筒压力变化特征 该论文针对钻井井喷关井期间井筒压力计算值与实际值差异大的问题,将关井过程分为两个阶段:初期地层流体继续侵入的续流阶段和气液密度差导致气体滑脱上升阶段。建立了考虑井筒弹性、流体压缩性的续流模型和气液两相流滑脱模型,综合得到井…

作者头像 李华
网站建设 2026/4/23 6:38:13

YOLOv5模型剪枝压缩:基于PyTorch实现FPGM算法

YOLOv5模型剪枝压缩&#xff1a;基于PyTorch实现FPGM算法 在边缘计算设备日益普及的今天&#xff0c;如何将高性能目标检测模型高效部署到资源受限的硬件上&#xff0c;已成为工业界和学术界共同关注的核心问题。以YOLOv5为代表的实时检测模型虽然精度高、推理快&#xff0c;但…

作者头像 李华
网站建设 2026/4/23 6:39:35

PyTorch分布式训练Horovod集成:跨节点扩展方案

PyTorch分布式训练Horovod集成&#xff1a;跨节点扩展方案 在深度学习模型参数动辄上百亿的今天&#xff0c;单卡训练已经远远无法满足研发效率的需求。一个典型的ResNet-50模型在ImageNet上训练一次可能需要数天时间&#xff0c;而像BERT、ViT这样的大模型更是动辄周级别的训练…

作者头像 李华