Skip to content
清晨的一缕阳光
返回

微服务架构设计实战

微服务架构设计实战

一、架构演进

1.1 演进路线

单体架构 → 垂直拆分 → SOA → 微服务 → 云原生
阶段特点适用场景
单体架构所有功能在一个应用初创期,快速迭代
垂直拆分按业务拆分为多个应用业务增长,团队扩张
SOA服务总线 (ESB) 集成企业级系统集成
微服务轻量级通信,去中心化高并发,快速交付
云原生容器化,服务网格弹性伸缩,DevOps

1.2 微服务特征

mindmap
  root((微服务特征))
    单一职责
      每个服务只做好一件事
    独立部署
      服务可独立发布上线
    去中心化
      技术栈数据库独立
    轻量通信
      RESTful API/RPC/消息

二、服务拆分

2.1 拆分原则

mindmap
  root((DDD 领域驱动设计))
    战略设计
      限界上下文 Bounded Context
      子域划分
        核心域
        支撑域
        通用域
      上下文映射 Context Map
    战术设计
      实体 Entity
      值对象 Value Object
      聚合根 Aggregate Root
      领域服务 Domain Service

2.2 拆分策略

策略说明示例
按业务领域根据业务功能划分用户服务、订单服务、支付服务
按数据读写读写分离、CQRS订单查询服务、订单写入服务
按并发量高并发服务独立秒杀服务独立部署
按变更频率频繁变更的服务独立营销活动服务

2.3 服务依赖

graph TD
    A[API Gateway] --> B[用户服务]
    A --> C[订单服务]
    A --> D[商品服务]
    C --> B
    C --> D
    C --> E[支付服务]
    E --> F[消息服务]

三、服务治理

3.1 服务注册与发现

graph LR
    Provider[服务提供者] --> Nacos[Nacos 注册中心]
    Consumer[服务消费者] --> Nacos
# Nacos 配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacos:8848
        namespace: dev
        group: DEFAULT_GROUP

3.2 负载均衡

// Ribbon 配置
@Configuration
public class RibbonConfig {
    @Bean
    public IRule loadBalanceRule() {
        return new WeightedResponseTimeRule(); // 响应时间加权
    }
}
策略说明
轮询依次分配请求
随机随机选择服务
加权响应时间响应越快权重越高
最少连接数优先选择连接数少的

3.3 熔断降级

@SentinelResource(
    value = "getUser",
    blockHandler = "handleBlock",      // 限流处理
    fallback = "handleFallback",        // 降级处理
    exceptionsToIgnore = {NullPointerException.class}
)
public User getUser(Long id) {
    return userClient.getUser(id);
}

3.4 配置中心

graph LR
    Config[配置中心 Apollo/Nacos] -->|推送 | App[服务实例]
    App --> Cache[本地缓存]
    Cache --> Refresh[动态刷新]

四、分布式事务

4.1 CAP 理论

graph TB
    CAP[CAP 理论]
    CAP --> C[一致性<br/>Consistency]
    CAP --> A[可用性<br/>Availability]
    CAP --> P[分区容错性<br/>Partition tolerance]
    CAP -.最多满足两项.-> CAP

4.2 解决方案

方案一致性性能适用场景
2PC强一致金融交易
TCC最终一致订单支付
本地消息表最终一致异步场景
Saga最终一致长流程
Seata可配置通用场景

4.3 Seata 实战

@GlobalTransactional
public void createOrder(Order order) {
    // 1. 扣减库存
    inventoryClient.deduct(order.getSkuId(), order.getCount());
    
    // 2. 扣减余额
    accountClient.deduct(order.getUserId(), order.getAmount());
    
    // 3. 创建订单
    orderMapper.insert(order);
}

五、API 网关

5.1 核心功能

graph TB
    Req[请求] --> GW[网关]
    GW --> Auth[认证鉴权]
    GW --> Limit[限流熔断]
    GW --> Log[日志监控]
    GW --> Route[路由转发]
    GW --> Svc[服务]

六、可观测性

6.1 链路追踪

sequenceDiagram
    participant U as 用户请求
    participant G as Gateway
    participant O as Order
    participant US as User
    participant DB as DB
    
    U->>G: TraceID
    G->>O: Span1
    O->>US: Span2
    US->>DB: Span3

请求 → 网关 → 服务 ↓ 认证鉴权 限流熔断 日志监控 路由转发


### 5.2 Spring Cloud Gateway

```yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
            - RequestRateLimiter=10, 20  # 令牌桶限流

六、可观测性

6.1 链路追踪

用户请求 → Gateway → Order → User → DB
   ↓        ↓         ↓       ↓
 TraceID  Span1     Span2   Span3
<!-- SkyWalking 集成 -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-agent</artifactId>
</dependency>

6.2 日志聚合

graph LR
    App[App] --> FB[Filebeat]
    FB --> K[Kafka]
    K --> LS[Logstash]
    LS --> ES[Elasticsearch]
    ES --> KB[Kibana]

6.3 监控告警

graph TB
    P[Prometheus<br/>指标采集] --> G[Grafana<br/>可视化]
    G --> A[AlertManager<br/>告警通知]

七、最佳实践

7.1 服务设计

7.2 数据库设计

7.3 安全设计

总结

微服务架构设计要点:

  1. 合理拆分:DDD 领域驱动,单一职责
  2. 服务治理:注册发现、负载均衡、熔断降级
  3. 数据一致:根据场景选择事务方案
  4. 可观测性:链路追踪、日志聚合、监控告警
  5. 持续演进:架构不是一蹴而就,需要持续优化

微服务不是银弹,适合的才是最好的


分享这篇文章到:

上一篇文章
Go 并发编程核心机制
下一篇文章
Redis 性能调优实战