【JAVA高级篇教学】第五篇:OpenFeign 微服务调用注意事项

news/2024/12/27 11:48:59/

微服务架构中,OpenFeign 是一种常用的 HTTP 客户端工具,用于实现服务之间的调用。它提供了声明式的接口调用方式,大幅简化了开发工作。然而,在实际使用中,需要注意一些细节,尤其是在处理 GET、POST 请求和参数传递时,以及应对常见错误。

目录

一、GET 请求的参数传递

基本用法

注意事项

常见错误

二、POST 请求的参数传递

基本用法

注意事项

常见错误

三、路径参数的使用

基本用法

注意事项

常见错误

四、请求头的处理

基本用法

注意事项

常见错误

五、全局配置和超时设置

基本用法

示例代码

注意事项

六、常见错误和解决方法

6.1 NullPointerException

6.2 feign.codec.DecodeException

java.net.ConnectException-toc" style="margin-left:120px;">6.3 java.net.ConnectException

6.4 参数丢失问题

总结


一、GET 请求的参数传递

基本用法

GET 请求通常用于获取资源数据,OpenFeign 通过 @RequestParam 注解传递查询参数。

注意事项
  1. 方法签名 确保每个查询参数都明确标注 @RequestParam,并指定 value 与服务端接口的参数名一致。

  2. URL 长度限制 GET 请求的 URL 长度有限(通常为 2048 字符)。当参数过多时,应考虑使用 POST 请求。

  3. 示例代码

java">@FeignClient(name = "user-service")
public interface UserServiceClient {@GetMapping("/users")List<User> getUsers(@RequestParam("page") int page, @RequestParam("size") int size);
}
常见错误
  • 参数名不匹配:导致服务端无法识别参数。
  • 未标注 @RequestParam:Feign 默认不处理未注解的参数,可能导致参数丢失。

二、POST 请求的参数传递

基本用法

POST 请求适用于提交数据或执行复杂查询,常用 @RequestBody 传递 JSON 格式的对象。

注意事项
  1. 单个对象传递 使用 @RequestBody 标注请求体对象,确保对象能够序列化为 JSON。

  2. 多个参数传递 POST 请求不支持多个 @RequestBody,需要将参数封装为一个对象,或使用 @RequestParam 传递简单参数。

  3. Content-Type 设置 确保请求头中 Content-Typeapplication/json,可以通过拦截器设置默认值。

  4. 示例代码

java">@FeignClient(name = "order-service")
public interface OrderServiceClient {@PostMapping("/orders")Order createOrder(@RequestBody OrderRequest orderRequest);
}public class OrderRequest {private Long userId;private List<Long> productIds;// getters and setters
}
常见错误
  • 缺少 @RequestBody 注解:导致请求体为空。
  • 参数类型不匹配:确保客户端和服务端的对象结构一致。

三、路径参数的使用

基本用法

路径参数通常用于标识资源,使用 @PathVariable 注解。

注意事项
  1. 占位符匹配 确保路径中的占位符与 @PathVariablevalue 属性一致。

  2. 示例代码

java">@FeignClient(name = "product-service")
public interface ProductServiceClient {@GetMapping("/products/{id}")Product getProductById(@PathVariable("id") Long id);
}
常见错误
  • 路径变量未匹配:例如 URL 中定义了 /products/{id},但方法参数未标注 @PathVariable 或名称不一致。
  • 占位符遗漏:Feign 会抛出 IllegalArgumentException

四、请求头的处理

基本用法

通过 @RequestHeader 注解传递自定义请求头。

注意事项
  1. 认证信息传递 例如传递 JWT Token,可以通过 @RequestHeader 或 Feign 的拦截器设置。

  2. 示例代码

java">@FeignClient(name = "auth-service")
public interface AuthServiceClient {@PostMapping("/validate")boolean validateToken(@RequestHeader("Authorization") String token);
}
  1. 全局请求头 使用拦截器为所有请求添加默认请求头。
常见错误
  • 缺少必要的请求头:例如认证头 Authorization,导致服务端拒绝请求。
  • 动态请求头遗漏:拦截器未正确配置动态参数。

五、全局配置和超时设置

基本用法
  • 配置连接超时和读取超时,避免因服务异常导致客户端无限等待。
示例代码
java">@Configuration
public class FeignConfig {@Beanpublic Request.Options options() {return new Request.Options(5000, 10000); // 连接超时 5 秒,读取超时 10 秒}
}
注意事项
  1. 合理的超时设置 避免默认超时时间过长,影响服务响应。
  2. 错误重试机制 配置 Feign 的重试策略以应对临时性网络问题。

六、常见错误和解决方法

6.1 NullPointerException
  • 原因:服务端返回的字段与客户端的对象字段不匹配。
  • 解决:检查返回数据结构,确保字段名和类型一致。
6.2 feign.codec.DecodeException
  • 原因:服务端返回的数据无法解析为客户端的对象。
  • 解决:检查服务端返回的 JSON 格式和客户端对象结构。
java.net.ConnectException">6.3 java.net.ConnectException
  • 原因:目标服务不可用或网络连接失败。
  • 解决:检查服务地址、端口以及网络连通性。
6.4 参数丢失问题
  • 原因:未正确使用注解,如 GET 参数未标注 @RequestParam
  • 解决:确保参数声明和注解与接口匹配。

总结

使用 OpenFeign 调用微服务接口时,需重点关注以下事项:

  1. 请求方法与参数注解的正确使用。
  2. GET 和 POST 请求参数的传递规则。
  3. 路径参数和请求头的细节处理。
  4. 配置合理的超时和重试策略。

通过遵循这些最佳实践,可以避免常见错误,提高服务之间调用的可靠性和效率。

特别注意:

在参数很多的时候,记住千万别用get请求,get是有参数限制的,否则会提示或者返回一个html,里面内容就是400 bad request 。

点个关注,不会迷路! 


http://www.ppmy.cn/news/1558202.html

相关文章

开关电源特点、分类、工作方式

什么叫开关电源随着电力电子技术的发展和创新&#xff0c;使得开关电源技术也在不断地创新。目前&#xff0c;开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电子设备&#xff0c;是当今电子信息产业飞速发展不可缺少的一种电源方式。 开关电源是利用现代电力电子技…

MySQL三层B+树能存多少数据

结论 bigint类型的索引&#xff08;8字节&#xff09;&#xff0c;一条数据假设是1KB的话&#xff0c; 三层B树 能存2000万条数据 该题主要考察数据如何在B树中存储的 计算思路 1.计算叶节点的大小 2.计算子节点的个数&#xff0c;由此算出第三层叶子节点的个数&#xff08;n*n…

前端实习近期小结

有一小段时间没有更新了&#xff0c;年前的业务需求比较多而且急&#xff0c;今日凌晨&#xff08;2点多还在修改、提交代码到库&#xff09;还好这次是远程办公&#xff0c;忙完还可以立马洗澡休息.. 忙里偷闲&#xff0c;更新一下前端实习近况吧。现在写这篇博客的心情也比较…

开源轮子 - Apache Common

Apache Common 文章目录 Apache Common一&#xff1a;BeanUtils1&#xff1a;核心功能预览2&#xff1a;深入PropertyUtils3&#xff1a;BeanUtils的高级应用4&#xff1a;ConvertUtils的威力4.1&#xff1a;基本使用4.2&#xff1a;我要的异常呢&#xff1f;4.3&#xff1a;探…

下载运行Vue开源项目vue-pure-admin

git地址&#xff1a;GitHub - pure-admin/vue-pure-admin: 全面ESMVue3ViteElement-PlusTypeScript编写的一款后台管理系统&#xff08;兼容移动端&#xff09; 安装pnpm npm install -g pnpm # 国内 淘宝 镜像源 pnpm config set registry https://registry.npmmirror.com/…

计算机前沿技术-人工智能算法-大语言模型-最新研究进 2024-12-22

计算机前沿技术-人工智能算法-大语言模型-最新研究进 2024-12-22 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进 2024-12-22目录1. FaultExplainer: Leveraging Large Language Models for Interpretable Fault Detection and Diagnosis2. Answer Set Netw…

事件驱动编程与异步编程:原理、对比及实践案例

在编程领域&#xff0c;事件驱动编程&#xff08;Event-Driven Programming&#xff09;与异步编程&#xff08;Asynchronous Programming&#xff09;是两种极为关键的编程范式&#xff0c;它们对于提升程序运行效率与响应速度效果显著&#xff0c;尤其在应对I/O密集型任务以及…

Python win32gui 模块:窗口操作方法代码实例

目录 一.获取窗口句柄 1.根据类名、标题获取窗口句柄 FindWindow FindWindowEx 2.根据坐标获取窗口句柄 WindowFromPoint ChildWindowFromPoint 3.获取当前活动窗口(前台)句柄 4.获取具有焦点的窗口的句柄 5.枚举窗口句柄&#xff1a;顶层窗口句柄、子窗口句柄 EnumW…