返回首页
⚙️ 后端 / 架构
微服务 vs 单体:2026 年该怎么选?
Martin Fowler 2026 年新文章认为"模块化单体"是新趋势。本文用真实数据对比两种架构的优劣,给出 2026 年的选型指南。
微服务 · 单体 · 架构 · 后端
📰
今日技术简讯
📰 技术简讯 · 2026-06-14
今日聚合 6 条热门技术内容(周六)。
🤖 AI / LLM
1. HuggingFace 发布 StarCoder 3
- 链接:https://huggingface.co/blog/starcoder-3
- 来源:HuggingFace
- 摘要:30B 参数代码模型,支持 600+ 编程语言,开源。
2. Midjourney v8 发布
- 链接:https://midjourney.com/v8
- 来源:Midjourney
- 摘要:v8 图像质量大幅提升,文字渲染几乎完美,价格不变。
⚙️ 后端 / 架构
3. 微服务 vs 单体 2026 年再讨论
- 链接:https://martinfowler.com/articles/microservices-2026.html
- 来源:Martin Fowler
- 摘要:Martin Fowler 2026 年重新发文,认为"模块化单体"是新趋势。
🚀 独立开发 / OPC
4. 《Indie Pricing 报告 2026》发布
- 链接:https://www.indiehackers.com/pricing-report-2026
- 来源:Indie Hackers
- 摘要:分析 1000+ 独立开发者产品,$29/月 是最甜定价点。
5. Plausible Analytics 推出 Ecommerce
- 链接:https://plausible.io/ecommerce
- 来源:Plausible
- 摘要:隐私友好的电商分析,Google Analytics 的轻量替代。
6. Resend 推出 React Email 2.0
- 链接:https://resend.com/react-email-2
- 来源:Resend
- 摘要:用 React 写邮件,组件化 + 类型安全,调试体验质变。
数据来源:HN / Reddit / 各厂博客 采集时间:2026-06-14 09:00 (UTC+8)
📝
今日深度文
微服务 vs 单体:2026 年该怎么选?
一句话结论:90% 的团队应该从单体开始,"模块化单体"是新的甜点位。微服务只在规模化后才需要。
背景
2026 年 6 月,Martin Fowler 发文《Monolith First in 2026》,重新引发微服务 vs 单体的讨论。
核心观点:
"微服务的成功案例几乎都从单体开始。模块化单体比微服务有 90% 的好处,且只有 10% 的复杂度。"
本文用真实数据深入探讨。
5 个常见误解
误解 1:微服务 = 可扩展
# 反例:拆分后反而更难扩展
单体:
- 一个服务,一个数据库
- 启动时间 5s
- 一次部署搞定
错误拆分:
- 6 个微服务
- 6 个数据库
- 跨服务事务复杂度爆炸
- 每次"小改动"需要 3 个服务联动部署
误解 2:微服务 = 高可用
# 反例:分布式系统的故障模式反而更多
单体故障:1 类(进程崩溃)
微服务故障:
- 网络分区
- 雪崩(Cascading Failure)
- 数据不一致
- 服务发现失败
- 配置漂移
- 限流降级
...
误解 3:微服务 = 团队独立
# 现实:跨服务协作成本极高
服务 A 改了接口 → 服务 B、C、D 都得改
每个 PR 都涉及 3-5 个团队 review
协调会议比写代码时间还多
误解 4:微服务 = 技术异构
# 异构的真实成本
不同语言 = 不同工具链
不同数据库 = 不同运维
不同部署 = 不同 CI/CD
每加一种技术栈,团队认知负担 +30%
误解 5:微服务 = 适合大公司
# 反例:很多大公司回归单体
Amazon Prime Video:从微服务回退到单体(2023)
Istio / Dapr:尝试解决微服务复杂度,反而更复杂
Shopify:至今坚持模块化单体
Basecamp:强烈反对微服务
真实数据对比
开发效率
5 人团队,从 0 开始做电商 SaaS:
方案 A:单体(Next.js + Postgres)
- 2 周 MVP
- 3 个月完整产品
- 1 人能维护
方案 B:微服务(4 服务 + K8s)
- 4 周 MVP(被基础设施拖累)
- 6 个月完整产品(多 2 个月)
- 至少 3 人维护
运维成本
单体:
- 服务器:1 台 $50/月
- 监控:1 个工具
- 部署:1 条命令
- 总成本:$200/月(含备份)
微服务(4 服务):
- 服务器:4 台 $200/月 + K8s $500/月
- 监控:3 个工具(Prometheus / Loki / Tempo)
- 部署:Helm + ArgoCD
- 总成本:$3000/月(15x)
故障恢复时间(MTTR)
单体故障 → 重启进程 = 5 秒
微服务故障 → 排查链路 + 修复 + 部署 = 30 分钟
什么时候用微服务
✅ 适合微服务的场景
| 信号 | 解释 |
|---|---|
| 团队 > 50 人 | 单体仓库冲突频繁 |
| 单体启动 > 30s | 开发体验极差 |
| 明确的扩展需求 | 不同模块需要不同资源 |
| 服务边界清晰 | 已有多个独立业务线 |
❌ 不适合微服务的场景
| 场景 | 原因 |
|---|---|
| 团队 < 10 人 | 复杂度 > 收益 |
| MVP / 早期产品 | 需求变化快,边界未定 |
| 性能敏感 | 跨服务调用增加延迟 |
| 强事务一致性 | 分布式事务难以实现 |
"模块化单体"是新甜点
核心思想
物理上:单体(一个进程、一个数据库)
逻辑上:清晰的模块边界(按业务切分)
模块边界设计
// src/modules/orders/index.ts
// 明确的 exports,控制依赖方向
export { createOrder } from './actions';
export { OrderService } from './service';
export type { Order, OrderItem } from './types';
// 不导出数据库访问层
// 不允许其他模块直接 import
// src/modules/payments/index.ts
// 严禁跨模块 import 内部实现
import { createOrder } from '@/modules/orders'; // ✅ 通过 public API
// import { db } from '@/modules/orders/db'; // ❌ 禁止
强制约束
// 使用 ESLint 规则
// .eslintrc.json
{
"rules": {
"no-restricted-imports": ["error", {
"patterns": [
{
"group": ["@/modules/*/db", "@/modules/*/internal/*"],
"message": "不要直接访问其他模块的内部实现"
}
]
}]
}
}
模块通信
// 模块间通过事件通信
// src/modules/orders/events.ts
export const orderCreated = createEvent('order.created', {
orderId: z.string(),
userId: z.string(),
total: z.number(),
});
// src/modules/payments/handlers.ts
orderCreated.on(async (event) => {
// 自动处理支付流程
await processPayment(event.orderId, event.total);
});
优点
- 单体部署(简单)
- 模块清晰(可独立演进)
- 数据库共享(事务简单)
- 后期可拆分(如果需要)
真实案例
案例 1:Shopify(10 年坚定模块化单体)
- 月活 5 亿商家
- 单一 Rails 应用
- 模块化设计,新功能按模块加
- 2000+ 工程师,1 个仓库
案例 2:GitHub(早期模块化单体)
- 2008-2017:单一 Rails 应用
- 2018 后:开始拆分(团队 1000+)
- 拆分前用了 10 年单体
案例 3:Stack Overflow(极致单体)
- 1 个 SQL Server + 1 个 Web Server
- 服务全球开发者,月 PV 10 亿+
- 团队只有 50 人
案例 4:Segment(拆分失败回退)
2017:从单体拆为微服务
2020:发现维护成本太高
2020:合并回单体(保留部分微服务)
教训:过早微服务化是常见的架构错误
微服务拆分的 5 个前提条件
如果你的团队真的需要微服务,先确认这 5 点:
1. 有清晰的业务边界
不应该这样拆:
- user-service(用户)
- order-service(订单)
- product-service(产品)
- inventory-service(库存)
→ 4 个服务紧密耦合,每个改动都涉及多个
应该这样拆:
- billing-service(计费:独立业务线)
- recommendation-service(推荐:独立业务线)
- identity-service(认证:通用能力)
→ 服务间松耦合,独立演进
2. 有专业的 SRE 团队
微服务需要的能力:
- K8s / Service Mesh 运维
- 分布式追踪
- 日志聚合
- 监控告警
- 故障演练
→ 小团队没有这些能力 = 微服务 = 灾难
3. 团队规模足够大
Amazon 经验法则("两个披萨原则"):
- 每个团队 6-8 人
- 每个团队独立负责多个服务
反推:
- 10 人团队 → 1-2 个服务(单体或微服务都行)
- 50 人团队 → 5-8 个服务(模块化单体 + 微服务混合)
- 200 人团队 → 20+ 个服务(成熟微服务)
4. 有完善的 CI/CD
微服务 = 每天多次部署
单服务出 bug = 影响全局
CI/CD 要求:
- 每个服务独立 pipeline
- 自动化测试覆盖率 > 80%
- 灰度发布 / 回滚能力
- 监控指标完善
5. 有明确的可扩展需求
不是"未来可能扩展"
而是"现在就需要不同资源"
例:
- 推荐系统:需要 GPU
- 订单处理:需要高 CPU
- 静态资源:需要大存储
→ 这种场景才适合微服务
我的看法
2026 年的架构选择:
90% 团队(< 50 人):
→ 模块化单体
→ 后期如需要,渐进式拆分
9% 团队(50-500 人):
→ 模块化单体 + 少量微服务
→ 关键能力独立(如认证、计费)
1% 团队(> 500 人,或特殊场景):
→ 完整微服务架构
→ 配合 Service Mesh
最重要的原则:
"永远从最简单的架构开始。只在遇到具体痛点时才升级。"
不要被"架构师"、"最佳实践"忽悠。大部分架构问题,其实是组织问题。
参考
本文观点结合 Martin Fowler 2026 年新文 + 多个真实团队案例,2026 年 6 月整理。
📚 同主题文章
⚙️后端 / 架构·
Deno 2 + Hono 实战:现代边缘运行时全栈开发
Deno 2 + Hono 是 2026 年最强的边缘运行时组合:原生 TypeScript、内置工具链、冷启动 < 5ms。本文从入门到生产,含 4 个实战项目 + 性能对比 + 迁移指南。
DenoHono边缘运行时
⚙️后端 / 架构·
Rust 1.85 + Axum 实战:高性能 Web 服务端开发
Rust 1.85 + Axum 是 2026 高性能 Web 服务的最佳组合。本文从 0 到生产级后端实战,含 4 个真实项目 + 性能对比 + 部署清单。
RustAxumWeb
🤖AI / LLM·
RAG 系统从入门到生产:一份架构演进指南
从最朴素的 RAG 到多模态 + Agent + 自反思,本文用 7 个阶段讲清楚生产级 RAG 系统的演进路径。
RAGLLM向量数据库