news 2026/1/13 13:42:36

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/1/4 14:58:23

SpringCloud-04-Circuit Breaker断路器

一、概述1、分布式系统面临的问题&#xff1f;&#xff1f;复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免地失败。服务雪崩&#xff1a;多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服…

作者头像 李华
网站建设 2026/1/1 18:15:56

springboot校园快递存取件系统vue

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

作者头像 李华
网站建设 2026/1/1 8:14:41

Conda环境迁移困难?改用PyTorch Docker镜像一劳永逸

Conda环境迁移困难&#xff1f;改用PyTorch Docker镜像一劳永逸 在深度学习项目开发中&#xff0c;你是否经历过这样的场景&#xff1a;同事刚提交的代码在自己机器上跑不通&#xff0c;报错信息五花八门——CUDA版本不匹配、cuDNN缺失、torchvision版本冲突……一番折腾后发现…

作者头像 李华
网站建设 2026/1/4 12:43:36

Git Commit规范助力AI开发:结合PyTorch项目的版本管理技巧

Git Commit规范助力AI开发&#xff1a;结合PyTorch项目的版本管理技巧 在深度学习项目中&#xff0c;我们常常遇到这样的场景&#xff1a;某次实验准确率突然提升了3%&#xff0c;但翻遍训练日志和代码变更记录&#xff0c;却无法确定是哪个改动带来的效果。团队成员提交的 git…

作者头像 李华
网站建设 2026/1/8 18:56:40

Conda环境导入导出:跨平台迁移PyTorch项目

Conda环境导入导出&#xff1a;跨平台迁移PyTorch项目 在深度学习项目的日常开发中&#xff0c;你是否遇到过这样的场景&#xff1a;本地训练一切正常&#xff0c;模型跑得飞快&#xff0c;信心满满地把代码推到服务器上准备大规模训练&#xff0c;结果一运行就报错——torch.…

作者头像 李华
网站建设 2026/1/1 17:12:47

如何在云服务器上部署PyTorch-CUDA环境?详细图文教程

如何在云服务器上部署 PyTorch-CUDA 环境&#xff1f;—— 从零到训练的实战指南 在深度学习项目中&#xff0c;最让人头疼的往往不是模型设计本身&#xff0c;而是环境搭建&#xff1a;CUDA 驱动装不上、PyTorch 版本不兼容、cuDNN 缺失……这些“环境陷阱”常常让开发者耗费…

作者头像 李华