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

embedded/2024/12/26 8:35:21/

微服务架构中,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/embedded/148843.html

相关文章

SSH之Struts(一)

1&#xff0c;Struts2框架介绍 Struts2框架是MVC流程框架&#xff0c;适合分层开发。框架应用实现不依赖于Servlet&#xff0c;使用大量的拦截器来处理用户请求&#xff0c;属于无侵入式的设计。 2&#xff0c;Struts2框架的流程原理 1&#xff09;请求先到达Filter中央控制器…

要查询名为 `user` 的表有多少条数据(SELECT COUNT(*) FROM user;)

为什么要使用 * &#xff0c;而不是id&#xff0c;null&#xff0c;字段&#xff0c;1。这篇博客说明了原因&#xff0c;直接点击即可查看&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 要查询名为 user 的表有多少条数据&#xff0c;可以使用以下 SQL 查询语…

[数据结构] LRU Cache | ListMap 实现

目录 1. 什么是 LRU Cache 2. LRU Cache 的实现 3. 代码 概念理解 题目要求 删除一个节点&#xff08;抽出一本书&#xff09; 在链表头添加一个节点&#xff08;把一本书放在最上面&#xff09; 如何快速找到要抽出来的书&#xff1f; 答疑 代码实现 复杂度分析 4…

Matrix-Breakout 2 Morpheus靶场

第一步 信息收集 (1)寻找靶场真实ip arp-scan -l 靶场真实 ip 为192.168.152.154 (2)探测端口及服务 nmap -p- -sV 192.168.52.135 第二步 开始渗透 (1)访问web服务 http://192.168.152.154 and http://192.168.52.135:81 发现 81 端口的页面要登录 我们使用…

基于python的电子报实现思路

一种基于PDF生成电子报的思路 需求提出实现思路&#xff1a;技术路线核心代码&#xff1a; 需求提出 最近公司提出了一个电子报的需求&#xff0c;可看网上实现的思路基本上是方正系列的排版软件实现的&#xff0c;公司没必要买这么一套&#xff0c;于是按照自己的思路搞了一个…

Linux自动挂载与卸载USB设备

一、实现udev规则 创建规则&#xff1a;sudo vi /etc/udev/rules.d/usb.rules SUBSYSTEMS"usb",SUBSYSTEM"block",ACTION"add",RUN{program}"/bin/mkdir /mnt/%k",RUN{program}"/usr/bin/systemd-mount --no-block --collect …

ABAQUS纤维混凝土细观模型基于梁单元建模

钢纤维混凝土&#xff08;SFRC&#xff09;弥补了素混凝土抗裂性的不足&#xff0c;为建立钢纤维混凝土的力学本构模型&#xff0c;本案例通过CAD随机纤维3D插件建立随机分布的纤维线模型&#xff0c;并将模型导入ABAQUS内&#xff0c;通过梁单元纤维模型&#xff0c;研究细观纤…

京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分&#xff1a; 1. 平台产品能力介绍 2. 业务赋能案例分享 3. 平台建设挑战与展望 作者&#xff1a;梁臣 京东 数据产品架构师 01平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用…