微服务架构已成为构建大型应用的主流选择。本文将介绍微服务架构的核心概念和设计模式。
1. 微服务基础
单体 vs 微服务
# 单体架构
- 所有功能在一个代码库
- 统一部署
- 技术栈统一
- 简单但扩展性差
# 微服务架构
- 按业务拆分服务
- 独立部署
- 技术栈异构
- 复杂但扩展性好
服务拆分原则
- 单一职责:每个服务只负责一个业务领域
- 独立部署:服务可以独立发布
- 团队自治:小团队负责一个服务
- 数据隔离:每个服务拥有独立数据库
2. 服务通信
同步通信
# REST API
GET /api/users/123
POST /api/orders
# gRPC
service OrderService {
rpc CreateOrder(CreateOrderRequest) returns (Order);
rpc GetOrder(GetOrderRequest) returns (Order);
}
异步通信
# 消息队列
# RabbitMQ
# Apache Kafka
# AWS SQS
# 事件驱动架构
# 服务发布事件
# 其他服务订阅事件
3. 数据一致性
分布式事务
# 2PC(两阶段提交)
# 协调者协调多个参与者
# 准备阶段 + 提交阶段
# 3PC(三阶段提交)
# CanCommit + PreCommit + DoCommit
# Saga模式
# 每个服务本地事务
# 失败则执行补偿操作
最终一致性
# 可靠事件模式
1. 服务A完成本地事务
2. 服务A发布事件
3. 服务B消费事件
4. 服务B完成本地事务
# 补偿事务
# 正向操作 + 补偿操作
4. API网关
# Kong配置
services:
- name: user-service
url: http://user-service:8080
routes:
- name: user-route
paths:
- /api/users
# 功能
- 路由转发
- 认证授权
- 限流熔断
- 日志监控
5. 服务发现
# Consul
# 服务注册与发现
# 健康检查
# KV存储
# Eureka
# 客户端发现
# 心跳机制
6. 配置管理
# Spring Cloud Config
# 集中式配置
# 配置热刷新
# Consul KV
# 分布式配置中心
7. 熔断与降级
# Hystrix
@HystrixCommand(fallbackMethod = "fallback")
public String getData() {
return restTemplate.getForObject("http://service/data", String.class);
}
public String fallback() {
return "fallback data";
}
8. 监控与追踪
# 指标监控
# Prometheus + Grafana
# 分布式追踪
# Jaeger
# Zipkin
# 日志聚合
# ELK Stack
# Loki
9. 部署策略
蓝绿部署
# 蓝环境(旧版本)
# 绿环境(新版本)
# 切换流量
金丝雀发布
# 逐步放量
# 1% -> 5% -> 20% -> 100%
# 监控指标,发现问题回滚
10. 最佳实践
- 服务粒度:初期不宜过细
- 数据一致性:根据场景选择方案
- 容错设计:假设服务会失败
- 可观测性:日志、指标、追踪
- 自动化:CI/CD、自动化测试
总结
微服务架构不是银弹。适合大型复杂系统,但会带来分布式系统的复杂性。关键要点:
- 合理拆分:避免过度拆分
- 通信机制:同步+异步结合
- 数据管理:独立数据库,最终一致性
- 运维能力:强大的监控和自动化
📖 进阶学习:学习Service Mesh(Istio、Linkerd)、Serverless架构、以及领域驱动设计(DDD)。