微服务架构 | 青训营

87 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 8 天

系统架构的演进历史

  • 单体架构

    • All in one process

      优点:

      1. 性能最高
      2. 冗余小

      缺点:

      1. 调试困难
      2. 模块耦合度高
      3. 开发流程复杂
  • 垂直应用架构

    • 按照业务线垂直划分,例如按照业务分为:电商系统、后台系统、广告系统

      优点:

      1. 业务独立开发维护

      缺点:

      1. 不同业务存在冗余
      2. 每个业务还是单体
  • 分布式架构

    • 抽出与业务无关的公共模块

      优点:

      1. 独立无关的服务

      缺点:

      1. 服务模块 bug 会导致全站瘫痪
      2. 调用关系复杂
      3. 不同服务冗余
  • SOA架构

    • 面向服务

      优点:

      1. 服务注册

      缺点:

      1. 整个系统设计是中心化的
      2. 需要从上至下设计
      3. 重构困难
  • 微服务架构

    • 彻底的服务化

      优点:

      1. 开发效率高
      2. 业务独立设计
      3. 自下而上
      4. 故障隔离

      缺点:

      1. 治理、运维难度
      2. 观测挑战
      3. 安全性
      4. 分布式系统

微服务一般由以下部分组成:

  • 网关

  • 服务配置和治理

  • 链路追踪和监控

服务注册

微服务之间通信时,一个微服务是如何知道另外一个微服务地址的?

  • 简单方案

    • 直接指定 ip:port?
      • 没有任何动态能力
      • 有多个实例下游实例怎么办?
    • 使用 DNS?
      • 本地 DNS 存在缓存,导致延迟
      • DNS 没有负载均衡
      • 不支持服务探活检查
      • DNS 不能指定端口
  • 服务注册发现

    • 新增一个统一的服务注册中心,用于存储服务名到服务实例之间的映射关系
    • 旧服务实例下线前,从服务注册中心删除该实例,下线流量
    • 新服务实例上线后,在服务注册中心注册该实例,上线流量
  • 微服务流量特征

    • 统一网关入口
    • 外网通信多数采用 HTTP,内网通信多数采用 RPC(Thrift, gRPC)

服务治理

服务发布

  • 何为服务发布

    • 让一个服务升级运行新的代码的过程
  • 服务发布难点

    • 服务不可用
    • 服务抖动
    • 服务回滚
  • 蓝绿部署

    • 将服务分成两个部分,分别先后发布
    • 简单、稳定
    • 但需要两倍资源
  • 灰度发布(金丝雀发布)

    • 先发布少部分实例,接着逐步增加发布比例
    • 不需要增加资源
    • 回滚难度大,基础设施要求高

流量治理

  • 流量控制

    • 在微服务架构中,可以从各个维度对端到端的流量在链路上进行精确控制
  • 控制维度

    • 地区维度
    • 集群维度
    • 实例维度
    • 请求维度

负载均衡

  • Round Robin

  • Random

  • Ring Hash

  • Least Request

稳定性治理

  • 限流

    • 限制服务处理的最大 QPS,拒绝过多请求
  • 熔断

    • 中断请求路径,增加冷却时间从而让故障实例尝试恢复
  • 过载保护

    • 在负载高的实例中,主动拒绝一部分请求,防止实例被打挂
  • 降级

    • 服务处理能力不足时,拒绝低级别的请求,只响应线上高优请求