Week 3 · Chapter 1 · 微服务架构设计

复习难度:⭐⭐⭐⭐⭐ | 预计时长:6-8小时 | 重点程度:高


1. 服务发现

注册中心原理

服务启动 → 注册自己(IP/Port/健康状态)→ 注册中心存储
消费者启动 → 订阅服务 → 注册中心推送 / 消费者拉取
心跳检测 → 注册中心定期检测 → 超时则剔除

Consul vs Nacos vs Eureka

Consul Nacos Eureka
语言 Go Java Java
一致性 Raft(CP) Raft/Distronic(CP/AP) 最终一致(AP)
健康检查 支持 支持 服务续约
运维复杂度 低(单二进制) 中(需要MySQL)
特点 多数据中心 功能最全 AWS Netflix

客户端发现 vs 服务端发现

客户端发现:消费者直接从注册中心获取服务列表,自己负载均衡
  优点:少一跳网络
  缺点:消费者需要集成注册中心SDK

服务端发现:消费者请求 LoadBalancer / Ingress,LB 负责发现
  优点:消费者无感知
  缺点:多一跳

2. 熔断、降级、限流

熔断(Circuit Breaker)

状态机:Closed(正常) → Open(熔断) → HalfOpen(探测)

Closed:所有请求正常通过,失败计数
  → 失败次数 > 阈值 → 跳到 Open

Open:所有请求直接拒绝(快速失败)
  → 等待熔断时间 → 跳到 HalfOpen

HalfOpen:允许一个请求通过
  → 成功 → 回 Closed
  → 失败 → 回 Open

常用实现:Hystrix(已停止维护)/ Sentinel(阿里)/ Resilience4j

降级(Fallback)

// 正常逻辑
func GetProduct(id string) (*Product, error) {
    return productClient.Get(id)
}

// 降级:服务不可用时返回兜底数据
func GetProductWithFallback(id string) (*Product, error) {
    p, err := productClient.Get(id)
    if err != nil {
        // 降级:返回缓存或默认值
        return getProductFromCache(id)
    }
    return p, nil
}

限流

算法 原理 优点 缺点
固定窗口 固定时间窗口内计数 简单 边界两倍突刺
滑动窗口 滚动时间窗口 精确 实现复杂
令牌桶 按速率往桶里放令牌,取令牌处理 可突发 -
漏桶 固定速率消费 平滑 不能突发
// 令牌桶实现
type TokenBucket struct {
    rate       float64 // 每秒令牌数
    burst      int     // 桶容量
    tokens     float64
    lastUpdate time.Time
    mu         sync.Mutex
}

func (tb *TokenBucket) Allow() bool {
    tb.mu.Lock()
    defer tb.mu.Unlock()
    now := time.Now()
    // 补充令牌
    tb.tokens += now.Sub(tb.lastUpdate).Seconds() * tb.rate
    if tb.tokens > float64(tb.burst) {
        tb.tokens = float64(tb.burst)
    }
    tb.lastUpdate = now
    if tb.tokens >= 1 {
        tb.tokens--
        return true
    }
    return false
}

3. API 网关

网关职责

路由转发 → 协议转换(HTTP → gRPC)
认证鉴权 → JWT / OAuth2 / API Key
限流熔断 → 流量防护
日志监控 → 记录请求日志
灰度发布 → 权重路由

常见网关

网关 特点
Kong Nginx + Lua,插件生态最全
APISIX Apache 顶级项目,Apache APISIX 云原生更强
Spring Cloud Gateway Java,Spring 生态
Envoy Service Mesh 标准,数据面

4. 服务分层架构

经典三层

接入层(Gateway / API)
  ↓
服务层(业务服务,按领域划分)
  ↓
基础层(DB / Cache / MQ / OSS)

你简历里的审批平台如何分层?

接入层:企微消息回调 → 审批网关
服务层:审批核心服务 + 规则引擎 + 消息通知服务
基础层:MySQL(审批单)+ Redis(分布式锁)+ Kafka(回调)+ Consul(服务发现)

高频面试题

Q1:如何保证微服务的高可用?

① 冗余部署(多实例);② 健康检查 + 自动摘除;③ 限流熔断;④ 异步化(MQ解耦);⑤ 降级兜底;⑥ 多活容灾(不同机房)

Q2:微服务拆分的原则?

① 领域驱动设计(DDD);② 单一职责,独立部署;③ 无循环依赖;④ 边界清晰,接口稳定优先于内部实现

Q3:服务间调用超时怎么设置?

① 读接口:超时=TP99+10%;② 写接口:超时=TP99+20%;③ 核心链路:设置 ReadTimeout + WriteTimeout;④ 使用 Context 传递超时