Spring Boot 中使用 Feign 调用内网 IP 接口并记录入参与出参

在微服务架构中,服务间的通信是常见的需求。Spring Cloud 提供的 Feign 客户端是一个声明式的 Web 服务客户端,它使得服务间的调用变得非常简单。然而,在实际开发中,我们可能需要调用内网 IP 地址的接口,并且希望记录请求的入参和响应的出参,以便于调试和监控。本文将详细介绍如何实现这一需求。

1. Feign 简介

Feign 是一个基于 Java 的声明式 Web 服务客户端,它使得编写 HTTP 客户端变得更加容易。通过 Feign,你可以使用接口和注解的方式定义与远程服务的交互,而无需编写复杂的 HTTP 请求代码。Feign 与 Spring Cloud 集成后,可以方便地在 Spring Boot 项目中使用。

2. 调用内网 IP 接口

在某些场景下,我们需要调用内网 IP 地址的接口。例如,你的微服务部署在内网环境中,需要访问其他内网服务。Feign 支持直接指定服务的 URL,这使得调用内网 IP 接口变得非常简单。

2.1 配置 Feign 客户端

在 Spring Boot 项目中,可以通过 @FeignClient 注解的 url 属性直接指定内网 IP 地址。例如:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(value = "inner-service", url = "http://192.168.1.100:8080")
public interface InnerServiceClient {@GetMapping("/api/endpoint")String getSomeData();
}

在上述代码中,value 属性用于标识服务名称,而 url 属性直接指定了内网 IP 地址和端口。

3. 记录入参和出参

为了更好地调试和监控,我们可能需要记录请求的入参和响应的出参。Feign 提供了强大的拦截器机制,可以通过实现 RequestInterceptorDecoder 接口来实现这一需求。

3.1 自定义请求拦截器

请求拦截器可以在请求发送前对请求进行处理。通过实现 RequestInterceptor 接口,我们可以记录请求的入参:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class FeignRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {// 获取请求的入参String requestBody = new String(requestTemplate.request().body(), StandardCharsets.UTF_8);log.info("Feign 请求入参:{}", requestBody);}
}

3.2 自定义响应拦截器

响应拦截器可以在响应解码时对响应进行处理。通过实现 Decoder 接口,我们可以记录响应的出参:

import feign.FeignException;
import feign.Request;
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import io.micrometer.core.instrument.util.IOUtils;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;@Slf4j
public class FeignLogDecoder implements Decoder {private final Decoder delegate;public FeignLogDecoder(Decoder delegate) {this.delegate = delegate;}@Overridepublic Object decode(Response response, Type type) throws IOException {// 获取响应体String responseBody = IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8);log.info("Feign 响应出参:{}", responseBody);// 将响应体重新写入 Response 对象中,供后续处理return delegate.decode(response.toBuilder().body(responseBody, StandardCharsets.UTF_8).build(), type);}
}

3.3 配置 Feign 客户端

将自定义的拦截器和解码器注册到 Feign 客户端中:

import feign.codec.Decoder;
import feign.optionals.OptionalDecoder;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {@Beanpublic RequestInterceptor requestInterceptor() {return new FeignRequestInterceptor();}@Beanpublic Decoder feignDecoder() {return new FeignLogDecoder(new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder())));}
}

3.4 使用 Feign 客户端

在 Feign 客户端中使用自定义的配置类:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(value = "inner-service", url = "http://192.168.1.100:8080", configuration = FeignConfig.class)
public interface InnerServiceClient {@GetMapping("/api/endpoint")String getSomeData();
}

4. 配置 Feign 日志级别

为了更好地调试和记录日志,可以在 application.ymlapplication.properties 文件中配置 Feign 的日志级别:

logging:level:com.example.feign: DEBUG

5. 注意事项

  1. 网络连通性:确保调用方服务可以访问内网 IP 地址。如果调用方和被调用方不在同一网络,可能需要配置代理或网关。
  2. 安全性:内网 IP 地址通常不暴露在公网中,确保网络环境安全,避免敏感信息泄露。
  3. 服务发现:如果你使用了服务发现(如 Eureka 或 Consul),可以直接通过服务名调用,而不需要硬编码 IP 地址。如果必须使用 IP 地址,确保 IP 地址不会频繁变动。
  4. 性能影响:记录日志可能会对性能产生一定影响,建议在生产环境中根据实际需求调整日志级别。
  5. 线程安全RequestTemplateResponse 是线程安全的,因此在拦截器中直接操作这些对象是安全的。
  6. 敏感信息处理:如果请求或响应中包含敏感信息(如密码、令牌等),需要在日志中进行脱敏处理。

6. 总结

通过上述步骤,我们可以在 Spring Boot 项目中使用 Feign 调用内网 IP 地址的接口,并记录请求的入参和响应的出参。这不仅可以帮助我们更好地调试和监控服务间的通信,还可以提高系统的可维护性。希望本文对你有所帮助!

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

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

相关文章

【Java】 使用 HTTP 响应状态码定义web系统返回码

系统状态码定义 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客户端错误段 ErrorCode BAD_REQUEST new ErrorCode(400, "请求参数不正确");ErrorCode UNAUTHORIZED new ErrorCode(401, "账号未登…

如何搭建spark yarn模式的集群

一、基础环境准备 ‌安装JDK 1.8‌ 所有节点需安装JDK并配置环境变量&#xff0c;确保JAVA_HOME正确指向安装路径14。‌部署Hadoop集群‌ 安装Hadoop&#xff08;推荐3.x版本&#xff09;&#xff0c;配置YARN资源管理器4。在yarn-site.xml中启用资源调度&#xff1a; <pro…

python22-元组、列表、字典、集合推导式

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 循环语句小作业 元组推导式列表推导式字典推导式实践是检验真理的唯一标准 推导式 简介 Pytho…

探索 CameraCtrl模型:视频生成中的精确摄像机控制技术

在当今的视频生成领域&#xff0c;精确控制摄像机轨迹一直是一个具有挑战性的目标。许多现有的模型在处理摄像机姿态时往往忽略了精准控制的重要性&#xff0c;导致生成的视频在摄像机运动方面不够理想。为了解决这一问题&#xff0c;一种名为 CameraCtrl 的创新文本到视频模型…

跨端开发技术总结

1.electron&#xff1a; 基于node.js 桌面端&#xff1a;window / linux / macos 手机端&#xff1a;无 页面&#xff1a;网页开发相关技术都可以 2.tauri 基于rust 桌面端&#xff1a;window / linux / macos 手机端&#xff1a;android / IOS 页面&#xff1a;网页开…

单片机-89C51部分:7、中断

飞书文档https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中断的作用 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功…

0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目

文章目录 1 JWT1.1 JWT结构1.2 工作流程1.3 优点1.4 缺点1.5 安全实践1.6. 适用场景1.7 JWT与OAuth2**8. 示例代码&#xff08;Node.js&#xff09;** 2 用户mock和api3 注册4 登录5 token存储6 请求拦截器设置token6 获取用户信息7 退出登录结语 1 JWT JSON Web Token&#x…

大模型入门

一、模型入门路径 1. 学习预备知识 编程语言&#xff1a;熟练掌握Python编程语言&#xff0c;包括基本语法、数据结构&#xff08;列表、字典、元组等&#xff09;、面向对象编程、文件操作等。Python有丰富的机器学习和深度学习库&#xff0c;方便进行大模型的开发和实验。数…

把dll模块注入到游戏进程的方法_插APC注入

一、概述 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插…

git 如何清空当前分支的历史提交记录,仅保留最后一次提交

本方法基于新建 Git 孤立分支实现&#xff1a; 1. ​​首先检出待清理的分支 在 IDEA 右下角检查当前分支名称 或执行 git branch 确认。如果不在目标分支上&#xff0c;会显示 (HEAD detached at xxxxx)&#xff0c;这时需要先切换分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest应用

Googletest 1 配置 使用cmake配置&#xff1a; 具体文件后面上传补充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 为了跟踪流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx设置运行参数 set args --gtest_filterxxx.…

JavaScript:从DOM概述到window对象的常见事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window 2.BOM的构成 BOM比DOM更大&#xff0c;它包含DOM window对象是浏览器的顶级对象&a…

qobject与event事件应用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject与事件处理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec(); }QApplication a(argc, argv);&#xff1a;创建 QAppli…

QTableView复选框居中

目录 方法一&#xff1a;QSS方法2:自定义复选框委托类一、构造函数 CheckBoxDelegate()二、paint() 方法三、editorEvent() 方法四、关键设计要点五、扩展应用场景六、代码示例&#xff08;补充&#xff09; 方法一&#xff1a;QSS QTableView::indicator {position: relative…

基于QT的仿QQ音乐播放器

一、项目介绍 该项目是基于QT开发的⾳乐播放软件&#xff0c;界面友好&#xff0c;功能丰富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 点击最小化按钮&#xff0c;窗口最小化 点击最大化按钮&#xff0c;窗口最大化 点击关闭按钮&#xff0c;程序退出 …

SQL知识点合集---第二弹

数据一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位机程序开发2.具体例子控制led灯3. linux中的函数跟QT类里面的函数同名&#xff0c;发生冲突4.示例代码 1.上位机程序开发 QT做一个上位机程序&#xff0c;控制底层的硬件设备(下位机) 总结&#xff1a; 在构造函数里面去初始化&#xff0c;打开硬件驱动在析…

Flutter介绍、Flutter Windows Android 环境搭建 真机调试

目录 Flutter介绍 Windows 环境搭建 1.安装配置JDK 2.下载安装Android Studio 3.下载配置Flutter SDK ​4.运行Flutter doctor命令检测环境是否配置成功 ​5.打开Android Studio安装Flutter/Dart 插件 ​6.插件运行Flutter项目 ​编辑 Flutter Android真机调试 Flut…

Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)

文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…

Vue基础(7)_计算属性

计算属性(computed) 一、使用方式&#xff1a; 1.定义计算属性&#xff1a; 在Vue组件中&#xff0c;通过在 computed 对象中定义计算属性名称及对应的计算函数来创建计算属性。计算函数会返回计算属性的值。 2.在模板中使用计算属性&#xff1a; 在Vue的模板中&#xff0c;您…