SpringCloud 声明式服务调用 —— Feign 全面解析(入门 + 原理 + 优化)

SpringCloud之OpenFeign入门与实战系列 本文主要介绍OpenFeign的超时重试机制,以及如何自定义超时重试机制。 阅读详情

一、什么是 Feign?

Feign​ 是 Spring Cloud 提供的一种 声明式 HTTP 客户端,主要特点如下:

  • ✅ 工作在 Consumer(消费方)

  • ✅ 通过 接口 + 注解​ 的方式定义服务调用

  • ✅ 支持 Spring MVC 注解(@RequestMapping、@GetMapping等)

  • ✅ 内置 Ribbon,天然支持客户端负载均衡

👉 一句话总结:

Feign = RestTemplate + Ribbon + 接口代理


二、Feign 快速入门案例

1️⃣ 服务提供方(feign-provider)

  • 提供 REST 接口

  • 注册到注册中心(如 Eureka / Nacos)

示例接口:

@RestController
@RequestMapping("/provider")
public class UserController {

    @GetMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id) {
        return new User(id, "张三");
    }
}

2️⃣ Feign 接口模块(feign-interface)

pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Feign 接口定义
@FeignClient("feign-provider")
@RequestMapping("/provider")
public interface UserFeign {

    @GetMapping("/getUserById/{id}")
    User getUserById(@PathVariable("id") Integer id);
}

✅ 要点说明:

  • @FeignClient("feign-provider"):指定调用的服务名

  • 接口方法写法 ≈ Controller 接口写法


3️⃣ 服务消费方(feign-consumer)

pom.xml
<dependency>
    <groupId>com.hg</groupId>
    <artifactId>feign-interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
Controller 调用
@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    private UserFeign userFeign;

    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable Integer id) {
        return userFeign.getUserById(id);
    }
}
启动类
@SpringBootApplication
@EnableFeignClients
public class FeignConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerApp.class, args);
    }
}

三、Feign 工作原理(核心)

1️⃣ 扫描并注册 Feign Client

  • @EnableFeignClients开启 Feign 支持

  • FeignClientsRegistrar.registerFeignClients()

    👉 扫描 @FeignClient标识的接口

  • 为每个接口生成 JDK 动态代理对象

  • 代理对象交由 Spring 容器管理


2️⃣ 方法调用时创建 RequestTemplate

  • Consumer 调用 Feign 接口方法

  • 代理类调用 SynchronousMethodHandler.invoke()

  • 根据方法注解生成 RequestTemplate

  • 最终交给 Http Client 执行请求

📌 整体流程:

Controller
 ↓
Feign 接口(代理)
 ↓
RequestTemplate
 ↓
Ribbon 负载均衡
 ↓
HTTP 请求

四、Feign 常见传参方式

传参方式

注解

示例

?参数

@RequestParam

/user?id=1

Restful

@PathVariable

/user/1

JSON

@RequestBody

{ "id":1 }

示例:

@GetMapping("/getUser")
User getUser(@RequestParam("id") Integer id);

@PostMapping("/saveUser")
String saveUser(@RequestBody User user);

五、Feign 性能优化(重点)

✅ 1️⃣ 开启 Feign 日志

feign:
  client:
    config:
      feign-provider:
        loggerLevel: full

logging:
  level:
    com.hg.feign: debug

📌 日志级别:

  • NONE(默认)

  • BASIC

  • HEADERS

  • FULL


✅ 2️⃣ 使用 HTTP 连接池(推荐)

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

✅ 避免频繁创建连接,提高性能


✅ 3️⃣ 开启 GZIP 压缩

server:
  compression:
    enabled: true

feign:
  compression:
    request:
      enabled: true
    response:
      enabled: true

✅ 4️⃣ 超时配置(非常重要)

方式一:Ribbon
ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000
方式二:Feign
feign:
  client:
    config:
      feign-provider:
        connectTimeout: 5000
        readTimeout: 5000

✅ 5️⃣ 自定义负载均衡策略

@Configuration
public class IRuleConfig {

    @Bean
    public IRule iRule() {
        return new WeightedResponseTimeRule(); // 权重
    }
}

六、总结

✅ Feign 是 声明式、简化微服务调用的神器​

✅ 底层集成 Ribbon,支持负载均衡

✅ 通过接口 + 注解即可完成服务调用

✅ 实际项目中建议开启 日志、连接池、压缩、超时配置


📌 适合人群:Spring Cloud 初学者 / 微服务入门

📌 推荐搭配:Eureka + Feign + Ribbon

如果你愿意,我也可以帮你再补一篇:

👉《Feign vs RestTemplate 实战对比》或《Feign 源码深度解析》

springcloud篇2-feign、gateway 说明:(1)日志级别NONE-没有日志BASIC-记录请求的开始和结束时间HEADERS-记录请求的开始和结束时、请求头和响应头FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体但该方式不推荐,会导致紧耦合。之前的微服务允许任何的访问,不安全,需要添加一个网关(功能包括身份认证和权限校验、服务路由、负载均衡、请求限流)。 阅读详情

相关推荐

SpringCloud之Feign:SpringCloud微服务间的优雅调用利器!

Feign( pronounced as \fein\)是一个声明式的、模板化的HTTP客户端,它使得编写Web服务客户端变得更加容易。Feign是由Netflix开源的,旨在简化微服务之间的HTTP请求调用。在Spring Cloud中,Feign被广泛使用作为服务间调用的主要方式之一。Feign的核心思想是使用注解来定义客户端的HTTP请求,从而使得开发者能够像调用本地方法一样调用远程服务。它消除了编写冗长的HTTP客户端代码的需求,使得服务间的通信变得更加简洁和直观。声明式注解。

邓邓子的博客 2573

SpringCloud-feign详解

springcloud-feign学习

落雪 1万+

从一行接口到一次远程调用:Feign声明式代理、Ribbon负载均衡与LoadBalancer演进的源码推演

本文沿一次远程调用的生命周期,剖析Feign声明式客户端与Ribbon负载均衡的原理与演进。启动期梳理注解扫描、工厂Bean与命名子容器,调用期拆解契约解析、方法处理器与八大组件,并用两百行迷你Feign复现骨架;详解注解属性、配置优先级、三层超时与重试放大;深入负载均衡器内部、名单刷新、实例熔断黑名单、区域感知选择与七种策略,用离散事件仿真量化慢实例与宕机场景;最后讲清向LoadBalancer和HTTP Service Clients的迁移路径,并给出连接、超时、重试与均衡四类治理清单。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 168万+

Springcloud快速入门--多服务交互rpc(远程接口调用)--Spring Cloud OpenFeign

类型作用说明修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象请求参数编码将请求参数编码,便于通过http请求发送支持的注解格式默认是SpringMVC的注解失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。下面以日志为例来演示如何自定义配置。

qq_55272229的博客 3497

SpringCloud微服务框架的原理及应用详解(二)

​ Spring Cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务。它提供了一系列框架和组件,如服务发现、配置管理、熔断器、智能路由等,用于简化分布式系统的开发。Spring Cloud通过提供一系列开箱即用的组件和工具,帮助开发者快速构建和部署微服务架构的系统。 本文将跟随《SpringCloud微服务框架的原理及应用详解(一)》的进度,继续介绍Spring Cloud框架。希望通过本系列文章的学习,您将能够更好地理解Spring Clo

凛鼕将至的博客 1606

SpringCloud之OpenFeign:OpenFeign与Feign谁更适合你的SpringCloud项目?

OpenFeign是一种声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。在Spring Cloud微服务架构中,服务之间的通信是非常关键的,而OpenFeign正是为了简化这种服务间通信而设计的。OpenFeign以其简洁的接口定义和自动化的服务调用机制,成为了Spring Cloud微服务架构中服务间通信的重要组件。它不仅简化了服务调用的代码编写,还提供了良好的错误处理和性能优化机制,使得微服务之间的协作更加高效和稳定。

邓邓子的博客 2054

springcloud 之 Feign

springcloud服务之间的调用采用基于http协议的rest风格。 既然springcloud是一个微服务架构生态体系,而且上一章我们也介绍了 微服务体系中一个核心组件“服务的发现与注册”eureka,接下来我们来简单探索以下微服务体系中另一个核心组件“远程调用”;在springcloud体系中实现rpc的组件有2个,一个是ribbon,另一个是feign,而且feign在底层封装了ribbon,以更友好,更灵活的形式展现在了我们眼前,所以今天我们研究的重心放在了feign身上。 (摘抄一段话,帮助大

m0_67401153的博客 9193

【C++】 详解 lower_bound 和 upper_bound 函数(看不懂来捶我!!!)

这两个函数是我在 LeetCode 上做题见到,看到不熟悉的函数 lower_bound 和 upper_bound让我感觉很难受,于是在C++ 官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。最终通过查阅资料将其总结如下。

weixin_45031801的博客 9万+

SpringCloud的声明式服务调用 Feign 全面解析

*** 动态请求头*//*** 多个请求头*/Feign 作为声明式的 HTTP 客户端,极大地简化了微服务之间的调用。通过本指南,你应该能够:✅ 理解 Feign 的核心概念和工作原理✅ 掌握各种传参方式的正确使用✅ 配置自定义的 Feign 客户端✅ 实现服务降级和异常处理✅ 优化 Feign 的性能和稳定性✅ 解决常见的 Feign 使用问题Feign = 接口声明 + 注解,让服务调用变得像调用本地方法一样简单!

StackNoOverflow的博客 424

信息化建设项目前期方案编制4:如何画好四张图

这里探讨以下具体的总体设计操作层面的工作。总体设计主要是完成四张图,总体架构(逻辑架构)、应用架构、网络拓扑、系统部署图。对于一些单一的系统,往往总体架构和应用架构可以合一。网络拓扑画好了,系统部署图也可以省略。有些项目还会在这之外,有所谓的技术架构图。对应用系统、数据存储等各个部分各自用的主要技术、服务等,给出总体设计图。但通常来说,这四张图在一个中等规模(200~500万,软件...

Leonardo的博客 4635

SDK报错(1)undefined reference to `f_mount‘

按文中说法是ff.c文件中用了一个if语句来判断是否启用ff.h头文件,但是却没有地方进行宏定义来满足这个if条件。利用SDK读取sd卡时,添加了xilffs库,而且包含了ff.h头文件,还是对fat库的函数报错。网上有的说在ARM v7 gcc linker中添加xilffs的方法可以解决,但我试了没有用。如下图,我们可以在ff.c中自己添加一个宏定义来实现这个条件。最后在赛灵思论坛找到了一个解决方法,原文连接如下。这时候保存编译之后,报错就消失了。ff.c 文件在bsp工程下。

EfunStudy的博客 1481

滚雪球学SpringCloud[3.1讲]:Feign:声明式服务调用详解

在上一篇文章中,我们深入探讨了Ribbon作为SpringCloud中的负载均衡工具。我们了解了Ribbon的工作原理、负载均衡策略以及如何与Eureka集成来实现微服务之间的高效通信。通过实例案例,我们掌握了在实际项目中使用Ribbon来优化服务调用的技巧。然而,尽管Ribbon在负载均衡方面表现出色,但在实现服务间调用时,仍需要编写大量的模板代码,尤其是在处理RESTful API调用时。为了进一步简化这一过程,SpringCloud提供了Feign。

**My Coding Family** 1008

ArcGIS Pro 拓扑编辑实战:从‘地图拓扑’到‘共享编辑’,手把手教你批量修改要素

本文详细介绍了ArcGIS Pro中的拓扑编辑功能,从地图拓扑配置到共享编辑技巧,手把手教你如何批量修改要素。通过实战案例展示拓扑编辑在城市规划、地籍管理等场景中的应用,显著提升编辑效率并减少拓扑错误,是现代GIS技术的重要生产力工具。

weixin_30500473的博客 505

SpringCloud之Feign声明式调用原理及配置

1 什么是Feign   Feign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求。  Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。Feign的...

weixin_38166560的博客 863

整理 钢琴 铃木钢琴教程(铃木)

铃木钢琴 超清PDF

TS的博客 1212

软考高级信息系统项目管理师系列论文之:百篇软考高级信息系统项目管理师论文范文

软考高级信息系统项目管理师系列论文之:百篇软考高级信息系统项目管理师论文范文

zhengzaifeidelushang的博客 3579

SpringCloud Feign

SpringCloud Feign 一、声明式服务调用 1.1、 什么是Feign Feign是一种声明式、模板化的HTTP客户端(仅在consumer中使用)。 1.2、什么是声明式 声明式调用就像调用本地方法一样调用远程方法;无感知远程http请求。 Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务 时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更...

330553352的专栏 379

Linux Kernel入门到精通系列讲解 - 总目录

在学习Linux Kernel之前,需要先准备开发环境,方便后续进行开发。可以根据自身情况,选择性阅读该章节。学习该章节之前,你应该了解一下网络概念,明白为什么要讲这些,才能更有方向的去理解学习。Linux ARM平台开发系列讲解(设备树篇) 4.1.1 设备树的原理详解。本项目完全开源,仅供学习使用,如需其他用途,请与本人联系。),本章节你可以学习到。摄像头V4L2子系统、Linux kernel常用的子系统等,ARM架构、RISCV架构、Uboot等。

DSMGUOGUO的博客 1万+

SpringCloud微服务框架的原理及应用详解(一)

Spring Cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务。它提供了一系列框架和组件,如服务发现、配置管理、熔断器、智能路由等,用于简化分布式系统的开发。Spring Cloud通过提供一系列开箱即用的组件和工具,帮助开发者快速构建和部署微服务架构的系统。

凛鼕将至的博客 1947

RK3588开发笔记-ES8311音频芯片调试记录

本篇博客主要记录如何在RK3588平台试ES8311音频芯片的过程。这包括硬件连接、内核配置、驱动程序调试和测试步骤。通过以上步骤,我们成功在RK3588平台上调试了ES8311音频芯片。这包括硬件连接、内核配置、设备树配置、驱动加载以及音频测试。希望这篇调试记录能为其他开发者提供一些帮助。如果你有任何问题或建议,欢迎留言讨上调论。

flypig has a dream! 3161

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

微服务服务间调用组件Feign使用介绍、原理、优化技巧

Feign是一个声明式的Web Service客户端。它让微服务之间的调用变得更简单。Feign具有可插拔式的注解支持,包括Feign 注解和JAX-RS注解。Feign还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注解的支持,并且也支持Spring WebFlux。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。Feign的基本概念、原理与使用。Feign采用声明式的接口,自动拼接URL、添加参数等工作,简化HTTP客户端的开发。

青山师 2163

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Cloud Feign详解:优化你的微服务调用

Feign 是一个声明式的 Web Service 客户端。它的出现使开发 Web Service 客户端变得很简单。使用 Feign 只需要创建一个接口加上对应的注解,比如:@FeignClient 注解。Feign 有可插拔的注解,包括 Feign 注解和 AX-RS 注解。Feign 也支持编码器和解码器,Spring Cloud Open Feign 对 Feign 进行增强支持 Spring Mvc 注解,可以像 Spring Web 一样使用 HttpMessageConverters 等。

m0_74022498的博客 1600

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SpringCloud负载均衡实战:从LoadBalancer拦截器到Feign声明式调用

本文深入探讨了SpringCloud负载均衡的实战应用,从LoadBalancer拦截器的工作原理到Feign声明式调用的优化策略。通过详细解析负载均衡策略切换机制和性能调优参数,帮助开发者解决实际生产中的常见问题,提升微服务调用的效率和稳定性。

weixin_30564785的博客 271

SpringCloud基础入门

SpringCloud

weixin_43185598的博客 184

SpringCloud-Feign声明式服务消费者

前言       前面一节课我们一起学习了搭建Eureka+Ribbon+Hystrix的框架,可以实现服务消费者对服务提供者的动态调用,异常熔断等逻辑,但是从整体代码角度考虑还是不够优雅,服务消费者通过restTemplate来完成对服务提供者的调用,导致每个服务消费者都需要额外对restTemplate进行维护,增加了服务消费者的代码...

xxxlllbbb的博客 329

【手把手教你搭建SpringCloud 05】集成OpenFeign声明式调用

本文介绍了Spring Cloud OpenFeign在微服务架构中的集成与应用。作为声明式HTTP客户端,OpenFeign通过注解方式简化了服务间调用,相比RestTemplate具有代码简洁、自动负载均衡等优势。文章详细解析了@FeignClient注解的核心属性,包括服务名称、URL配置、降级处理等,并通过电商系统案例展示了项目结构设计和统一响应封装。环境配置部分提供了Spring Boot 3.2.5、Spring Cloud 2023.0.1等关键组件的版本信息及Maven依赖配置。通过动态代理

专注后端技术架构,AI技术分享 1009
上一篇: SpringCloud的声明式服务调用 Feign 全面解析
下一篇: Sentinel服务保护框架完全指南:从原理到实践
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值