技术栈完善指南
完整技术栈清单
后端基础
├─ Java/Spring
├─ 数据库(MySQL/PostgreSQL)
└─ Linux/Shell
缓存层 (Redis)
├─ 基础数据类型操作
├─ 高级特性
│ ├─ 缓存策略(LRU/LFU)
│ ├─ 过期策略
│ ├─ 持久化(RDB/AOF)
│ └─ 集群方案(Cluster/Sentinel/Proxy)
├─ 缓存问题解决
│ ├─ 缓存击穿(热key、布隆过滤器)
│ ├─ 缓存穿透(数据库穿透)
│ ├─ 缓存雪崩(多层缓存、随机过期)
│ └─ 缓存一致性(Canal、MQ、延迟双删)
└─ 性能优化
├─ 连接池
├─ 序列化优化
└─ 读写分离
消息队列 (MQ)
├─ Kafka
│ ├─ 高吞吐、大数据场景
│ ├─ 分布式、集群、副本机制
│ ├─ 消费者组、Offset管理
│ └─ 可靠性保证
├─ RabbitMQ
│ ├─ AMQP协议
│ ├─ 交换机、队列、绑定
│ ├─ 路由、延迟队列、死信队列
│ └─ 事务、确认机制
├─ RocketMQ
│ ├─ 高并发、可靠性强
│ ├─ 顺序消息、延迟消息
│ ├─ 事务消息
│ └─ 重试机制
└─ MQ通用问题
├─ 消息可靠性(生产端、消费端、Broker端)
├─ 防重复消费(幂等性、去重表)
├─ 消息堆积处理
│ ├─ 提高消费速率
│ ├─ 增加消费者实例
│ └─ 流量削峰
└─ 异常处理(重试、死信队列、告警)
微服务架构
├─ 服务拆分
│ ├─ 按功能拆分(DDD分层)
│ ├─ 按流量拆分
│ └─ 边界明确、低耦合
├─ 服务注册与发现
│ ├─ Nacos(注册中心+配置中心)✓
│ ├─ Eureka
│ └─ Consul
├─ 远程调用
│ ├─ OpenFeign(声明式调用)✓
│ ├─ RestTemplate
│ └─ gRPC、Dubbo
├─ 负载均衡
│ ├─ Ribbon(客户端)✓
│ ├─ 负载均衡策略(轮询、随机、最少连接)
│ └─ 权重、健康检查
├─ 熔断降级限流
│ ├─ Netflix Hystrix
│ │ ├─ 熔断、降级、限流
│ │ └─ 隔离策略(线程池/信号量)
│ ├─ Alibaba Sentinel ✓
│ │ ├─ 实时监控、可视化控制台
│ │ ├─ 流量控制
│ │ ├─ 熔断降级
│ │ └─ 热点参数限流
│ └─ Resilience4j
├─ 配置中心
│ ├─ Nacos ✓
│ ├─ Apollo
│ └─ Spring Cloud Config + Git
└─ 分布式事务
├─ Seata ✓
│ ├─ AT模式(自动补偿)
│ ├─ TCC模式(强一致性)
│ └─ Saga模式(长事务)
└─ 基于MQ的最终一致性
容器与编排
├─ Docker ✓
│ ├─ 镜像构建
│ ├─ 容器运行
│ ├─ 网络、存储
│ └─ Docker Compose
├─ Kubernetes
│ ├─ 基本概念(Pod、Service、Deployment)
│ ├─ 配置管理(ConfigMap、Secret)
│ ├─ 存储(PV、PVC)
│ ├─ 服务暴露(Ingress)
│ ├─ 自动扩容(HPA、VPA)
│ └─ 监控日志(Prometheus、ELK)
└─ 云原生
├─ Service Mesh(Istio)
├─ Serverless
└─ GitOps
并发与性能
├─ 超卖问题(库存扣减)
│ ├─ 数据库悲观锁
│ ├─ 数据库乐观锁
│ ├─ Redis分布式锁
│ │ ├─ SET NX EX
│ │ ├─ Redisson
│ │ └─ 锁续期(看门狗机制)
│ ├─ 消息队列削峰
│ └─ 库存预热、扣减策略
├─ 高并发场景
│ ├─ 线程池优化
│ ├─ 异步处理(CompletableFuture、Reactor)
│ ├─ 流量削峰(MQ、限流)
│ └─ 缓存加速
└─ 秒杀方案
├─ 前端限流、倒计时
├─ 后端限流(Sentinel)
├─ MQ削峰
├─ Redis库存扣减
└─ 异步处理订单
数据一致性
├─ 缓存与数据库一致性
│ ├─ Canal订阅Binlog
│ ├─ 延迟双删
│ ├─ MQ事件驱动
│ └─ TTL策略
├─ 分布式事务
│ └─ Seata
└─ 消息可靠性
└─ 生产/消费/Broker确认
监控与运维
├─ 日志
│ ├─ ELK Stack
│ ├─ 链路追踪(SkyWalking/Jaeger)
│ └─ 日志聚合
├─ 监控
│ ├─ Prometheus + Grafana
│ ├─ 自定义指标
│ └─ 告警规则
├─ 性能诊断
│ ├─ JVM分析(heap dump、GC logs)
│ ├─ CPU profile
│ └─ 火焰图
└─ 服务健康检查
├─ 心跳机制
└─ 健康端点
开发工具与最佳实践
├─ 版本控制:Git
├─ CI/CD:Jenkins、GitLab CI、GitHub Actions
├─ 代码质量:SonarQube
├─ 压测工具:JMeter、Apache AB、wrk
└─ 编写规范:阿里巴巴Java规范
选型优先级与引入时机
上面的清单是"全景地图",不代表都要上。按项目阶段决定引入顺序,每个中间件都应有明确的问题驱动——先有问题,再引入对应组件:
阶段一:起步期(3 个服务以内,单库够用)
| 引入 |
解决什么问题 |
对应清单条目 |
| Nacos |
服务发现 + 配置集中 |
注册中心 / 配置中心 |
| Redis |
热点数据加速、登录态 |
缓存层-基础操作 |
| Knife4j |
接口文档(见 05-最佳实践组) |
开发工具 |
阶段二:并发与稳定性(出现慢查询、超时、偶发故障)
| 引入 |
解决什么问题 |
| 缓存策略(TTL/随机过期) |
缓存三兄弟:穿透/击穿/雪崩 |
| Sentinel |
限流熔断,防雪崩(原理见 01-微服务 7.5) |
| RabbitMQ |
异步解耦、削峰(对应 02 篇模式 3) |
| SkyWalking |
排查跨服务慢请求 |
阶段三:规模化(多服务多库、数据量大)
| 引入 |
解决什么问题 |
| Seata / 最终一致性方案 |
跨服务数据一致(能不用分布式事务就不用,见 02 篇反模式表) |
| Canal |
缓存一致性自动化(替代手工双删) |
| ES |
复杂搜索、日志检索 |
| Prometheus + Grafana |
指标监控与告警 |
| CI/CD + Docker |
部署效率与一致性(见 09-项目上线组) |
判断"是否该引入"的三个问题
- 现在的问题,不引入能不能忍?——能忍就先不引(复杂度是最贵的成本,呼应 02 篇"用最少复杂度获得核心价值")
- 引入后谁来运维?——没有维护人 = 引入一个未来故障源
- 有没有更轻的替代?——要分布式锁先试数据库乐观锁,要搜索先试 SQL LIKE + 索引
项目分区导航:⬅️ 03-项目完整启动指南 | 04-技术栈完善指南 | ➡️ 00-实战项目
💬 评论