目录
- 零、前言
- 一、绝对统治区:传统的纯单体 Java 应用
- 二、降维打击区:“伪微服务”、私有化部署与“研发兼职运维”
- 毒舌一下:到底什么是“伪微服务”?戳破那些掩耳盗铃的诡辩
- 三、灵活游击区:核心微服务大盘下的“边缘单体服务”
- 四、越界红线:什么时候必须老老实实上“重型监控”?
- 五、结语:看菜吃饭,量体裁衣
- 六、相关
零、前言
在本专栏 《极简模式下单体Java应用的监控落地思路》 中,我们展示了一系列“不用额外部署、不花一分钱运维成本”的排障黑科技(如 Glowroot、JavaMelody、Script Console、log-viewer 等)。
随着文章的发布,不少读者在后台惊呼过瘾的同时,也抛出了一个极具探讨价值的架构问题:“博主,这套极简体系看起来确实爽,但它是不是万能的银弹?现实中很多系统是微服务,或者混合架构,这套体系的适用边界到底在哪里?”
这是一个顶级的好问题。高级架构师眼里没有“好坏”,只有“取舍(Trade-off)”和“边界”。今天,我们就来扯下各种技术概念的包装,根据真实的机器规模、业务形态和团队现状,聊聊这套“极简监控”到底在哪些场景下是降维打击,又在哪些场景下必须让位给“重型监控”。
为了方便读者快速理解,我们将最终的决策流程图放在这里:
一、绝对统治区:传统的纯单体 Java 应用
这是我们这套极简监控体系最毫无争议的“主阵地”。
- 画像:经典的 Spring Boot
java -jar应用,可能还带着一些定时任务,直接连着数据库和 Redis,调用各种其它SAAS服务,与上下游进行业务串联。 - 痛点:客户要求不高,预算有限,往往缺乏专职运维。
- 为什么是极简?为了保护这样一个占用几百兆内存的应用,去额外申请 3 台 16G 内存的机器部署 SkyWalking OAP 和 ElasticSearch 集群?这在商业逻辑上简直是荒谬的。直接挂上
Glowroot和Actuator,单兵作战,投入产出比(ROI)直接拉满。
二、降维打击区:“伪微服务”、私有化部署与“研发兼职运维”
这是现实中最滑稽,但也最真实的痛点场景。过去几年微服务风气盛行,导致很多根本没必要拆分的系统,被硬生生拆成了十几个微服务进程。更要命的是它所处的交付环境:
- 画像 1(同机同席与微小集群):所谓的微服务,其实全塞在同一台物理机上运行;或者哪怕分开了,整体也就是 3~5 台机器组成的微小集群。
- 画像 2(ToB 客户现场孤岛):应用不是集中部署在公司自己掌控的云端,而是作为私有化交付,分散部署在全国各地、网络相互隔离的客户机房里!
- 画像 3(链路极浅的“假模块”):这类系统还有一个极具讽刺意味的显著特点——调用链路极浅。往往是过了一个 Gateway(网关),就直接打到了最终的胖业务系统。根本不存在互联网大厂那种七八层、网状交叉的深水区 RPC 调用。
- 这也是完美解释了“为什么我们不需要重型链路追踪组件的拓扑图功能”。在大厂(比如阿里、美团),一个请求可能要穿透 7、8 层不同的微服务(网关 -> 聚合层 -> 业务层 -> 基础服务层 -> 数据字典层…),没有图形化的链路瀑布流,人脑根本理不清。
- 但对于这种“过了网关就是底层”的浅链路伪微服务,拓扑关系简单到三岁小孩都能画出来。为了这么浅的链路去部署一套庞大的 OAP 服务端来画拓扑图,纯属自我折磨!
- 痛点(活人微服务,死于搞运维):团队里压根没有专职运维,研发写完代码还得兼职修单子。面对几十个网络隔离的客户现场,如果你要上重型的 SkyWalking + ElasticSearch 集中监控,难道你要在每个客户那儿都额外部署一套吃内存的监控集群?客户连买业务服务器的预算都抠搜,会给你批机器装监控?这在商业实施上纯属痴人说梦!
为什么极简策略在这里是绝对的降维打击?
面对这种“伪微服务 + 现场私有化部署 + 研发兼运维”的绝境,我们的破局核心只有六个字:“监控随制品交付”。我们果断放弃搭建 OAP 服务端和 ES 的幻想,转而采用纯本地化的探针级追踪方案:
- 生态王牌:
SkyWalking-Local拯救伪微服务
诚如专栏前文 《极简模式下JVM监控与链路追踪》 所述,对于依然需要极其强悍的 Trace 链路能力的场景,这是我们的首选!它最大的杀手锏在于:即便砍掉了后端的 OAP,它依然完美保留了原生 SkyWalking 探针的全部功力。背靠其庞大的开源生态,无论你是 Redis、MQ 还是各种生僻中间件,Agent 织入统统开箱即用。在资源极度受限的客户现场,依然能白嫖到最顶级的全链路追踪与 JVM 监控。 - 单兵神器补充:Glowroot 共享二进制
如果你更偏爱极简的一体化 UI,也可以使用 单体Glowroot 方案。在单台客户物理机上放置一份公共的glowroot.jar,通过-Dglowroot.base.dir让各个微服务共享探针但独立配置(DRY原则)。配合 HTTP Header 注入 TraceID 实现人工跨服务串联。出了问题,直接看对应端口的极简 UI。 - 免外网穿透的就地排障:
当现场客户报障时,研发不需要苦哈哈地去搞内网穿透或者 VPN 连服务器敲命令。不管是利用 SkyWalking-Local 打印在业务日志里的 MDC TraceID,还是使用独立工具,你只需要告诉现场的技术支持或客户:“麻烦打开浏览器的http://现场IP:端口/log-viewer,把高亮的那行红字截图给我”。
把所有的监控、日志视图、诊断脚本、链路追踪 Agent 全部内嵌在项目自身的部署包里。不论交付到多么恶劣的现场环境,只要业务系统能跑起来,你的“铁桶防御阵”就已经就地展开。用最土的办法,解决最绝望的交付排障,这才是架构师的生存智慧!
毒舌一下:到底什么是“伪微服务”?戳破那些掩耳盗铃的诡辩
很早之前我就写过一篇吐槽文章 —— 微服务了个寂寞 。
但既然这里再次提到了“伪微服务”,我们有必要在这里给它下一个极其残酷却精准的定义。
真正的微服务是为了解决“团队规模庞大、业务边界极其复杂、需要独立伸缩”而诞生的。而现实中 80% 的中小项目,其所谓的微服务只是一个“分布式的单体应用(Distributed Monolith)”。
“伪微服务”的典型特征如下:
- 强耦合的同机部署:几十个服务,因为甲方没预算,最后全被塞在了一两台 16G 内存的物理机上。你只是把原来在 JVM 堆内的对象方法调用,变成了极其消耗 CPU 和网络带宽的 Localhost HTTP/RPC 调用。
- “一荣俱荣,一损俱损”的启动依赖:服务之间没有服务降级,重启时必须严格按照 A -> B -> C 的顺序启动,挂了一个非核心服务,整个链路全盘崩溃。
面对这些质疑,很多“面向简历编程”的架构师往往会抛出各种极其滑稽的诡辩:
诡辩 1:“虽然我们没做分库分表,但我们把业务模块拆成了十几个独立的服务,这也叫微服务解耦!”
- 无情驳斥:共用同一个底层关系型数据库的微服务,纯属“流氓架构”!
- 你以为你拆分了系统,实际上你只是发明了“全宇宙最昂贵、延迟最高的 SQL JOIN 方式”。原本在单体 JVM 里零点几毫秒就能在内存里或者通过一条 SQL 完成的关联查询,被你硬生生拆成了跨网络的 RPC 调用。
- 更致命的是,底层数据表结构的强耦合丝毫没有解除(A 服务改个表字段,B 服务当场宕机),且整个系统的并发上限依然被那个可怜的单点 MySQL 死死卡住。你不仅没享受到微服务“独立扩容”的红利,反而凭空多出了网络开销、分布式事务失败和海量连接池耗尽的噩梦。这不叫微服务,这叫“带网络延迟的分布式大单体”!
诡辩 2:“我们不是共享一个数据库!为了拆分,我们连本地的 SQLite/H2 都用上了,你看,每个服务都有自己的库!”
- 无情驳斥:微服务提倡“Database per service(每个服务独立数据库)”是为了数据领域自治和解除底层耦合。而你把核心业务全放在一个大 MySQL 里,为了硬凑“多数据源”,强行让几个边缘服务去用 SQLite 这种单机文件型数据库。
- 这不仅没有实现微服务的解耦,反而破坏了云原生架构最基本的“无状态(Stateless)”原则!一旦你的应用需要多节点横向扩容,或者所在的容器飘移了,你写在本地 SQLite 文件里的数据瞬间就成了死局。这种操作不仅没有微服务的命,反而得了微服务的病!
诡辩 3:“我们的代码拆分到了不同的 Git 仓库,这就叫微服务解耦!”
- 无情驳斥:代码拆分不等于架构拆分。如果你一个 5 个人的团队,要去维护 20 个拆碎的微服务仓库,每次发版都要人肉切几十个分支、打包几十个镜像。这不是在拥抱微服务,这是在给自己徒增几十倍的交付和运维成本。
结论:只要你的系统本质上是“高度数据耦合”、“同机物理部署”且“链路极浅”,它就是一头披着微服务外衣的单体巨兽。面对这种怪胎,不要有任何心理负担,果断抛弃庞大的 OAP 监控集群,直接掏出本专栏的极简单体监控武器库(如单进程 Glowroot 共享、SkyWalking-Local),用对付单体应用的招数去降维打击它,这才是能让你活下来并准点下班的唯一真理!
三、灵活游击区:核心微服务大盘下的“边缘单体服务”
在大中型企业中,你往往会面对一种“混合生态”:
- 画像:公司有一个极其核心的交易/订单微服务集群,但也存在着大量由不同部门研发的“边缘服务”(如:部门内部的运营后台、爬虫工具、独立的文件解析服务、跨部门的辅助支撑系统)。
- 痛点:边缘单体服务往往是分阶段构建的,交由不同的小团队自主负责。彼此之间并不进行强制的技术栈统一。如果强行要求这几十个边缘散碎系统全都接入公司核心的重型 APM 集群,不仅沟通改造成本极高,还会产生海量的“垃圾数据”冲垮核心监控集群。
- 极简策略的巧妙应用:核心链路用标准微服务可观测性(SkyWalking OAP/Prometheus)统一纳管;而边缘/辅助服务,强烈建议放权,让它们使用本专栏这套极简体系!
边缘团队自主负责、自给自足。出了 Bug,他们自己看log-viewer,自己开Script Console救火,完全不需要去麻烦中央基础架构团队。这极大地保护了核心团队的专注力,也赋予了边缘团队极高的排障敏捷度。
四、越界红线:什么时候必须老老实实上“重型监控”?
虽然我们一路在吹爆“极简监控”,但如果你遇到了以下场景,请果断收起这套工具箱,老老实实去向老板申请预算,搭建诸如Prometheus + Grafana + ElasticSearch + 集中式 APM的重型舰队:
- 节点规模爆炸(机器数量 > 10台及以上):
极简监控的本质是“分散自治”。如果有 50 个节点,遇到一个偶发问题,你不可能去分别打开 50 个log-viewer网页看日志。此时,你必须需要一个集中的 ES 来汇总日志,需要一个集中的 Grafana 来绘制横跨 50 个节点的宏观大盘。 - 真正的深水区微服务(调用链路 > 3层):
当一个请求进来,需要在 A -> B -> C -> D 四个独立子系统间穿梭,且大量运用了异构语言(Go/Python/Java)和消息队列异步解耦时。单体视角的微操将彻底失效,你必须依赖 SkyWalking 或 OpenTelemetry 的集中式 OAP 服务端来为你自动画出全局拓扑图和跨进程的瀑布流。 - 极高强度的合规与数据留存要求:
如果行业(如金融、医疗)要求所有的系统运行日志和性能指标必须集中归档并至少保留 3 年以上以备审计,那么依赖本地文件和内存滑窗的极简监控显然是无法满足合规底线的。
五、结语:看菜吃饭,量体裁衣
架构的本质不是追新,而是对当下的资源、团队能力和业务场景做最精准的匹配。
- 如果你正在维护着一套庞大的微服务集群,重型可观测性体系是你绕不开的基建;
- 但如果你手里攥着的是单体应用、一台机器上的伪微服务、或者是边缘孤岛系统,请千万不要被大厂的开源宣发洗脑,去搞什么过度设计。
果断用上本专栏里的这套极简兵器库吧!用最少的代码,最零碎的运维成本,打造出让上下游胆寒的防御铁桶,做自己的救世主,开开心心准点下班!
六、相关
- 【极简监控·番外随笔】一个老兵的反思:观察行业十年,我为什么非要死磕“单体极简监控”?
- 【专栏导读】拒绝过度设计!零运维成本打造单体Java应用的“铁桶级”极简监控体系
- 微服务了个寂寞