topic: architecture
微服务架构初探
2023 年下半年,公司决定把单体应用拆了。
理由:
- 代码量太大,编译一次 10 分钟
- 团队 20 个人,改代码经常冲突
- 故障影响范围太大,一个模块挂全站挂
我负责其中一个模块的拆分。
为什么是微服务
单体的问题
1 | 用户模块 → 订单模块 → 支付模块 → 通知模块 |
- 编译慢
- 部署风险高
- 扩展困难
- 技术栈绑定
微服务的优势
1 | 用户服务 订单服务 支付服务 通知服务 |
- 独立部署
- 独立扩展
- 技术异构
- 故障隔离
拆分思路
1. 按业务拆分
1 | 用户域:用户、认证、授权 |
2. 数据库拆分
每个服务有自己的数据库:
1 | -- 用户服务 |
3. API 通信
- HTTP/REST:简单,适合同步调用
- gRPC:性能高,适合内部调用
- 消息队列:异步,解耦
1 | # 用户服务(REST) |
服务治理
1. 服务注册与发现
1 | # Nacos / Consul / Eureka |
2. 配置中心
1 | # Apollo / Nacos Config |
3. 熔断限流
1 | from prometheus_client import Counter, Histogram |
4. 网关
1 | # Kong / Spring Cloud Gateway |
遇到的问题
1. 分布式事务
1 | # 场景:下单成功,扣库存失败 |
2. 服务间调用延迟
- 尽量用异步
- 批量操作
- 本地缓存
3. 运维复杂度
- 日志聚合:ELK / Loki
- 链路追踪:Jaeger / SkyWalking
- 监控:Prometheus + Grafana
技术栈
| 角色 | 技术 |
|---|---|
| 网关 | Kong / Spring Cloud Gateway |
| 注册中心 | Nacos |
| 配置中心 | Nacos |
| 熔断 | Sentinel |
| 消息队列 | RabbitMQ / Kafka |
| 数据库 | MySQL + ShardingSphere |
| 缓存 | Redis Cluster |
| 容器 | Docker + K8s |
| CI/CD | GitLab CI |
总结
微服务不是银弹。
优点:
- 独立部署
- 故障隔离
- 技术灵活
缺点:
- 复杂度高
- 运维成本高
- 分布式问题
适合:
- 大团队
- 复杂业务
- 需要快速迭代
目前还在探索中,后续有进展再更新。