微服务又被泼“过去十年最大的架构错误”冷水了!

Spring Cloud微服务间调用401?手把手教你用Feign拦截器传递OAuth2 Token 本文针对Spring Cloud微服务间调用常见的401未授权错误,深度解析了问题根源在于OAuth2 Token在Feign调用中无法自动传递。文章提供了通过自定义Feign RequestInterceptor拦截器,从SecurityContextHolder中提取并传递JWT Token的完整解决方案,并探讨了异步调用、客户端凭证模式等进阶场景的处理方法,帮助开发者构建健壮的微服务安全调用链路。 阅读详情

自微服务这个概念诞生以来,就伴随着诸多热议。人们要么爱它,要么恨它,似乎没有什么中间地带。

在微服务如日中天的几年中,很多公司都尝试进行了微服务转型。彼时,微服务架构提供了一种新颖的重构现有系统的方法,并以提供模块化、可扩展性、可用性的能力成为软件开发行业的新宠。

但任何一种架构都不会是适配所有问题的万能钥匙,微服务也不例外。近年来,一些公司放弃微服务实践、选择退回单体架构的消息也不时出现在大众视野。不久前,GitHub前CTO Jason Warner更是直接在推特上表示,“我确信过去十年中,最大的架构错误之一就是全面使用微服务。”一时掀起涟漪无数。

我们知道,微服务不会适用于所有公司,但无论是选择它还是放弃它,其背后的根由依旧值得深思。

1、为什么我们选择微服务

2003年左右,诸如DDD和EIP之类的软件设计开始流行,一些团队尝试将应用程序开发为模块化服务,但传统的基础结构对模块化部署并不友好。而随着云计算的发展,云托管的普及,像Heroku这样的平台又为模块化部署提供了便利。这也为微服务打造细粒度和可重用的功能提供了可能性。

传统的单体架构优缺点都很鲜明,优势在于早期开发简单,易于对程序做重大更改,但随着业务发展也会逐渐暴露出开发效率低下,伸缩性差,缺乏故障隔离等问题,沦为“单体地狱”。

微服务的出现则提供了一种架构思维上的新解:将其中服务按照业务域分为多个块,相应地,代码可以被分解成更小的部分,可以独立地开发、测试、部署和更新。它提供了复杂应用程序的持续交付,使应用程序更易于理解,开发,测试,并且对架构侵蚀更具弹性。尤其在开发大型应用程序时,这种优势会愈发突出。

在微服务相关的推荐文章中,对微服务的褒奖大体可归因为以下几种:

  • 保证服务的可伸缩性:由于每个服务都是独立的组件,因此可以使用更多容器部署扩展,从而实现更有效的容量规划。

  • 降低耦合简化了团队协作:单一用途设计意味着它们可以由较小的团队构建和维护。每个团队可以是跨职能的,同时也可以专注于解决方案中的一个微服务子集。

  • 改善了故障隔离:在微服务架构中,如果单个模块受到影响,则可以轻松拆卸或解决,而不会影响应用程序的其他部分。

  • 易于修改技术堆栈:通过微服务,软件开发公司可以在特定组件上尝试新的堆栈或最新技术。由于没有依赖性问题,软件开发人员可以避免使用特定的技术堆栈。大数据世界中的各种技术,包括开源社区,在微服务架构中都能很好地工作。

  • 提升开发效率提高生产力:不同的团队同时处理不同的组件,而无需等待一个团队完成任务。从而提升工作效率,加快产品发布速度。

可以肯定的是,以微服务架构搭建的系统提供了大量的好处,比如独立部署、强大的子系统边界、保障了技术多样性等等,这也是微服务架构一度为众多公司所青睐的原因。不过,凡事一体两面,微服务架构同样有其弊端。

3、我们需要的不是微服务,而是模块

微服务在解决了很多单体架构的痼疾后也带来了其他挑战。我们可以列举其中几个:

首先,判断是不是适合微服务化,也要看具体的业务场景。如果只是为了拆分而拆分,那无疑没有意义。而且微服务在设计上也更为复杂,比如,拆成几个微服务?新需求来了,是新建一个微服务还是在老系统上改造?都需要综合考量。可以说,一个设计糟糕的微服务架构比一个设计糟糕的单体架构要麻烦得多。

其次,提高了开发的技术门槛。鉴于微服务是一个分布式系统,它也带来了开发分布式应用程序相关的复杂性的代价,比如独立的数据模型、微服务之间的弹性通信、最终一致性和操作复杂性等。开发和运行大规模的分布式服务并非易事。随着企业发展而拥有的分布式系统,引入数十个微服务进行推理已经很难了,更不用说数百个各有风险的微服务。

再者,增加了运维的复杂性。某种程度上,微服务所提供的敏捷性和开发效率是以增加操作复杂性为代价的。服务被拆成了多个微服务,每个微服务又会部署很多套,人肉运维显然就不合适了。另外,所有服务可能都需要群集以实现故障转移和弹性。你的系统可能具有数十个单独的组件,并且在添加新功能时,它将变得越来越复杂。

在稍稍权衡了微服务的褒贬两面时,我们需要重新审视的是,当谈起微服务时,我们看重的到底是什么;当我们选择微服务时,我们关注的核心到底是什么。

其实,在上文中列举的关于微服务的优点中,稍加留心就可以发现,其中大半论点都折射出了一个共同的主题:创建和维护小的、独立的代码和数据“块”的想法,它们彼此分开,使用公共的输入和输出来实现更大的系统集成。所有都指向了微服务的本质关键词——模块。

太阳底下无新事。

自20世纪70年代以来,“模块”这个概念一直是大多数编程语言的核心。CLR (c#, f#, Visual Basic…)上的“程序集”,JVM (Java, Kotlin, Clojure, Scala, Groovy…)上的“jar”或“包”,或者操作系统的动态链接库(Windows上的dll, sos或*nixes上的dll,当然macOS有隐藏在/Library目录中的“框架”)。不管形式如何,在概念层面上,它们都是模块。它们都有不同的内部格式,但都有相同的基本目的:可以重用的,独立被构建、被管理、被部署的代码单元。

来自David Parnas的论文《关于将系统分解为模块的标准》写于1971年,其中定义良好的“独立的、不同的程序模块”涵盖了微服务本质上的多数优点。可以说,对于系统“模块化”的追求已经有半个世纪的悠久历史。那么微服务又为何会引来诸多追捧呢?因为微服务与其说是解决了技术的问题,更多的是解决了人的问题,其关键词不是服务,也不是分布式系统,而是组织清晰度。

3、是架构问题,更是“人”的问题

如果你做过微服务相关工作的话,那么可能听说过“康威定律”。这是Melvin Conway在1967年提出的一个观点,大致意思是一个组织的系统通常被设计成这个组织沟通结构的副本。

organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations.

— M. Conway

简言之,你想要什么样的系统设计,就架构什么样的团队。解决方案是是围绕团队结构(和团队通信开销)进行“优化”的,而不一定是为了解决特定的技术或性能问题。最好通过业务来划分团队,如此一来,能让团队自然的自治自洽,明确业务边界会减少跨界的沟通成本,每个小团队都对自己的模块的整个生命周期负责,权责明确,没有无效的扯皮推诿踢皮球。

微服务可以说会在一定程度上倒逼组织结构。通常IT公司的岗位会划分为产品、开发、测试、运维等等,有些公司甚至会划分成不同部门。一个需求从开发到上线,会在不同部门间不断流转,而微服务化往往是为了加速业务响应,减少开发团队所面临的依赖关系。

在微服务架构下,其组织架构也必然要做出相应调整,这个团队要么必须由各种具备不同技能的人员组合而成,要么每个团队成员具备完整的技能(所谓的 "全栈式开发")。同时这个团队也要对一个或多个微服务的迭代和运维负责。当然,康威定律的收益在很大程度上依赖于在哪里划分边界以及这些边界随时间的推移该如何变化。

所以说在尝试微服务之前,首先要考虑清楚的是,是否真的需要减少开发团队所面临的依赖关系,团队对他们正在尝试构建的东西是否有清晰的愿景,以及是否愿意承担可能因此导致的风险。

软件服务公司InVision的技术架构经历了从微服务合并回单体架构的过程,其技术人员Ben Nadel曾如此描述这种抉择的原因:

“多年来,InVision必须要从组织和基础设施方面进行发展。这意味着,在其背后,有一个较老的‘遗留’平台和一个不断发展的‘现代’平台。随着越来越多的团队迁移至‘现代’平台,这些团队之前负责的服务则要移交给剩下的‘遗留’团队。”

遗憾的是,Ben Nadel的团队就是“遗留”团队。“这个团队已经缓慢,但稳定地负责越来越多的服务。这意味着:人数变少了,但是代码仓库变多了,编程语言变多了,数据库变多了,监控仪表盘变多了,错误日志变多了。”

简而言之,康威定律为组织带来的所有收益,随着时间的推移,都变成“遗留”团队的负债。“所以,我们一直在努力‘调整’责任域,让平衡回归康威定律。或者,换句话说,我们在尝试改变服务边界以匹配团队的边界。这意味着,将微服务重新合并为单体架构。”

正因为微服务不只是涉及到技术架构的问题,当它牵涉到“人”的问题时,往往会导致“水能载舟亦能覆舟”的效果。

4、结语

很多公司尝试过微服务转型,有的转型成功,有的中途放弃。原因多种多样,毕竟采用微服务,实际是在转移复杂性,而不是消解复杂性。

如果你的系统不够大,团队成员不同多,现有的技术架构完全可以满足业务需求,那就根本没必要选择微服务。微服务的重点从来不是“微”,而是成为“大小合适”的服务,负责“合适数量”的功能。这里的合适也并非静态标准,它往往取决于团队的技能集、组织状态、投资回报率等多重因素。更重要的是,这也并非是单纯的技术领域的选择,同样是关于“人”和“组织”结构之间的取舍。

从2017年十大技术文件看工程师成长:Vue、微服务与工程化实践 在软件工程领域,技术选型、架构设计与工程化实践是决定项目成败与团队效能的核心。理解技术原理,如前后端分离架构、微服务范式,能帮助团队在复杂系统中做出明智决策。其技术价值在于提升开发效率、保障系统可维护性与可扩展性。这些理念广泛应用于现代Web开发、云原生应用构建等场景。本文通过回顾2017年的关键文件,探讨了在Vue.js崛起、微服务概念火热、前端工程化工具链成熟的背景下,团队如何应对技术选型挑战、进行架构探索,并落地ESLint、Webpack优化、Jenkins Pipeline等提升协作效率与代码质量 阅读详情

相关推荐

STK中的传感器、雷达、发射机、接收机、天线

本文根据STK手册介绍了传感器、雷达、发射机、接收机、天线等对象的基本属性,简略分析了它们的不同之处。

wangyulj的专栏 1万+

微服务主要解决的四大问题以及最大问题

为了实现高可用,高并发,高性能。我们需要面对如下的问题: 客户端如何访问这么多的服务 API 网关 服务与服务之间如何通信 同步通信 HTTP (Apache Http Client) RPC (Dubbo 只支持Java, gRPC) 异步通信 消息队列 (kafka, RabbitMQ, RocketMQ) 这么多的服务如何管理 服务治理 服务注册与发现 基于客户...

qq_41967899的博客 1818

GitHub工业级开源利器:StreamPipes如何简化工业物联网数据分析

Apache StreamPipes是一款GitHub上的工业级开源利器,旨在简化工业物联网数据分析。它通过图形化界面连接各类工业协议数据源,以拖拽方式构建流处理管道,并实现实时可视化,有效降低了数据分析的技术门槛,让业务人员也能自助完成从数据接入到洞察的全流程。

weixin_29279153的博客 195

微服务解决四大问题

**微服务解决四大问题** 客户端如何访问多个服务?? API网关 服务直接如何通讯?? 同步: RPC,HTTP 一步: 消息队列 多个服务如何管理?? 服务治理 服务注册与发现 服务挂了,怎么办???? 重试机制、服务熔断、服务降级、服务限流。。 ...

caoshirou6176的博客 3234

ENVI水体提取流程实践与问题

ENVI水体提取流程实践与问题 卫片解译中,水体属于比较好判别的一类。有水体指数、阈值法、监督分类等一系列方法进行提取,今天介绍利用水体指数和ENVI提取水体的过程。 1.所用数据 Landsat8卫片1景、ENVI5.3。 2.辐射定标与水陆分离 由于要对卫片进行水体指数的计算,因此需要对数据进行辐射定标以及大气校正的预处理。 辐射定标就是将图像的数字量化值(DN)转化为辐射亮度值或者反射率或者表面温度等物理量的处理过程。在工具栏中搜索Radiometric Correction,点开进行辐射定标。

Soul_taker的博客 4万+

PMD相位偏折术实战:如何用Python处理条纹图,让金属外壳的划痕无处遁形

本文详细介绍了PMD相位偏折术在金属外壳划痕检测中的应用,通过Python实现条纹图处理和局部特征增强技术,显著提升微小缺陷的检出率。文章涵盖从四步相移条纹图采集到形状图局部增强的完整流程,特别适合工业质检场景,帮助实现高精度、高效率的自动化检测。

weixin_29291573的博客 511

微服务四大问题

1.客户端如何访问这么多的服务 API网关 2.服务与服务之间如何通信 同步通信 1.HTTP(Apache Http Client) 2.RPC(Dubbo 只支持 Java,Apache Thtift,gPRC) 异步通信 1.消息队列 kafka RabbitMQ RocketMQ 3.这么多服务,如何管理 服务的注册和发现 基于客户端的服务注册与发现 Apache Zookee...

platinum123_123的博客 352

DBeaver 实战:手动配置 PostgreSQL JDBC 驱动的高级技巧

本文详细介绍了在DBeaver中手动配置PostgreSQL JDBC驱动的高级技巧。针对企业内网、多版本数据库兼容等场景,从获取官方驱动文件、创建自定义驱动配置,到使用Maven坐标管理、连接参数调优及解决常见连接问题,提供了完整的实战指南,帮助开发者实现对数据库连接环境的精准掌控。

apple5的专栏 837

微服务的利与弊

微服务

nangongyou_的博客 3081

【RT-DETR实战】RT-DETR实战手记(200):端侧实时目标检测,下一步往哪儿走?

昨天深夜调一个模型部署,在树莓派4B上跑RT-DETR-nano,帧率死活卡在8FPS上不去。量化也做了,算子也优化了,内存对齐也检查了,可就是离实时检测的底线还差一截。盯着终端里跳动的数字,突然意识到——我们可能正在接近当前技术路径的瓶颈。端侧实时目标检测的下一个突破口,恐怕不在现有框架的修修补补里。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 187

《C#零基础入门之百识百例》(七十一)委托介绍 -- 战士升级示例

委托的存在是因为,我们有时候需要将一个函数作为另一个函数的参数,这时就要用的委托(Delegate)机制。委托用关键字`delegate`声明,他实际上定义了一种“函数类型”,明确规定了函数参数类型和返回值类型。

陈言必行 -- Unity游戏开发领域优质博主 2111

过去十年最大的架构错误,微服务又被泼冷水了!

撰稿丨千山自微服务这个概念诞生以来,就伴随着诸多热议。人们要么爱它,要么恨它,似乎没有什么中间地带。在微服务如日中天的几年中,很多公司都尝试进行了微服务转型。彼时,微服务架构提供了一种新颖的重构现有系统的方法,并以提供模块化、可扩展性、可用性的能力成为软件开发行业的新宠。但任何一种架构都不会是适配所有问题的万能钥匙,微服务也不例外。近年来,一些公司放弃微服务实践、选择退回单体架构的消息也不时出现在...

架构师小秘圈 223

HanLP的分词

HanLP的分词

sikh_0529的博客 1万+

关于微服务的黑鸡汤:你玩不了微服务

原文链接:http://blog.christianposta.com/microservices/youre-not-going-to-do-microservices/) 感谢轻元科技首席架构师王昕的翻译 有关微服务的技术在docker火热起来之后也进一步升温。一般来说,IT业界,尤其是工程师们更加关心国外专家的技术文章。但事实上,对于软件项目成功与否来说,往往是企业中人的因素决定...

karamos的专栏 426

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

落地微服务之前,先想想你的团队结构是否合理!

2016-10-18王昕译聊聊架构 有关微服务的技术Docker火热起来之后也进一步升温。一般来说,IT业界,尤其是工程师们更加关心国外专家的技术文章。但事实上,对于软件项目成功与否来说,往往是企业中人的因素决定结果,企业文化因素决定结果,对于微服务架构,则更是如此;因为微服务的分割是从企业业务开始,而不是从软件技术开始。本文由轻元科技首席架构师王昕翻译,如有疑问,欢迎留言讨...

anyizhen6276的博客 175

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java不会微服务_您不会做微服务

java不会微服务 好像我们行业每隔5到10年,尤其是在企业集成或企业应用程序领域,我们被引入了一些新的方法或体系结构样式,这是自切面包以来最好的方法,它将使您的生产率提高10倍,并使您的企业更加敏捷,灵活,能够响应变化,以及CIO愿意花费大量金钱的任何其他手段。 我们已经看到了企业应用程序集成,Web服务,SOA,基于组件的体系结构,ESB等。 今天:微服务 好吧,猜猜是什么:您可能...

danpu0978的博客 263

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

你的 Go 报错信息正在“出卖”你!扒一扒大厂是如何做错误隔离与日志脱敏的

但随着项目的深入,我们开始理解 Go 团队的良苦用心:错误不是被抛出的异常(Exceptions),错误就是普通的值(Values)。今天,我们就来扒开这层遮羞布,看看那些烂大街的 Go 错误处理教程,到底是如何在无形中“出卖”你的。当你跨越微服务之间的鸿沟(比如从数据库层到业务层,或者从订单服务调用认证服务)时,你必须做一个冷酷的“翻译官”:把具体的。如果数据库连接池满了,或者执行的 SQL 语法有误。就算你的错误在返回给用户时做了完美的隔离,如果你在打日志时依然大手大脚,那安全防线同样会崩溃。

TonyBai 594

您不会做微服务

好像我们行业每隔5到10年,尤其是在企业集成或企业应用程序领域,我们被引入了一些新的方法或体系结构样式,这是自切面包以来最好的方法,它将使您的生产率提高10倍,并使您的企业更加敏捷,灵活,能够响应变化,以及CIO愿意花费大量金钱的其他任何东西。 我们已经看到了企业应用程序集成,Web服务,SOA,基于组件的体系结构,ESB等。 今天:微服务 好吧,猜猜是什么:您可能不会正确使用微服务...

danpu0978的博客 152

容器安全给热情高涨的 DevOps 浇了一桶冷水

许多企业致力于打造高速应用和流程化的开发,也就是我们所知的 DevOps,因为他们希望更加动态地响应市场需求。这种拥抱正在推动容器部署成为资源灵活分配的必要工具。然而与以...

Docker的专栏 244

[软件开发]从代码搬运工到架构设计师我的十年成长之路与技术思考

当我开始参与技术选型、并主导一个全新系统的设计时,我才真正触及“架构”的核心。我意识到,架构设计的本质是“决策”,是在众多约束条件下找到最优解的艺术,其最终目标是支撑业务发展,控制技术债务,提升研发效率。此时,我对“架构”的理解,仅仅停留在“要不要分个层”的肤浅层面,认为那不过是资深工程师为了体现复杂性而创造的术语。回首十年,我的成长之路是一个视野不断开阔、责任不断加码的过程:从专注代码实现的“工匠”,到关注系统设计的“工程师”,再到权衡全局的“架构师”,乃至开始影响团队的“技术引领者”。

u010264980的博客 376

OpenAI 模型「失控」入侵全球最大 AI 开源社区,给企业多系统权限管理敲响警钟

无侵入式集成。不重构现有业务系统。目标系统只需开放数据库或 API 接口即可接入,大幅降低实施风险,不打断业务连续性。自动化与实时性。依托集成引擎,HR 中组织/人员一变动,实时触发所有关联系统权限更新。杜绝人工运维的滞后与遗漏。权威安全认证。方案获国家等保测评机构——广东南方信息安全研究院认可与推荐,符合企业级安全合规要求,支持私有化部署,确保数据不出域。灵活扩展。平台具备低代码配置能力,适应不断变化的需求,新系统快速接入,权限策略动态调整。KPaaS集成平台通过集成任务构建跨系统的角色拉取与推送。

JZC_xiaozhong的博客 362

都说 AI 能给研发开外挂,可企业为啥总玩不转?答案来了!

当前流行的AI生成代码和氛围编程存在局限性,AI应作为软件工程的辅助工具而非主导力量。构建统一基础研发平台是AI赋能研发的正确方向……

chen_aotian的博客 634

【大模型RAG生成式AI开发实战】《大模型RAG生成式AI开发实战》_172.[第18章 生产环境部署] RAG系统架构设计:微服务和单体方案

文章摘要(148字) 本文剖析了RAG系统从实验环境到生产部署的架构设计要点:1)生产环境需区分同步查询和异步数据摄取两条链路;2)早期推荐模块化单体架构,通过接口解耦保持扩展性;3)微服务拆分应遵循"演进式架构"原则,按业务压力逐步分离检索/生成等核心模块;4)特别强调向量库需独立部署,避免与业务逻辑争抢资源。文章通过代码对比和架构图,揭示了新手常见误区及工业级解决方案,为RAG系统平稳上线提供实战指南。

296

王者杯 · 当 AI 开始批量生产简历:初级开发者的「防筛」秘籍,老鸟教你加「反编译」buff

这个时代从不缺能写代码的人,缺的是能用代码解决问题的人。当你的简历上,不再是一堆 AI 能生成的技术名词,而是一个个带体温的、真实的、只有人类才能搞定的故事时,别说 AI 筛不掉你,连面试官都会追着问:"啥时候能入职?"

宝码香车的博客 1338

拒绝单机版幻觉:Hermes 如何让 AI 编程从“个人爽文”变成团队基建

先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里动手。之前我看不少人在聊 Codex 和 Claude Code,甚至有人把那些单兵作战的 Agent 框架当成救世主。说实话,这种心态我很理解。自己在本地跑通一个 Demo,看着代码一行行生成,那种“我是赛博朋克”的快感确实上头。但问题在于,一旦你试图把这个流程塞进团队,或者哪怕只是稍微复杂点的企业级项目,你会发现:单机版的流畅,往往是团队协作的噩梦开端。

2601_96189255的博客 414
上一篇: 如何使用Gradle构建一个多模块项目?
下一篇: 微服务架构中的“发件箱模式”你知道吗?
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值