微服务远程调用之拦截器实战
微服务远程调用之拦截器实战
前言:
在我们开发过程中,很可能是项目是从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…
相关文章:
微服务远程调用之拦截器实战
微服务远程调用之拦截器实战 前言: 在我们开发过程中,很可能是项目是从0到1开发,或者在原有基础上做二次开发,这次是根据已有代码做二次开发,需要在我们微服务一【这里方便举例,我们后面叫模版微服务】调用…...
德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块
天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护,丰富的权限控制以及灵活的应用管理,帮助企业构建更严密的立体保密体系。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…...
超融合架构下,虚拟机高可用机制如何构建?
作者:SmartX 产品部 钟锦锌 虚拟机高可用(High Availability,简称 HA)是虚拟化/超融合平台最常用、关键的功能之一,可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此,为了充分保障…...
工厂模式详情
一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例…...
【Word】调整列表符号与后续文本的间距
1. 默认的列表格式: 2. 修改间距: ************************************************** 分割线 ************************************************************ 3. 效果...
匠心独运,B 端系统 UI 演绎华章之美
匠心独运,B 端系统 UI 演绎华章之美...
Java电商平台-开放API接口签名验证(小程序/APP)
说明:在实际的生鲜业务中,不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货: 接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&am…...
Tale全局函数对象base
目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来...
【启程Golang之旅】掌握Go语言数组基础概念与实际应用
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...
COMSOL中液晶材料光学特性模拟
前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中,可以发现定义-变量中可以使用默认坐标作为变量,即xyz。因此,折射率也可…...
虚拟现实环境下的远程教育和智能评估系统(五)
查阅相关VR眼动注意力联合教育学相关论文 1.Exploring Eye Gaze Visualization Techniques for Identifying Distracted Students in Educational VR(IEEE VR 2020) 摘要:我们提出了一种架构,使VR教学代理能够响应眼动追踪监控…...
【算法】模拟算法——Z字形变换(medium)
题解:模拟算法——Z字形变换(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接:LINK 2.题解 利用模拟,来解决问题。 首先创建出一个O(numRows*n)的数组来,并按照题目要求把每个字符按顺序填进去。 这里以numRows…...
上位机图像处理和嵌入式模块部署(f103 mcu获取唯一id)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于stm32f103系列mcu来说,一般每一颗原厂的mcu,都会对应一个唯一的id。那这个id可以用来做什么用呢?个人认为&…...
运筹学_3.运输问题(特殊的线性规划)
目录 前言3.1 平衡运输问题中初始基可行解确定运输问题平衡运输与非平衡运输平衡运输问题的数学模型单纯形法解决平衡运输问题,初始可行基的确认 3.2 平衡运输问题的最优解判别求检验数表上作业法 3.3 产销不平衡的运输问题运输问题中产大于销的问题运输问题中产小于…...
科研项目书写作学习(持续更新中...)
写好一个科研项目书也是科研中很重要的一部分,所以借这篇博客做一个积累。还是以模块化的方式吧,后面慢慢那再整合逻辑。可能写的也不是很好,慢慢提升吧~ 背景 科研项目书的背景怎么写?首先要突出问题的价值(也就是做此研究的动…...
男士内裤哪个品牌好一点?2024热门男士内裤推荐
男人的内裤保质期只取决于被别人看见的次数,如果某条内裤从未被别人看见过,那它永远都是你的新内裤。也就是说,只要穿着破内裤这尴尬的瞬间没被目击,男人就能永远和一条内裤在一起。 实际上如果长时间不更换男士内裤,…...
Llama模型家族之RLAIF 基于 AI 反馈的强化学习(六) RLAIF 代码实战
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...
计算机tcp/ip网络通信过程
目录 (1)同一网段两台计算机通信过程 (2)不同网段的两台计算机通信过程 (3)目的主机收到数据包后的解包过程 (1)同一网段两台计算机通信过程 如果两台计算机在同一个局域网中的同…...
42.开发中对String.format()的使用之空位补齐
用于空位补齐 Int x1; //对于传入的数字做处理,如果传入的数字不足三位,则使用数字0自动补齐 String numString.format(“%”3”d”,x); System.out.println(“num”num);//输出结果为:001 也可以简写成: String num2String…...
通用代码生成器应用场景四,跨编程语言翻译
通用代码生成器应用场景四,跨编程语言翻译 如果您有一个Java工程,想把它移植到Rust或Golang语言中去,希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的,保留了系统的SGS源文件或者SGS2的Excel模板,您可…...
别再画线框图了!用Axure/墨刀搞定HIS门诊医生站高保真原型的5个实战技巧
医疗HIS系统高保真原型设计:Axure/墨刀5大进阶技巧 在医疗信息化领域,门诊医生站作为HIS系统的核心模块,其原型设计的质量直接影响开发效率和最终用户体验。传统线框图已无法满足现代医疗系统复杂交互的需求,掌握Axure或墨刀的高阶…...
李慕婉-仙逆-造相Z-Turbo AI核心原理科普:如何用Transformer理解并生成人类语言
李慕婉-仙逆-造相Z-Turbo AI核心原理科普:如何用Transformer理解并生成人类语言 你有没有想过,当你和“李慕婉-仙逆-造相Z-Turbo”这样的AI模型对话时,它到底是怎么“听懂”你的话,又“想”出那些回答的?它不像我们人…...
MiniCPM-V-2_6 Ubuntu 20.04一键部署教程:从安装到运行
MiniCPM-V-2_6 Ubuntu 20.04一键部署教程:从安装到运行 想试试那个能看懂图片还能跟你聊天的多模态大模型MiniCPM-V-2_6吗?很多朋友在第一步——部署上就被卡住了,不是环境依赖搞不定,就是权限问题报错,折腾半天模型还…...
5分钟彻底告别风扇噪音!FanControl终极静音配置完全指南
5分钟彻底告别风扇噪音!FanControl终极静音配置完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/…...
【linux】linux权限的详细讲解
一、Linux 权限的概念 1.1、用户分类 Linux下有两种用户:超级用户 (root) 与 普通用户超级用户:可以再linux系统下做任何事情,几乎不受权限的限制; 普通用户:在linux下做权限范围内的事情; 超级用户的命令提…...
Python 3.14 JIT编译延迟高达83ms?这不是Bug,是设计——揭秘AST→LLVM IR→Native Code三级缓存失效链
第一章:Python 3.14 JIT编译器性能调优架构设计图Python 3.14 引入的实验性 JIT 编译器(代号 “Triton”)采用分层编译策略,将热点函数动态划分为解释执行、字节码优化、LLVM IR 生成与本地机器码缓存四个协同层级。其核心设计目标…...
从数据清洗到结果可视化:一份给地理学新手的R语言geodetector实战避坑指南
从数据清洗到结果可视化:一份给地理学新手的R语言geodetector实战避坑指南 第一次用R语言跑地理探测器时,我盯着满屏的报错信息差点崩溃——明明照着教程一步步操作,为什么别人的代码能跑出漂亮的结果,我的却总在数据导入环节就卡…...
DDD难落地?就让AI干吧! - cleanddd-skills介绍
一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...
抖音视频批量下载高效解决方案实战指南
抖音视频批量下载高效解决方案实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&…...
AI 时代:祛魅、适应与重新定义
指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...
