5.9.1 电商微服务架构设计

5.9.1 电商微服务架构设计 #

在构建大型电商系统时,合理的架构设计是成功的关键。本节将从业务需求分析开始,逐步设计出一个完整的电商微服务架构。

业务需求分析 #

核心业务功能 #

电商系统的核心业务功能包括:

用户管理

  • 用户注册、登录、认证
  • 用户信息管理
  • 用户权限控制
  • 用户行为追踪

商品管理

  • 商品信息管理
  • 商品分类管理
  • 库存管理
  • 商品搜索

订单管理

  • 购物车管理
  • 订单创建与支付
  • 订单状态跟踪
  • 退款处理

支付管理

  • 多种支付方式支持
  • 支付状态管理
  • 支付安全保障

非功能性需求 #

性能要求

  • 支持高并发访问(10 万+ QPS)
  • 响应时间 < 200ms
  • 99.9% 可用性

扩展性要求

  • 支持水平扩展
  • 支持多地域部署
  • 支持弹性伸缩

安全性要求

  • 数据加密传输
  • 用户隐私保护
  • 防止恶意攻击

领域驱动设计 #

领域划分 #

基于业务分析,我们可以识别出以下核心领域:

// 用户领域 (User Domain)
type UserDomain struct {
    // 用户聚合根
    UserAggregate *UserAggregate
    // 用户仓储
    UserRepository UserRepository
    // 用户领域服务
    UserDomainService UserDomainService
}

// 商品领域 (Product Domain)
type ProductDomain struct {
    // 商品聚合根
    ProductAggregate *ProductAggregate
    // 库存聚合根
    InventoryAggregate *InventoryAggregate
    // 商品仓储
    ProductRepository ProductRepository
}

// 订单领域 (Order Domain)
type OrderDomain struct {
    // 订单聚合根
    OrderAggregate *OrderAggregate
    // 购物车聚合根
    CartAggregate *CartAggregate
    // 订单仓储
    OrderRepository OrderRepository
}

// 支付领域 (Payment Domain)
type PaymentDomain struct {
    // 支付聚合根
    PaymentAggregate *PaymentAggregate
    // 支付仓储
    PaymentRepository PaymentRepository
}

聚合设计 #

用户聚合

// 用户聚合根
type User struct {
    ID          string    `json:"id"`
    Username    string    `json:"username"`
    Email       string    `json:"email"`
    Phone       string    `json:"phone"`
    Profile     Profile   `json:"profile"`
    Status      UserStatus `json:"status"`
    CreatedAt   time.Time `json:"created_at"`
    UpdatedAt   time.Time `json:"updated_at"`

    // 领域事件
    events []DomainEvent
}

type Profile struct {
    FirstName   string `json:"first_name"`
    LastName    string `json:"last_name"`
    Avatar      string `json:"avatar"`
    Birthday    time.Time `json:"birthday"`
    Gender      Gender `json:"gender"`
}

type UserStatus int

const (
    UserStatusActive UserStatus = iota + 1
    UserStatusInactive
    UserStatusSuspended
)

// 用户行为方法
func (u *User) UpdateProfile(profile Profile) error {
    if u.Status != UserStatusActive {
        return errors.New("inactive user cannot update profile")
    }

    u.Profile = profile
    u.UpdatedAt = time.Now()

    // 发布领域事件
    u.addEvent(NewUserProfileUpdatedEvent(u.ID, profile))
    return nil
}

func (u *User) Suspend() error {
    if u.Status == UserStatusSuspended {
        return errors.New("user already suspended")
    }

    u.Status = UserStatusSuspended
    u.UpdatedAt = time.Now()

    u.addEvent(NewUserSuspendedEvent(u.ID))
    return nil
}

商品聚合

// 商品聚合根
type Product struct {
    ID          string      `json:"id"`
    Name        string      `json:"name"`
    Description string      `json:"description"`
    Price       Money       `json:"price"`
    Category    Category    `json:"category"`
    Images      []string    `json:"images"`
    Attributes  []Attribute `json:"attributes"`
    Status      ProductStatus `json:"status"`
    CreatedAt   time.Time   `json:"created_at"`
    UpdatedAt   time.Time   `json:"updated_at"`

    events []DomainEvent
}

type Money struct {
    Amount   int64  `json:"amount"`   // 以分为单位
    Currency string `json:"currency"` // 货币类型
}

type Category struct {
    ID   string `json:"id"`
    Name string `json:"name"`
    Path string `json:"path"` // 分类路径
}

type Attribute struct {
    Name  string `json:"name"`
    Value string `json:"value"`
}

type ProductStatus int

const (
    ProductStatusDraft ProductStatus = iota + 1
    ProductStatusActive
    ProductStatusInactive
    ProductStatusDeleted
)

// 商品行为方法
func (p *Product) UpdatePrice(newPrice Money) error {
    if p.Status != ProductStatusActive {
        return errors.New("cannot update price for inactive product")
    }

    oldPrice := p.Price
    p.Price = newPrice
    p.UpdatedAt = time.Now()

    p.addEvent(NewProductPriceUpdatedEvent(p.ID, oldPrice, newPrice))
    return nil
}

func (p *Product) Activate() error {
    if p.Status == ProductStatusActive {
        return errors.New("product already active")
    }

    p.Status = ProductStatusActive
    p.UpdatedAt = time.Now()

    p.addEvent(NewProductActivatedEvent(p.ID))
    return nil
}

订单聚合

// 订单聚合根
type Order struct {
    ID          string      `json:"id"`
    UserID      string      `json:"user_id"`
    Items       []OrderItem `json:"items"`
    TotalAmount Money       `json:"total_amount"`
    Status      OrderStatus `json:"status"`
    ShippingAddress Address `json:"shipping_address"`
    CreatedAt   time.Time   `json:"created_at"`
    UpdatedAt   time.Time   `json:"updated_at"`

    events []DomainEvent
}

type OrderItem struct {
    ProductID string `json:"product_id"`
    Quantity  int    `json:"quantity"`
    Price     Money  `json:"price"`
    Amount    Money  `json:"amount"`
}

type Address struct {
    Street   string `json:"street"`
    City     string `json:"city"`
    Province string `json:"province"`
    Country  string `json:"country"`
    ZipCode  string `json:"zip_code"`
}

type OrderStatus int

const (
    OrderStatusPending OrderStatus = iota + 1
    OrderStatusPaid
    OrderStatusShipped
    OrderStatusDelivered
    OrderStatusCancelled
    OrderStatusRefunded
)

// 订单行为方法
func (o *Order) Pay() error {
    if o.Status != OrderStatusPending {
        return errors.New("order cannot be paid")
    }

    o.Status = OrderStatusPaid
    o.UpdatedAt = time.Now()

    o.addEvent(NewOrderPaidEvent(o.ID, o.UserID, o.TotalAmount))
    return nil
}

func (o *Order) Ship() error {
    if o.Status != OrderStatusPaid {
        return errors.New("order must be paid before shipping")
    }

    o.Status = OrderStatusShipped
    o.UpdatedAt = time.Now()

    o.addEvent(NewOrderShippedEvent(o.ID, o.UserID))
    return nil
}

func (o *Order) Cancel() error {
    if o.Status != OrderStatusPending {
        return errors.New("order cannot be cancelled")
    }

    o.Status = OrderStatusCancelled
    o.UpdatedAt = time.Now()

    o.addEvent(NewOrderCancelledEvent(o.ID, o.UserID))
    return nil
}

微服务拆分策略 #

服务边界划分 #

基于领域驱动设计,我们将系统拆分为以下微服务:

核心业务服务

  • 用户服务 (User Service):负责用户管理、认证授权
  • 商品服务 (Product Service):负责商品信息管理
  • 库存服务 (Inventory Service):负责库存管理
  • 订单服务 (Order Service):负责订单管理
  • 支付服务 (Payment Service):负责支付处理
  • 购物车服务 (Cart Service):负责购物车管理

支撑服务

  • 通知服务 (Notification Service):负责消息通知
  • 搜索服务 (Search Service):负责商品搜索
  • 推荐服务 (Recommendation Service):负责商品推荐
  • 文件服务 (File Service):负责文件上传下载

基础设施服务

  • 网关服务 (Gateway Service):API 网关
  • 配置服务 (Config Service):配置管理
  • 监控服务 (Monitoring Service):系统监控

服务依赖关系 #

// 服务依赖关系定义
type ServiceDependency struct {
    ServiceName string   `json:"service_name"`
    Dependencies []string `json:"dependencies"`
}

var serviceDependencies = []ServiceDependency{
    {
        ServiceName: "order-service",
        Dependencies: []string{
            "user-service",
            "product-service",
            "inventory-service",
            "payment-service",
        },
    },
    {
        ServiceName: "cart-service",
        Dependencies: []string{
            "user-service",
            "product-service",
        },
    },
    {
        ServiceName: "search-service",
        Dependencies: []string{
            "product-service",
        },
    },
}

系统架构设计 #

整体架构图 #

┌─────────────────────────────────────────────────────────────┐
│                        Client Layer                         │
├─────────────────────────────────────────────────────────────┤
│                     API Gateway                             │
├─────────────────────────────────────────────────────────────┤
│                   Microservices Layer                       │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐      │
│  │   User   │ │ Product  │ │Inventory │ │  Order   │      │
│  │ Service  │ │ Service  │ │ Service  │ │ Service  │      │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘      │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐      │
│  │ Payment  │ │   Cart   │ │  Search  │ │   File   │      │
│  │ Service  │ │ Service  │ │ Service  │ │ Service  │      │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘      │
├─────────────────────────────────────────────────────────────┤
│                   Infrastructure Layer                      │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐      │
│  │ Service  │ │ Message  │ │  Config  │ │   Log    │      │
│  │Discovery │ │  Queue   │ │ Center   │ │ Center   │      │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘      │
├─────────────────────────────────────────────────────────────┤
│                      Data Layer                             │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐      │
│  │   User   │ │ Product  │ │  Order   │ │  Cache   │      │
│  │    DB    │ │    DB    │ │    DB    │ │  Redis   │      │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘      │
└─────────────────────────────────────────────────────────────┘

技术栈选型 #

开发语言与框架

  • Go 1.21+:主要开发语言
  • Gin:Web 框架
  • gRPC:服务间通信
  • GORM:ORM 框架

数据存储

  • PostgreSQL:主数据库
  • Redis:缓存和会话存储
  • Elasticsearch:搜索引擎
  • MongoDB:日志存储

消息队列

  • Apache Kafka:事件流处理
  • RabbitMQ:任务队列

容器化与编排

  • Docker:容器化
  • Kubernetes:容器编排
  • Helm:包管理

监控与日志

  • Prometheus:监控指标
  • Grafana:监控面板
  • Jaeger:分布式追踪
  • ELK Stack:日志分析

服务治理

  • Consul:服务发现
  • Istio:服务网格
  • Envoy:代理

数据一致性策略 #

最终一致性

对于跨服务的数据操作,采用最终一致性模型:

// 事件驱动的最终一致性
type EventHandler interface {
    Handle(event DomainEvent) error
}

// 订单支付成功事件处理器
type OrderPaidEventHandler struct {
    inventoryService InventoryService
    notificationService NotificationService
}

func (h *OrderPaidEventHandler) Handle(event DomainEvent) error {
    orderPaidEvent, ok := event.(*OrderPaidEvent)
    if !ok {
        return errors.New("invalid event type")
    }

    // 减少库存
    if err := h.inventoryService.DecreaseInventory(
        orderPaidEvent.OrderItems,
    ); err != nil {
        return err
    }

    // 发送通知
    if err := h.notificationService.SendOrderConfirmation(
        orderPaidEvent.UserID,
        orderPaidEvent.OrderID,
    ); err != nil {
        // 通知失败不影响主流程
        log.Error("failed to send notification", err)
    }

    return nil
}

分布式事务

对于强一致性要求的场景,使用 Saga 模式:

// Saga 事务管理器
type SagaManager struct {
    steps []SagaStep
}

type SagaStep struct {
    Name         string
    Execute      func() error
    Compensate   func() error
}

func (sm *SagaManager) Execute() error {
    executedSteps := make([]SagaStep, 0)

    for _, step := range sm.steps {
        if err := step.Execute(); err != nil {
            // 执行补偿操作
            for i := len(executedSteps) - 1; i >= 0; i-- {
                if compErr := executedSteps[i].Compensate(); compErr != nil {
                    log.Error("compensation failed", compErr)
                }
            }
            return err
        }
        executedSteps = append(executedSteps, step)
    }

    return nil
}

// 创建订单的 Saga 事务
func CreateOrderSaga(orderData OrderData) *SagaManager {
    return &SagaManager{
        steps: []SagaStep{
            {
                Name: "create_order",
                Execute: func() error {
                    return orderService.CreateOrder(orderData)
                },
                Compensate: func() error {
                    return orderService.CancelOrder(orderData.ID)
                },
            },
            {
                Name: "reserve_inventory",
                Execute: func() error {
                    return inventoryService.ReserveInventory(orderData.Items)
                },
                Compensate: func() error {
                    return inventoryService.ReleaseInventory(orderData.Items)
                },
            },
            {
                Name: "process_payment",
                Execute: func() error {
                    return paymentService.ProcessPayment(orderData.Payment)
                },
                Compensate: func() error {
                    return paymentService.RefundPayment(orderData.Payment.ID)
                },
            },
        },
    }
}

安全架构设计 #

认证与授权 #

JWT 认证

// JWT 服务
type JWTService struct {
    secretKey []byte
    issuer    string
    expiry    time.Duration
}

type Claims struct {
    UserID   string   `json:"user_id"`
    Username string   `json:"username"`
    Roles    []string `json:"roles"`
    jwt.RegisteredClaims
}

func (j *JWTService) GenerateToken(user *User) (string, error) {
    claims := &Claims{
        UserID:   user.ID,
        Username: user.Username,
        Roles:    user.Roles,
        RegisteredClaims: jwt.RegisteredClaims{
            Issuer:    j.issuer,
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(j.expiry)),
            IssuedAt:  jwt.NewNumericDate(time.Now()),
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString(j.secretKey)
}

func (j *JWTService) ValidateToken(tokenString string) (*Claims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
        return j.secretKey, nil
    })

    if err != nil {
        return nil, err
    }

    if claims, ok := token.Claims.(*Claims); ok && token.Valid {
        return claims, nil
    }

    return nil, errors.New("invalid token")
}

RBAC 权限控制

// 权限管理
type Permission struct {
    ID       string `json:"id"`
    Resource string `json:"resource"`
    Action   string `json:"action"`
}

type Role struct {
    ID          string       `json:"id"`
    Name        string       `json:"name"`
    Permissions []Permission `json:"permissions"`
}

type RBACService struct {
    roleRepo       RoleRepository
    permissionRepo PermissionRepository
}

func (r *RBACService) CheckPermission(userID, resource, action string) (bool, error) {
    user, err := r.userRepo.GetByID(userID)
    if err != nil {
        return false, err
    }

    for _, roleName := range user.Roles {
        role, err := r.roleRepo.GetByName(roleName)
        if err != nil {
            continue
        }

        for _, permission := range role.Permissions {
            if permission.Resource == resource && permission.Action == action {
                return true, nil
            }
        }
    }

    return false, nil
}

API 安全 #

请求限流

// 限流中间件
func RateLimitMiddleware(limiter *rate.Limiter) gin.HandlerFunc {
    return func(c *gin.Context) {
        if !limiter.Allow() {
            c.JSON(http.StatusTooManyRequests, gin.H{
                "error": "rate limit exceeded",
            })
            c.Abort()
            return
        }
        c.Next()
    }
}

// 基于用户的限流
type UserRateLimiter struct {
    limiters map[string]*rate.Limiter
    mu       sync.RWMutex
    rate     rate.Limit
    burst    int
}

func NewUserRateLimiter(r rate.Limit, b int) *UserRateLimiter {
    return &UserRateLimiter{
        limiters: make(map[string]*rate.Limiter),
        rate:     r,
        burst:    b,
    }
}

func (u *UserRateLimiter) GetLimiter(userID string) *rate.Limiter {
    u.mu.RLock()
    limiter, exists := u.limiters[userID]
    u.mu.RUnlock()

    if !exists {
        u.mu.Lock()
        limiter = rate.NewLimiter(u.rate, u.burst)
        u.limiters[userID] = limiter
        u.mu.Unlock()
    }

    return limiter
}

通过本节的学习,我们完成了电商微服务系统的整体架构设计。下一节将开始具体实现用户服务。