Springcloud微服务合并打包,重复路径引发的血案

news2024/12/28 20:44:35

你好,我是柳岸花开。

在微服务架构的世界里,各种服务之间的接口调用犹如人类的神经系统,构成了整个系统的核心。然而,正是这些看似简单的接口路径,可能会引发一场惊天血案。今天,我们就来揭开一起因“重复路径”而引发的性能问题。

一、事件起因

在最近的项目测试中,用户中心(User Center,简称 UC)的日志查询功能被发现存在严重的性能问题,具体表现为查询速度异常缓慢。经过深入排查,问题的真相逐渐浮出水面。

二、问题解析

  1. 重复的日志查询接口
    在用户中心中,我们定义了两个自定义的日志查询接口 /log/getLogList/log/getLogDetailById,这两个接口的路径恰好与 日志中心的相同。看似无害的重复路径,却为后续的惨剧埋下了伏笔。

  2. 服务合并打包的复杂性
    在一次服务优化过程中,开发团队将 用户、日志 等多个服务合并到一个包 中。按照常理,这样的操作是为了减少服务调用的延迟,提高系统的整体性能。然而,合并包 成为所有请求的入口点,当一个页面请求到 用户 时,该服务通过 FeignClient 调用日志。由于路径的重复性,系统优先匹配到了 用户 中定义的接口。这一操作,直接导致了接口的循环调用和查询延迟。

  3. 为何启动时不报错?
    更为诡异的是,尽管存在重复路径问题,但系统在启动时并未报错。这要归功于 Spring 框架的宽容性。在用户中心中,接口使用了 @PostMapping 注解,而在 日志中心 中,接口则使用了 @RequestMapping 注解。由于这两个注解的处理方式不同,Spring 在启动时没有检测到冲突。然而,当实际请求到来时,POST 请求的优先匹配机制让 用户中心的接口率先“拔枪”,导致请求被错误处理。

三、血案背后的教训

这起性能事故的教训十分深刻,暴露了多个系统设计和架构上的隐患:

  1. 路径设计的唯一性
    在微服务架构中,各服务的接口路径必须具有唯一性,避免出现重复定义的情况。尤其是在涉及核心功能如日志查询等场景时,路径的冲突可能直接导致服务异常。

  2. 合并打包的风险
    将多个服务合并打包成一个统一的 API 网关或主服务时,一定要理清接口的调用逻辑和优先级。否则,一旦出现意外的调用链路,轻则性能问题,重则系统崩溃。

  3. 接口注解的规范化
    在使用注解时,需要更加规范和谨慎。对于类似 @PostMapping@RequestMapping 这样看似相似但却有本质区别的注解,需要在设计时充分考虑其不同的调用机制,以避免运行时的意外问题。

四、如何避免下一场“血案”?

为了避免类似的性能问题再次发生,我们提出以下建议:

  • 接口路径管理:在服务开发时,应建立统一的接口路径管理机制,确保各服务之间的路径唯一且不冲突。
  • 服务分层与隔离:在微服务架构中,应合理分层与隔离各个服务,避免在打包或合并时引发不必要的循环依赖和调用。
  • 启动检查机制:改进服务启动时的检查机制,可以通过自定义的脚本或工具,在服务启动前检测可能存在的路径重复或注解冲突。

五、结语

微服务架构虽然灵活且易于扩展,但同时也带来了更多的管理和维护挑战。正如这起由“重复路径”引发的血案,警醒我们在架构设计和实现过程中,需要更加细致和规范。希望每一位开发者都能从中吸取教训,避免类似的问题,为构建更加稳定和高效的系统而努力。

👇关注我,下期了解👇 ​ SpringBoot自动配置 ​ ​ alt ​ ​ 回复 222,获取Java面试题合集 ​ 关于我 ​ 一枚爱折腾的Java程序猿,专注Spring干货。把路上的问题记录下来,帮助那些和我一样的人。 ​ 好奇心强,喜欢并深入研究古天文。 ​ 崇尚 个人系统创建,做一些时间越长越有价值的事情。思考 把时间留下来 又 每刻都是新的。

本文由 mdnice 多平台发布

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

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

相关文章

Git高手必备:掌握这些指令,轻松玩转版本控制(一)

前言 注:本文下的除非特殊声明,否则一律不作为实际加号,仅表示连接 所有的版本控制系统,只能跟踪文本文件的改动比如txt文件,网页,所有程序的代码等,能清楚的知道改动了什么。但是类似于图片、…

嵌入式全栈开发学习笔记---Linux系统编程(文件编程)

目录 Linux文件概述 系统IO 创建文件creat() 打开文件open() 写文件write() 读文件read() 文件指针---lseek() 系统IO拷贝 标准IO 标准IO和系统IO的区别 缓冲区的分类 行缓存测试 打开文件fopen() 写文件fwrite() 读文件read() 标准IO拷贝 标准IO和系统IO的效…

实践:根据时区显示时间

背景 在数据库中存储时间,不会自动对时区进行处理,要想针对不同时区作时间显示的适配,需要在程序中做适配,本文即为解决这一问题的实践案例。 数据库存 UTC 时间 插入记录时,使用 datetime.utcnow()获取当前 utc 时…

MFCC C++实现与Python库可视化对比

MFCC C实现与Python库对比 MFCC理论基础 在音频、语音信号处理领域,我们需要将信号转换成对应的语谱图(spectrogram),将语谱图上的数据作为信号的特征。语谱图的横轴x为时间,纵轴y为频率,(x,y)对应的数值代表在时间x时频率y的幅…

动作损失 ​ 的定义

动作损失 La是在弱监督时间动作定位(Weakly-Supervised Temporal Action Localization, WSTAL)任务中用于优化模型的一种损失函数。它的主要目标是确保模型能够准确地预测视频中动作发生的时间段,并对视频级别标签进行良好的分类。下面是对动…

【Python系列】 Python 中的枚举使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PyTorch中,动态调整学习率(Learning Rate Scheduling),也可以根据损失函数的损失数值自动调整学习率

在PyTorch中,动态调整学习率(Learning Rate Scheduling)是一种常用的技术, 用于在训练过程中根据一定的策略调整学习率,以优化模型的训练效果和收敛速度。以下是一些常见的学习率调整策略: 1. **固定步长…

金融科技初创企业建设指南

金融科技领域正以前所未有的速度发展,重塑我们与金钱和金融服务的互动方式。随着我们迈向 2025 年,尖端技术的融合、不断变化的消费者期望以及全球对金融包容性的推动正在创造前所未有的机遇。创新者现在有独特的机会在金融科技领域留下自己的印记。 以下几个因素使得即将到…

<计算机网络>笔记1: TCP/IP五层协议

<计算机网络>笔记1: TCP/IP五层协议 文章目录 <计算机网络>笔记1: TCP/IP五层协议ref1. 概述名词因特网组成性能指标TCP/IP模型: 实际普及全球的协议 2. 物理层3. 数据链路层点对点信道3.1. 基本问题3.3.2 点对点协议PPP Point-to-Point Protocol3.3.3. 使用广播信…

力扣3272.统计好整数的数目

力扣3272.统计好整数的数目 贪心 枚举所有回文数&#xff0c;再找不重复的排列组合 因为是个回文数&#xff0c;所有只找左半边即可 最终排列组合的个数为上式 class Solution {public:long long countGoodIntegers(int n, int k) {vector<long long> fac(n1);fa…

Nuxt 项目实战 - 15:自定义unocss规则,让编写样式更高效

与UI设计师约定颜色命名规则 配置color变量 color.scss $colors: ((#ffffff,#f8f8f8,#ebebeb,#dbdbdb,#cccccc,#999999,#666666,#333333,#000000),(#daf6ef, #b4ecde, #08c193, #228f73, #43d7b2),(#f62f3b, #edc9c9, #f0e2e2, #ffecea, #f78185),(#f2f5f8, #e3e8eb, #c3cace, …

永恒之蓝漏洞复现记录

准备工作 实验环境搭建 下载并安装VMware Workstation软件查看VMware的虚拟网卡和虚拟网络设置安装Windows虚拟机镜像和Kali linux虚拟机镜像 实验目的 掌握Windows网络服务远程渗透攻击基本理论知识。掌握Windows漏洞及漏洞利用方法原理。掌握Windows网络服务远程渗透攻击…

Spring02——bean基础配置、bean实例化——构造方法/静态工厂/实例工厂与FactoryBean、bean的生命周期

IOC相关内容 通过前面两个案例&#xff0c;我们已经学习了bean如何定义配置&#xff0c;DI如何定义配置以及容器对象如何获取的内容&#xff0c;接下来主要是把这三块内容展开进行详细的讲解。 bean基础配置bean实例化——构造方法bean实例化——静态工厂bean实例化-实例工厂…

笔记整理—内核!启动!—uboot部分(3)uboot启动内核传参

uboot会以tag的方式给内核传递参数&#xff0c;tag是一个数据结构&#xff0c;在uboot中与linux_kernel中都有相同的结构。 kernel接收到的传参由若干个tag构成&#xff0c;从tag_start到tag_end之间的数据构成&#xff0c;读到start时开始传参&#xff0c;end结束传参。 CON…

算法专利复现_基于ngboost和SHAP值可解释预测方法

大家好&#xff0c;我是重庆未来之智的Toby老师&#xff0c;最近看到一篇专利&#xff0c;名称是《基于NGBoost和SHAP值的可解释地震动参数概率密度分布预测方法》。该专利申请工日是2021年3月2日。 专利复现 我看了这专利申请文案后&#xff0c;文章整体布局和文字内容结构不错…

算法基础-区间合并

1、按照区间的左端点排序 2、 左端点小于等于ed&#xff0c;只需要更新ed和右端点的最大值 左端点大于ed&#xff0c;存入res中&#xff0c;并更新st和ed&#xff0c;最后一组数据手动插入res public class Main {public static void main(String[] args) {Scanner in new S…

Pinterest账号被封?试试这几种解封方法

Pinterest作为一个充满创意与灵感的视觉社交平台&#xff0c;吸引着大量用户和企业前来展示、收藏和分享他们的作品。然而&#xff0c;如同其他社交媒体平台一样&#xff0c;Pinterest也设立了一套严格的使用规则和监测机制&#xff0c;以保障平台内容的质量和用户的良好体验。…

景联文科技提供运动数据采集服务

运动数据的重要性 运动数据的收集与分析对于提升个人健康管理和运动表现具有重要意义。 通过收集心率、步态、速度等生理和运动参数&#xff0c;不仅可以为运动员提供个性化的训练方案&#xff0c;帮助其优化表现&#xff0c;还能早期发现并预防伤病。对于普通健身者而言&…

MVC架构模式

MVC(ModelView Controller)是软件工程中的一种软件架构模式 &#xff0c;它把软件系统分为模型、 视图和 控制器 三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时…

华为OD机试真题 - 字符成环找偶数O - 滑动窗口(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、…