Spring Cloud OpenFeign 提供了一种声明式、模板化的HTTP客户端,可以通过简单的接口描述远程调用,而不必手动编写低级的 HTTP 客户端代码。FeignClient用法参考:FeignClient用法-笔记-CSDN博客。这里梳理Spring Cloud OpenFeign 常用注解。

1. @FeignClient

功能:声明一个Feign客户端,用于访问远程服务。
适用场景:定义需要调用的其他微服务的接口。
注意事项

  • name 或 value 属性指定服务名(在服务注册中心注册的名称)。
  • 可以配置URL直接指定地址(用于测试或非注册中心场景)。
  • 支持配置降级处理(通过fallbackfallbackFactory)。

示例

@FeignClient(name = "user-service", url = "http://localhost:8080", fallback = UserClientFallback.class)
public interface UserClient {@GetMapping("/users/{id}")User getUserById(@PathVariable("id") Long id);
}// 降级实现
@Component
public class UserClientFallback implements UserClient {@Overridepublic User getUserById(Long id) {return new User(0L, "默认用户");}
}

2. @RequestMapping 及变种

 @RequestMapping 及变种 (@GetMapping@PostMapping 等):

功能:指定Feign客户端方法对应的HTTP方法和路径。
适用场景:定义远程调用的具体端点。
注意事项

  • 与Spring MVC中的用法一致,但用于Feign客户端接口。
  • 路径中可以使用占位符(配合@PathVariable使用)。

示例

@FeignClient(name = "order-service")
public interface OrderClient {@PostMapping("/orders")Order createOrder(@RequestBody Order order);@GetMapping("/orders/{orderId}")Order getOrder(@PathVariable("orderId") String orderId);
}

3. @PathVariable

功能:将方法参数绑定到URI模板变量。
适用场景:当URL路径中包含动态变量时(如RESTful风格)。
注意事项

  • 必须指定valuename属性来匹配URI模板中的变量名(与 MVC 不同,在Feign中必须显式指定,不能省略)。
  • 不支持 Spring MVC 的 @PathVariable(required = false)
  • 路径变量不能为空

示例

@FeignClient(name = "product-service")
public interface ProductClient {@GetMapping("/products/{productId}")Product getProduct(@PathVariable("productId") Long id); // 注意:这里必须指定"productId"
}

4. @RequestHeader

功能:将方法参数绑定到HTTP请求头。
适用场景:需要传递自定义HTTP头信息(如认证token)。

  • 传递认证令牌(Authorization)
  • 设置内容协商头(Accept)
  • 自定义业务标识头

注意事项

  • 可以传递单个值,也可以传递Map来设置多个请求头。
  • 支持占位符表达式
  • 不会被 Spring MVC 的 @RequestHeader 解析
  • 如果请求头的值是动态的,必须用@RequestHeader注解。

示例

@FeignClient(name = "auth-service")
public interface AuthClient {@GetMapping("/userinfo")UserInfo getUserInfo(@RequestHeader("Authorization") String token);// 传递多个请求头@PostMapping("/update")void update(@RequestHeader Map<String, String> headers, @RequestBody UserInfo userInfo);
}

5. @RequestParam

功能:将方法参数绑定到HTTP请求参数(URL查询参数)。
适用场景

  • 传递单个或少量查询参数。
  • 非结构化参数传递
  • 数组/集合类型参数

注意事项

  • 数组参数格式:?ids=1,2,3 或 ?ids=1&ids=2
  • 如果参数是可选,需要设置required=false(默认是true)。
  • 当参数较多时,建议使用@SpringQueryMap代替。

示例

@FeignClient(name = "search-service")
public interface SearchClient {@GetMapping("/search")List<Product> searchProducts(@RequestParam("kw") String keyword, @RequestParam(value = "page", required = false, defaultValue = "0") int page);// 数组参数@DeleteMapping("/items")void deleteItems(@RequestParam("ids") List<Long> ids);
}

6. @SpringQueryMap 

功能:将POJO对象转换为URL查询参数。当我们需要将一个对象作为查询参数传递给另一个服务时,使用这个注解可以避免手动拼接URL查询字符串。
适用场景

  • 在Feign客户端中,需要传递多个查询参数,而这些参数被封装在一个对象中。
  • 传递复杂或多条件的查询参数(避免在方法中写多个@RequestParam)。

注意事项

  • 支持嵌套对象的转换(通过点号.连接属性,如user.address.city)。
  • 只能用于Feign客户端。
  • 适用于GET请求,因为GET请求通常使用查询参数传递数据。
  • GET 请求参数长度限制(约 2048 字符)

示例

@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/users/search")List<User> searchUsers(@SpringQueryMap UserSearchCriteria criteria);
}// 查询条件POJO
public class UserSearchCriteria {private String name;private Integer age;private Address address; // 嵌套对象// getters and setters
}public class Address {private String city;private String street;// getters and setters
}//当我们调用userClient.searchUsers(new UserQuery("张三", 25,new Address("beijing","xierqi")))时,
//Feign会生成一个URL:/users?name=张三&age=25&address.city=beijing&address.street=xierqi。

补充说明:

在Spring MVC中,如果我们想在Controller的方法中接收多个查询参数,可以直接使用一个POJO对象作为参数,而不需要任何注解,Spring MVC会自动将查询参数绑定到对象中(但要求该对象有默认构造函数,并且属性名与查询参数名匹配)。例如:

@Controller
public class UserController {@GetMapping("/users/search")List<User> searchUsers(UserSearchCriteria criteria){//......}
}

但是,在Feign客户端中,我们不能直接这样做,因为Feign默认不会将对象转换为查询参数,所以需要使用@SpringQueryMap注解。

总结:

注解功能适用场景注意事项
@FeignClient声明Feign客户端定义远程服务调用接口配置服务名、URL、降级等
@RequestMapping指定HTTP方法和路径定义远程调用的端点支持各种HTTP方法注解变体
@PathVariable绑定路径变量RESTful风格的URL路径参数必须显式指定变量名
@RequestHeader绑定请求头传递自定义头信息(如认证token)可传递单个头或多个头(Map)
@RequestParam绑定查询参数传递少量查询条件可选参数需设置required=false
@SpringQueryMapPOJO转查询参数传递复杂或多条件查询支持嵌套对象,只能用于Feign

使用这些注解,可以方便地定义Feign客户端,实现微服务之间的优雅调用。常见用法总结:

  1. 服务间调用:首选 @FeignClient + Spring Cloud 服务发现
  2. GET 参数
    • 简单参数 → @RequestParam
    • 复杂参数 → @SpringQueryMap
  3. 路径参数:必须显式命名 @PathVariable("id")
  4. 请求头:动态头用 @RequestHeader
  5. 特殊格式
    • 表单 → 自定义 Encoder
    • 文件 → @RequestPart(需额外配置)
  6. 错误处理
    • 熔断降级 → fallback/fallbackFactory
    • 错误解码 → 实现 ErrorDecoder

一个完整示例:

// 完整示例
@FeignClient(name = "user-service",fallbackFactory = UserClientFallbackFactory.class
)
public interface UserClient {@GetMapping("/users/{userId}")User getUser(@PathVariable("userId") String id,@RequestHeader("X-Trace-Id") String traceId);@PostMapping("/users/search")List<User> searchUsers(@SpringQueryMap UserQuery query,@RequestHeader Map<String, String> headers);
}@Component
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {@Overridepublic UserClient create(Throwable cause) {return new UserClient() {@Overridepublic User getUser(String id, String traceId) {return new User("fallback-user");}// ...其他方法降级实现};}
}

相关阅读:

  • FeignClient用法-笔记-CSDN博客
  • Spring MVC中常用注解_笔记-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90284.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90284.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90284.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动端自动化Appium框架

文章目录环境搭建JAVAAndroid SDKGenymotion模拟器环境搭建 JAVA 1、安装JDK 从官网下载所需安装包&#xff0c;默认安装即可。 https://www.oracle.com/cn/java/technologies/downloads/ 2、配置环境变量 设置 - 编辑系统环境变量 - 环境变量。 系统变量下新建JAVA_HOME&a…

算法第26天|贪心算法:用最少数量的箭引爆气球、无重叠区间、划分字母区间

今日总结 用最少数量的箭引爆气球 题目链接&#xff1a;452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 整体思路&#xff1a; 1、统一度量 &#xff1a; 将所有区间按照左端点进行排序&#xff1a; 用到了二维的sort&#xff0c;在类中需…

最新版的electron通信规则

介绍: 以前electron require(electron/remote).fs 就能调用node中的各种api,最新版可能为了安全考虑,除了主main.js入口文件以外,其他的地方都不能调用node中的api,比如里面的各种函数,如fs,path等。这节课来教大家最新版本的electron如何进行通信。 结构: 了解通信之前…

Python爬虫实战:研究PyPLN库相关技术

1. 引言 随着全球化的发展,葡萄牙语作为世界第六大语言,其在互联网上的文本数据量不断增长。如何从海量的葡萄牙语文本中提取有价值的信息,成为自然语言处理领域的重要研究方向。 PyPLN (Python Natural Language Processing Toolkit) 是一个专门针对葡萄牙语设计的自然语言…

层次分析法代码笔记

层次分析法 一、核心 在层次分析法中&#xff0c;通过 算术平均法、几何平均法、特征值法 计算指标权重&#xff0c;再通过 一致性检验 确保判断矩阵逻辑合理&#xff0c;为多准则决策提供量化依据。 二、代码 &#xff08;一&#xff09;一致性检验&#xff08;判断矩阵合理性…

[精选] 2025最新生成 SSH 密钥和 SSL 证书的标准流程(Linux/macOS/Windows系统服务器通用方案)

[精选] 2025最新生成 SSH 密钥和 SSL 证书的标准流程&#xff08;Linux/macOS/Windows系统服务器通用方案&#xff09; 在现代网络中&#xff0c;SSH&#xff08;安全外壳协议&#xff09;和 SSL&#xff08;安全套接层协议&#xff09;是保证数据传输安全和身份验证的重要技术…

开发框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud复现

PHP-ThinkphpLaravelThinkPHP是一套开源的、基于PHP的轻量级Web应用开发框架综合工具&#xff1a;武器库-Thinkphp专检&#xff08;3-6版本&#xff09;如何判断是TP6框架开发的web程序&#xff0c;基于源码、路径、图标、基于报错可发现dex.php?xxx 在其6.0.13版本及以前/?c…

uniapp+vue3小程序点击保存图片、保存二维码

介绍 步骤1:引入必要的API 在script部分,确保引入了uni的相关API,如uni.downloadFile和uni.saveImageToPhotosAlbum。 步骤2:下载图片到本地 在toInvite函数中,使用uni.downloadFile将图片下载到本地,并获取本地路径。 步骤3:处理权限和保存逻辑 在saveToAlbum函数…

Golang中GROM多表关联跟原生SQL多表关联区别

文章目录前言一、GROM多表关联二、原生Sql多表关联前言 对比GROM多表关联和原生Sql多表关联 一、GROM多表关联 适用于返回全部数据需要逻辑外键&#xff08;不会在数据库创建任何约束&#xff09;适合三个表以下的关联有几张表就会查询几次 type Product struct {gorm.Model …

设计模式六:工厂模式(Factory Pattern)

概念定义一个创建对象的接口&#xff0c;但让子类决定实例化哪个类。实现示例#include <iostream> #include <memory>// 产品基类 class Product { public:virtual void use() 0;virtual ~Product() default; };// 具体产品A class ConcreteProductA : public Pr…

应用层自定义协议【序列化+反序列化】

文章目录再谈 “协议”重新理解read、write、recv、send和tcp为什么支持全双工Server.cc网络版计算机实现Socket封装&#xff08;模板方法类&#xff09;socket.hpp定制协议JsonJson安装定义一个期望的报文格式Protocol.hppParser.hppCalculator.hpp完整的处理过程Client.cc三层…

dify创建OCR工作流

实现ocr识别文件内容&#xff0c;引用dify的一个插件&#xff0c;插件名称&#xff1a;mineru 引用在线版本mineru 具体操作说明&#xff0c;参见视频&#xff1a; 第六篇&#xff1a;DifyOCR&#xff0c;扫描件最优解_哔哩哔哩_bilibili 引用本地部署mineru 上面的这种使用…

备受关注的“Facebook Email Scraper”如何操作?

Facebook Email Scraper&#xff08;脸书邮箱提取工具&#xff09;是一类用于从Facebook平台提取公开邮箱信息的工具&#xff0c;其核心功能是通过解析用户主页、群组、页面等公开内容&#xff0c;识别并提取其中包含的邮箱地址&#xff0c;为用户提供结构化的联系方式数据。这…

【网络原理】万字长文解密UDP/TCP——手把手教你理解网络通信

目录 1.前言 2.正文 2.1UDP协议 2.1.1UDP协议端格式 2.1.2UDP的特点 2.1.3理解UDP的“不可靠” 2.1.4面向数据报 2.1.5基于UDP的应用层协议 2.2TCP协议 2.2.1TCP协议端格式 2.2.2TCP十个核心机制 2.2.2.1确认应答 2.2.2.2超时重传 确认应答超时重传 vs 三次握手 …

MATLAB软件使用频繁,企业如何做到“少买多用”?

在制造企业的工程计算、算法研发、系统建模等场景中&#xff0c;MATLAB 已成为不可或缺的核心工具。 无论是动力学建模、控制算法开发&#xff0c;还是信号处理和数据可视化&#xff0c;MATLAB 的高频使用场景覆盖了从研发部门到测试部门的多个岗位。然而&#xff0c;企业 IT 负…

数据结构自学Day13 -- 快速排序--“分而治之”

&#x1f536; 一、快速排序&#xff08;Quick Sort&#xff09;&#x1f4cc; 基本思想&#xff1a;分而治之&#xff1a;每次从数组中选一个“基准”&#xff08;pivot&#xff09;&#xff0c;把比它小的放左边&#xff0c;大的放右边。对左右子数组递归排序。&#x1f9e0;…

Linux 进程与服务管理~进程基础、进程查看、进程控制、服务管理、开机启动​​

在 Linux 系统中,进程与服务管理是运维和开发的核心技能之一。进程是程序运行的实例,服务是长期运行的后台进程(守护进程)。掌握进程与服务的管理方法,能有效排查系统问题、优化资源使用。以下从 ​​进程基础、进程查看、进程控制、服务管理、开机启动​​ 五大模块详细讲…

论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes

论文地址&#xff1a;Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes 概述&#xff1a;本文提出 RGB-Stacking 基准测试&#xff0c;研究如何仅凭 RGB 摄像头视觉和本体感知&#xff0c;实现机器人对 复杂几何物体的高效堆叠。通过结合仿真专家训练、交互…

React 英语打地鼠游戏——一个寓教于乐的英语学习游戏

&#x1f3af; 英语打地鼠游戏 一个寓教于乐的英语学习游戏&#xff0c;通过经典的打地鼠玩法帮助用户学习英语单词。 ✨ 项目特色 &#x1f3ae; 游戏化学习 经典打地鼠玩法&#xff1a;6 个洞穴&#xff0c;听英文选单词即时反馈&#xff1a;答对/答错立即语音提示计分系…

Qt--Widget类对象的构造函数分析

Widget类对象的构造函数分析&#xff0c;用更直观的方式解释这段代码的作用和工作原理&#xff1a;代码&#xff1a;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }代码解析 Widget::Widget(QWidget *parent) // 构造函数定…