当前位置: 首页 > news >正文

微服务远程调用之拦截器实战

微服务远程调用之拦截器实战

前言:
在我们开发过程中,很可能是项目是从0到1开发,或者在原有基础上做二次开发,这次是根据已有代码做二次开发,需要在我们微服务一【这里方便举例,我们后面叫模版微服务】调用微服务二【后面叫系统管理模块】

需求背景
1,模版服务需要给当前系统所有用户做默认的模版数据
2,用户数据在系统管理模块里面
3,需要将没有默认模板的用户的人查找出来,添加默认模板数据。
4,一般服务与服务之间调用要有请求头信息,比如token,user_id …【遇到问题里面细讲】

使用步骤

1、引入openfeign依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、Feignclient远程接口
package com.xx.xx.xx.feign.client;import com.xx.xx.xx.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;/*** @author psd *  xxx_manage_service 远程调用微服务的名字* 请求地址是全路径地址**/
@FeignClient(name = "xxx_manage_service")
public interface SmartGateWayClient {@GetMapping("/api/xx/portalMyConfig/queryAllPortalMyConfig")R<List<MyxxxConfigVo>> queryAllMyxxxConfigVo();}
3、编写feignClient拦截器

每次远程调用前,设置请求头信息

package com.xx.xx.xx.interceptor;import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;/*** @author psd 远程调用拦截器设置头参数信息*/
@Slf4j
@Component
public class FeignClientInterceptor implements RequestInterceptor {HttpServletRequest request;public FeignClientInterceptor(HttpServletRequest request) {this.request = request;}@Overridepublic void apply(RequestTemplate requestTemplate) {// 设置请求头的数据requestTemplate.header("Authorization",request.getHeader("Authorization"));// TODO:有的还需要添加 user_id 信息 log.info("FeignClientInterceptor 拦截器中的请求头的信息 Authorization :{}",request.getHeader("Authorization"));}
}
4、主启动类添加@EnableFeignClients 注解
package com.xx.xxx.platform;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** @author psd*/@RefreshScope
@EnableSwagger2
@EnableScheduling
@EnableFeignClients
@EnableDiscoveryClient
@MapperScan("xx.xx.xx.xx.mapper")
@SpringBootApplication
public class PortalPlatformApplication {public static void main(String[] args) {SpringApplication.run(PlatformApplication.class, args);}
}

遇到的问题

1、使用Feignclient 是从网关还是直接走指定微服务

网关现在理解就是所有的请求都走网关,就是负载均衡,路由转发作用… 看项目需求一般走指定微服务

2、编写Feignclient拦截器时候,有时需要添加user_id 信息,在系统管理服务里面有拦截,这个不一定,具体业务具体分析
3、有个远程调用返回MyxxxConfigVo 里面有个时间
 /*** 创建时间*/private LocalDateTime createTime;/*** 修改时间*/private LocalDateTime updateTime;

在项目接收方也是这个数据类型,报以下异常
Caused by: org.springframework.web.client.RestClientException: Error while extracting response for type [com.pubinfo.smart.common.web.R<java.util.List<com.xx.xx.xx.feign.vo.MyxxxConfigVo >>] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String “2024-05-25T16:25:02”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2024-05-25T16:25:02’ could not be parsed at index 10; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2024-05-25T16:25:02”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2024-05-25T16:25:02’ could not be pars
大概意思是返回JSON String “2024-05-25T16:25:02”: 不能转换为 LocalDateTime 类型的时间。

修改为以下问题解决。

    /*** 创建时间*/@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")private LocalDateTime createTime;/*** 修改时间*/@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")private LocalDateTime updateTime;
4、自定义模版服务调用系统管理服务 在请求的时候报 用户不存在

详细描述:
但是添加了token的信息,且token不为空,这个后面猜测可能是在系统管理服务里面有个拦截器需要校验user_id 是否为空,为空就报异常。
后面在远程调用前添加 请求头信息user_id 的值。问题解决

喜欢我的文章的话,点个阅读或者点个点赞,是我编写博客的动力,持续更新中 ing…

相关文章:

微服务远程调用之拦截器实战

微服务远程调用之拦截器实战 前言&#xff1a; 在我们开发过程中&#xff0c;很可能是项目是从0到1开发&#xff0c;或者在原有基础上做二次开发&#xff0c;这次是根据已有代码做二次开发&#xff0c;需要在我们微服务一【这里方便举例&#xff0c;我们后面叫模版微服务】调用…...

德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块

天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护&#xff0c;丰富的权限控制以及灵活的应用管理&#xff0c;帮助企业构建更严密的立体保密体系。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…...

超融合架构下,虚拟机高可用机制如何构建?

作者&#xff1a;SmartX 产品部 钟锦锌 虚拟机高可用&#xff08;High Availability&#xff0c;简称 HA&#xff09;是虚拟化/超融合平台最常用、关键的功能之一&#xff0c;可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此&#xff0c;为了充分保障…...

工厂模式详情

一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例…...

【Word】调整列表符号与后续文本的间距

1. 默认的列表格式&#xff1a; 2. 修改间距&#xff1a; ************************************************** 分割线 ************************************************************ 3. 效果...

匠心独运,B 端系统 UI 演绎华章之美

匠心独运&#xff0c;B 端系统 UI 演绎华章之美...

Java电商平台-开放API接口签名验证(小程序/APP)

说明&#xff1a;在实际的生鲜业务中&#xff0c;不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货: 接口安全问题 请求身份是否合法&#xff1f; 请求参数是否被篡改&#xff1f; 请求是否唯一&#xff1f; AccessKey&am…...

Tale全局函数对象base

目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来...

【启程Golang之旅】掌握Go语言数组基础概念与实际应用

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…...

COMSOL中液晶材料光学特性模拟

前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中&#xff0c;可以发现定义-变量中可以使用默认坐标作为变量&#xff0c;即xyz。因此&#xff0c;折射率也可…...

虚拟现实环境下的远程教育和智能评估系统(五)

查阅相关VR眼动注意力联合教育学相关论文 1.Exploring Eye Gaze Visualization Techniques for Identifying Distracted Students in Educational VR&#xff08;IEEE VR 2020&#xff09; 摘要&#xff1a;我们提出了一种架构&#xff0c;使VR教学代理能够响应眼动追踪监控…...

【算法】模拟算法——Z字形变换(medium)

题解&#xff1a;模拟算法——Z字形变换(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 利用模拟&#xff0c;来解决问题。 首先创建出一个O(numRows*n)的数组来&#xff0c;并按照题目要求把每个字符按顺序填进去。 这里以numRows…...

上位机图像处理和嵌入式模块部署(f103 mcu获取唯一id)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于stm32f103系列mcu来说&#xff0c;一般每一颗原厂的mcu&#xff0c;都会对应一个唯一的id。那这个id可以用来做什么用呢&#xff1f;个人认为&…...

运筹学_3.运输问题(特殊的线性规划)

目录 前言3.1 平衡运输问题中初始基可行解确定运输问题平衡运输与非平衡运输平衡运输问题的数学模型单纯形法解决平衡运输问题&#xff0c;初始可行基的确认 3.2 平衡运输问题的最优解判别求检验数表上作业法 3.3 产销不平衡的运输问题运输问题中产大于销的问题运输问题中产小于…...

科研项目书写作学习(持续更新中...)

写好一个科研项目书也是科研中很重要的一部分&#xff0c;所以借这篇博客做一个积累。还是以模块化的方式吧&#xff0c;后面慢慢那再整合逻辑。可能写的也不是很好&#xff0c;慢慢提升吧~ 背景 科研项目书的背景怎么写&#xff1f;首先要突出问题的价值(也就是做此研究的动…...

男士内裤哪个品牌好一点?2024热门男士内裤推荐

男人的内裤保质期只取决于被别人看见的次数&#xff0c;如果某条内裤从未被别人看见过&#xff0c;那它永远都是你的新内裤。也就是说&#xff0c;只要穿着破内裤这尴尬的瞬间没被目击&#xff0c;男人就能永远和一条内裤在一起。 实际上如果长时间不更换男士内裤&#xff0c;…...

Llama模型家族之RLAIF 基于 AI 反馈的强化学习(六) RLAIF 代码实战

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…...

计算机tcp/ip网络通信过程

目录 &#xff08;1&#xff09;同一网段两台计算机通信过程 &#xff08;2&#xff09;不同网段的两台计算机通信过程 &#xff08;3&#xff09;目的主机收到数据包后的解包过程 &#xff08;1&#xff09;同一网段两台计算机通信过程 如果两台计算机在同一个局域网中的同…...

42.开发中对String.format()的使用之空位补齐

用于空位补齐 Int x1; //对于传入的数字做处理&#xff0c;如果传入的数字不足三位&#xff0c;则使用数字0自动补齐 String numString.format(“%”3”d”,x); System.out.println(“num”num);//输出结果为&#xff1a;001 也可以简写成&#xff1a; String num2String…...

通用代码生成器应用场景四,跨编程语言翻译

通用代码生成器应用场景四&#xff0c;跨编程语言翻译 如果您有一个Java工程&#xff0c;想把它移植到Rust或Golang语言中去&#xff0c;希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的&#xff0c;保留了系统的SGS源文件或者SGS2的Excel模板&#xff0c;您可…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...