03 | 微服务反模式与陷阱:代码共享反模式

Look Into Coding:程序员的认知考古学实践 编程不仅是语法与算法的运用,更是一系列隐性认知活动的集合——从需求理解、调试归因到协作决策,都依赖未被显化的思维路径与经验模式。'Look Into Coding'作为一种认知考古方法,聚焦开发者真实行为中的时间粒度、空间导航、语义压缩与社会协作四维结构,帮助识别个体在编码过程中的注意力断点、归因偏差和状态管理焦虑。它不替代技术学习,而是构建可迁移的‘问题-模式-方案’映射能力,广泛应用于工程效能提升、团队知识沉淀与新人培养等场景。本文即以实证视角,拆解如何系统观察并提炼属于自己的编码认知模型。 阅读详情

译者简介:ASCE1885, 《Android 高级进阶》作者。
本文首发于Source Code Chain开发者社区,欢迎使用我的专属邀请链接加入一起交流。

Photo by Finn Hackshaw(https://www.ssyer.com/author/19059)

微服务被称为“无共享”架构,实际上,我更倾向于把它看作是一种“尽可能少共享”的架构,因为微服务之间不可避免的总会存在某种程度的代码共享。例如,与其使用一个负责身份验证和授权的安全服务,你可能会更倾向于将安全功能相关的代码封装为一个 JAR 文件,例如 security.jar,并提供给所有服务使用。如果安全性的保证是在服务内处理的,那么这种方式通常是一个很好的做法,因为它避免了每个请求都需要对安全服务发起远程调用,从而提高了系统的性能和可靠性。

然而,如果这种方式被滥用,那最终你将会碰到依赖的噩梦,如图 3-1 所示,其中每个服务都依赖于多个自定义的共享库。

Figure 3-1. Sharing multiple custom libraries

这种级别的共享不仅打破了服务间的边界上下文,同时也引入了其他一些问题,包括总体可靠性,变更控制,可测试性和可部署性。

依赖过多

让我们回顾一下大多数面向对象软件应用的开发过程,不难发现共享带来的问题,特别是从单体应用架构迁移到微服务架构的时候。在大多数单体应用中,最重要的事情之一就是代码复用和共享。图 3-2 展示了在大多数单体应用架构中都会共享的两种构件(抽象类和公共的工具类)。

Figure 3-2. Sharing inheritance structures and utility classes

虽然创建抽象类和接口是大多数面向对象编程语言的常见实践,但当我们将单体应用中某个模块拆分为微服务时,这种实践会存在问题。自定义的共享类和工具类也存在类似的问题,例如共用的日期,字符串,计算等工具类。对于可能被潜在的数百个服务共享的代码你将作何处理呢?

微服务架构模式的主要目标之一就是尽可能的减少共享,这有助于保证每个服务的边界上下文,从而换来快速的测试和部署能力。使用微服务,所有这些都可以归结为变更控制和依赖关系。服务间依赖越多,想要隔离服务的变化就越困难,从而很难单独对一个服务进行测试和部署。服务间共享越多,依赖也就越多,从而导致了脆弱的系统,它难以测试和部署。

代码共享的技巧

避免这种反模式最好的方法就是服务间不共享代码,但这说起来容易,做起来难。正如我在本文开头实事求是的讲,总会有一些代码需要共享。那么这些代码要怎么放置呢?

图 3-3 展示了解决代码共享问题的四个基本技巧:共享工程,共享函数库,代码复制和服务合并。

Figure 3-3. Module-sharing techniques

共享工程的使用将会在共享工程中的公共源代码和每个服务工程之间形成编译期的绑定。虽然这使得软件开发和改动变得简单,但它是我最不喜欢的共享技巧,因为它在运行时会引入潜在的问题,使得应用程序变得不那么健壮。共享工程技巧的主要问题是沟通和控制,我们很难知道共享模块的变动及其原因,也很难控制我们服务是否需要特定的更改。想象一下,当你正准备发布你的微服务时,却发现有人对共享模块作了重大修改,从而迫使你不得不对服务代码作改动和重新测试,然后才能进行部署。

如果你想要共享代码,更好的方式是使用共享函数库(例如 .NET assembly 或者 JAR 文件)。但这种方式使得开发更加困难,因为任何对共享库中模块的改动,开发人员都必须首先打包函数库,然后重启服务,最后重新测试。然而共享库的优点是我们可以对库进行版本控制,从而更好的控制服务的部署和运行时的行为。如果共享库作了修改和版本化,那么服务的所有者可以决定何时合并该修改到服务中。

微服务架构中常见的第三种技巧是违反 DRY(Don’t Repeat Yourself)原则,它在需要特定功能的所有服务中复制共享模块。虽然这种复制技术有风险,但它避免了依赖共享,并保留了服务的边界上下文。当复制的共享模块需要改动时,尤其是修复某个缺陷时,这种技巧就会出现问题。这种情况下,所有服务都要进行修改。因此这种技巧只对非常稳定的,几乎不会再改动的共享模块有用。

有时可能使用的第四种技巧是服务合并。假设两个或三个服务共享一部分相同的代码,而这些公共模块需要经常改动。由于这几个服务在公共模块改动时也都要跟着测试和部署,所以你可以把这些服务和公共模块整合到一个服务中,从而移除依赖的库。

关于共享库的一个建议是避免把所有共享的代码合并成单一的共享库,例如 common.jar。使用 common.jar 你很难知道你的服务是否需要集成共享代码以及何时使用。更好的方法是把共享库拆分成具有独立上下文的多个库。例如创建基于上下文的 security.jar,persistence.jar 和 dateutils.jar 等。这能够把不经常改变的代码和频繁改动的代码分离开,从而更容易认清每次更改的上下文,以及决定是否要立即把更改的内容集成到我们的服务中。

Go微服务AI编程工具实测:Claude Code、Codex、Qoder、Trae四大工具深度对比 AI编程工具正从通用代码生成迈向垂直领域深度适配,尤其在强类型、高并发、模块化依赖的Go后端开发中,其对go.mod解析、goroutine语义理解、生态惯例学习等能力,直接决定生成代码能否安全落地。本文基于真实微服务场景(gin+gorm+grpc-gateway),聚焦Go泛型推导、HTTP中间件生成、SQL注入防护、私有模块replace识别、pprof火焰图定位五大硬指标,系统评测Claude Code、Codex、Qoder、Trae的技术路径差异与工程适用边界——不谈概念 hype,只看编译是否 阅读详情

相关推荐

实时运筹优化:城市交通AI调度的工程化落地实践

实时运筹优化(Real-time Combinatorial Optimization)是支撑高并发、低延迟城市服务系统的核心范式,其本质是在动态约束下对百万级资源进行毫秒级重分配。它融合多源异构数据融合与边缘-云协同推理,将GPS漂移校准、语义意图解析、行为模式蒸馏等数据提纯工艺转化为可执行决策。该技术不仅提升订单履约率与司机收入,更在动态定价、ETA预估、疲劳干预等关键场景中实现业务指标量化增长。本文以Uber生产级调度系统为蓝本,详解从分层优化架构、分钟级模型进化到区域化治理的全链路工程实践。

weixin_30904593的博客 413

03-微服务架构及解决方案

微服务简介 背景分析 讲微服务之前,我们先分析以下单体应用。所谓单体应用一般是基于idea/eclipse,maven等建一个工程,然后基于SpringBoot,spring,mybatis框架进行整合,接下来再写一堆dao、mapper、service、controller,再加上一些的配置文件,有可能还会引入redis、elasticsearch、mq等其它项目的依赖,开发好之后再将项目打包成一个jar包/war包。然后再将包扔到类似tomcat这样的web服务中,最后部署到公司提供给你的linux

空城的博客 1136

AI Agent Runtime 架构解析:事件日志、无状态执行与沙箱隔离

AI agent 不是智能对话的终点,而是复杂系统工程的起点。当大模型能力趋于同质化,真正决定落地成败的是 runtime 层——即 agent 的会话生命周期管理、工具执行可靠性与安全边界控制。本文聚焦 session-as-event-log(持久化事件日志)、harness-as-stateless-executor(无状态执行器)和 sandbox-as-cattle(牲畜式沙箱)三大核心范式,揭示其如何从原理上解决上下文溢出、凭证泄露、状态丢失等生产级痛点。这些设计脱胎于分布式系统十年演进经验,已

weixin_34216196的博客 381

【开发规范】go项目开发中的[流程,git,代码,目录,微服务仓库管理,静态检查]

【开发规范】go项目开发中的[流程,git,代码,目录,微服务仓库管理,静态检查(govet,golangci-lint)]

Jzin的博客 1564

SQL性能优化实战:从执行计划到索引失效的工程指南

SQL性能优化本质是数据库执行计划的工程调控,核心在于理解IO、CPU与内存三大成本维度如何被WHERE条件、JOIN顺序、函数使用等操作影响。覆盖索引、索引失效、执行计划解读(EXPLAIN/ANALYZE)是高频搜索关键词,也是生产环境慢查询治理的起点。本文以MySQL、PostgreSQL等主流数据库为背景,解析SELECT *、NOT条件、函数包裹列等七类高危反模式,揭示‘能跑通’与‘跑得稳’之间的技术鸿沟——所有优化都服务于一个目标:让数据库用最少磁盘IO、最低内存开销、最短路径完成数据定位。适用

weixin_34315485的博客 429

程序员的思维操作系统:用programming.log实现技术思考留痕

编程日志(programming log)是一种面向工程师认知成长的轻量级知识管理实践,其本质是将碎片化、非线性的代码思考过程结构化为可追溯、可复盘、可迭代的文本记录。它基于纯文本+Git的极简技术栈,强调问题推演与证伪逻辑,而非结论堆砌;通过时间线主干结构和手动索引,规避分类强迫症,强化每日复盘习惯。相比通用笔记工具,它更聚焦‘技术判断力’的肌肉记忆训练——每一次git commit都是对思考质量的交付验收。典型应用场景包括调试溯源、API设计反思、性能临界点突破与技术债量化评估。作为程序员的外部缓存硬盘

天下无双 414

Java系列技术之SpringBoot基础

SpringBoot基础篇主要是带着大家把前面学习过的Spring,SpringMVC...框架整合到一起做一下JavaWeb项目,学习完后能掌握SpringBoot的核心基础内容,为后面微服务架构开发打基础!

Docker容器化原理与生产实践:从交付确定性到安全高效运行

容器技术本质是解决软件交付中的环境不确定性问题,其核心在于通过Linux内核的namespaces和cgroups实现进程级隔离与资源约束,形成可复现、可验证、不可变的运行单元。相比虚拟机的硬件模拟和配置管理工具的操作编排,容器以分层镜像为载体,提供秒级启动、内存共享复用和内容寻址哈希保障的确定性交付能力。这种机制天然支撑CI/CD流水线、多环境一致性部署及云原生安全基线管控,广泛应用于微服务治理、AI模型服务化、金融等保加固等对稳定性与合规性要求严苛的场景。本文深入解析Docker镜像分层、运行时演进与生

记录技术点点之路 617

微服务实战(三):代码生成和公共模块

*** 自定义异常处理器*/@Slf4jlog.error("[业务异常]{}", e);} else {log.error("[系统异常]{}", e);return JsonData.buildError("全局异常,未知错误");

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 2563

技术复盘:如何从失败项目中萃取价值并建立个人知识体系

在软件工程实践中,项目复盘是提升技术决策能力与工程素养的关键环节。其核心原理在于通过系统化分析,将实践经验转化为结构化知识,避免重复踩坑。从技术价值看,有效的复盘不仅能优化个人问题诊断与架构设计能力,还能沉淀团队风险防控经验。尤其在微服务架构、高并发场景下,对性能瓶颈、技术选型失误的深度剖析,能直接提升系统稳定性和可维护性。本文聚焦于如何通过五步复盘法,将‘练废了’的项目转化为包含架构设计、代码规范、决策逻辑的宝贵资产,为开发者构建可复用的避错知识库。

weixin_34367257的博客 448

微服务架构下的共享代码组织实践

随着微服务架构的普及和应用,有效地组织和管理共享代码成为开发团队面临的挑战之一。合理的代码组织可以提高代码的可维护性、可扩展性和可重用性,从而加快开发速度并降低系统的复杂性。在本文中,我们将讨论一些微服务架构下的共享代码组织实践,并提供相应的源代码示例。通过模块化、代码库和依赖管理、API和契约设计、版本管理以及文档和示例代码等实践,我们可以有效地组织和管理共享代码,并促进团队的协作和开发效率。通过编写清晰的文档和提供示例代码,可以帮助开发人员更好地理解和使用共享代码,减少误用和错误。

YtCompiler的博客 244

.NET程序员的专业底线:从代码规范到性能陷阱的实战指南

在.NET开发中,专业性远不止于掌握C#语法或框架API,而是对设计原则、异常处理、内存管理与线程安全等底层机制的系统性理解。DRY、YAGNI、SHY等原则并非抽象教条,而是规避重复逻辑、过度设计和职责错位的关键生存指南;而`async/await`、`Span<T>`、`ConcurrentDictionary`等现代特性,只有结合反射缓存、字符串拼接优化、锁粒度控制等工程实践,才能真正释放性能价值。本文聚焦.NET开发者高频踩坑场景——如裸用`Exception`、误用`ConfigurationMa

a6t2007的博客 467

微服务架构源码

springColud微服务架构的源码,导入项目,Maven更新jar包,直接可用,新手可用来学习

数据库数据类型:不是标签,而是运行时契约与性能内核

数据类型是数据库执行SQL的底层运行时契约,决定存储布局、比较逻辑、索引行为和计算精度。它远不止语法标识,而是直接影响查询性能、数据一致性和跨库兼容性的核心机制。例如DECIMAL保障金融级精确运算,TIMESTAMPTZ实现时区安全的时间处理,UUID解决分布式ID冲突——这些选择直接受限于类型在MySQL、PostgreSQL等引擎中的物理实现差异。理解类型背后的二进制表示、CPU指令适配与索引结构支持,是构建高可靠、高性能数据系统的前提。本文深入剖析数值、字符串、日期及JSON/UUID等关键类型的原

weixin_30770783的博客 313

微服务代码共享问题

代码共享是个经常遇到的问题,DRY原则要求尽可能的共享复用代码,但复用就意味着依赖,如果复用代码修改可能会导致你的模块出现问题。是否能处理好代码共享问题是衡量一个开发人员是否合格的指标之一。没有意识复用代码,不恰当复用代码导致不必要的依赖都在现在的项目中也经常遇到。作为技术管理者或有经验的老员工有必要指导新人做好代码复用,作为用不好的新人,要虚心学习提升自己。共享工程、共享jar、代码复制或重造轮子、合并工程是常见共享处理方法。微服务被称为“无共享”架构,实际上,我更倾向于把它看作是一种“尽可能少共享”的架构,因为微服务之间不可避免的总会存在某种程度的代码共享。例如,与其使用一个负责身份验证和

【脑电分析系列】第15篇:脑电功能连接性与脑网络分析(二):Granger因果性、图论指标与复杂网络构建

摘要: 本文深入探讨了脑电(EEG)分析中的高阶连接性方法——有效连接(Effective Connectivity),重点介绍了Granger因果性(Granger Causality, GC)的原理与应用。GC通过统计预测揭示脑区间信息流动方向,超越了传统功能连接的同步性分析。文章还结合图论指标(如度、路径长度、聚类系数和模块化)量化脑网络的拓扑结构,并通过Python代码(MNE和NetworkX库)演示了从EEG数据构建、分析复杂脑网络的完整流程。该研究为理解大脑动态互动、认知任务信息流及神经系统疾

qq_32516809的博客 1561

程序员成长三阶:做人、做技术人员、做程序员

程序员成长并非单纯提升编码技能,而是一个从职业素养(做人)到专业深度(做技术人员)再到工程直觉(做程序员)的系统性演进过程。其核心原理在于认知结构的网状螺旋上升,而非线性知识堆砌;技术价值体现在可迁移的认知资产——如问题拆解框架、失效边界意识与降级路径设计;典型应用场景包括Code Review文化重构、中间件管道深度诊断、.NET架构渐进式迁移等。本文以.NET生态为实践场域,深入解析‘人-技-程’三阶模型如何支撑真实工程决策,尤其聚焦CLR底层机制、ASP.NET Core运行时本质及高并发场景下的战地

452

CTP Python API及Demo(利用Swig 封装)Windows版(6.6.1traderapi)

环境:visual studio2015、python3.9、 参考的是景色大神的教程自己制作,因为直接用它编译好的无法使用,遂自己编译。 从CTP官网上下载CTP API点击下载。这里用的版本是v6.6.1_P1_tradeapi,想使用不同的版本下载即可: 安装Swig软件,本文中所用的Swig是swigwin-4.0.2版本,点击下载。下载后解压,将swig路径添加到环境变量中。 安装python,注意要安装64位版本,将环境变量配置好。本文所用的是3.9版本。 通过Swig得到pyth.

ProgramVAE的博客 2543

为什么92%的AISMM高分组织仍卡在L3?深度解剖架构刚性与模型柔性的5大冲突点

破解AISMM高分组织停滞L3困局,聚焦AISMM模型与组织架构适配难题。深度剖析架构刚性与模型柔性在目标对齐、流程嵌套、角色定义、度量协同、演进节奏上的5大冲突点,提供可落地的适配诊断框架与渐进式改造路径,适用于数字化转型中后期企业。值得收藏。

simcode的专栏 247

MATLAB安装

Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg   Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_win64.part2.rar两部分安装文件和Matlab 2016a Win64 Crack破解文件。 2、解压安装文件(解...

qq_36734094的博客 17万+

AI编程提效真相:20-30%交付提升背后的四大红线与五步工作流

AI编程助手并非万能加速器,其本质是放大开发者既有能力的杠杆工具。从软件工程底层看,开发瓶颈主要在需求澄清、调试定位与跨团队对齐等非编码环节,而非‘写代码’本身;AI仅高效解决‘已知问题的已知解法’,却难以参与问题定义与架构权衡。实践中,真实提效集中在20–30%区间,但伴随调试耗时上升、隐性风险增加等代价。因此,必须通过标准化输入、生成-验证-精炼循环、AI免疫型审查、贡献度可视化及定期人工回归等机制,将AI深度嵌入人机共生工作流。本文基于金融、医疗、IoT产线实测数据,聚焦AI coding agent

aizexi2652的博客 418

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1767
上一篇: 01 | 小而美的日志框架 timber(上)核心原理
下一篇: 03 | 微服务反模式与缺陷:代码共享反模式
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值