微服务架构初探 | 青训营笔记

101 阅读4分钟

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

今天学习了微服务架构和对应的微服务支付秒杀系统实战

微服务架构

  • 微服务架构介绍

    • 微服务架构的背景由来、架构概览、基本要素
  • 微服务架构原理及特征

    • 微服务架构的基本组件、工作原理、流量特征
  • 核心服务治理功能

    • 核心的服务治理功能,包括流量治理、服务均衡、稳定性治理
  • 字节跳动服务治理实践

    • 字节跳动在微服务架构稳定性治理中,对请求重试策略的探索及实践
  • 微服务架构整体架构图

image-20230205110433388

  • 微服务基本概念

image-20230205110550330

image-20230205131335481

  • 服务发现和注册方法

    • 使用socket对:

      • 缺点:不合适,相当于将一个服务绑定了唯一一个网络地址,不便于服务多台机器部署
      • 解决思路: 新增一个统一的服务注册中心(实际上就是一个hashmap),用于存储服务名到服务实例的映射

    image-20230205131820318

    • 使用本地DNS:

      • 缺点:本地 DNS 存在缓存,导致延时。无法负载均衡问题,不支持服务实例的探活检查。域名无法配置端口
    • 服务注册和发现

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

    • RPC使用二进制结构,效率相比HTTP更高

image-20230205132220810

  • 微服务架构的三大要素

    • 服务治理

      • 服务注册
      • 服务发现
      • 负载均衡
      • 扩缩容
      • 流量治理
      • 稳定性治理
    • 可观测性

      • 日志采集
      • 日志分析
      • 监控打点
      • 监控大盘
      • 异常报警
      • 链路追踪
    • 安全

      • 身份验证
      • 认证授权
      • 访问令牌
      • 审计
      • 传输加密
      • 黑产攻击
  • 微服务需要解决的重要问题

    • 服务发布:服务发布 (deployment),即指让一个服务升级运行新的代码的过程

      • 服务发布的难点

    image-20230205133933989

    • 解决的具体方法

      • 蓝绿部署:将服务分为两个集群,挨个升级,简单稳定但是需要两倍的资源

      • 灰度发布(金丝雀发布):同一个服务先创建一个新的实例,然后替换一个旧的实例

        • 缺点:需要较细粒度(实例)的管控,回滚不方便(发布了90%不能全回滚替换了)

      image-20230205134507229

    • 流量治理

      • image-20230205134527294
      • 根据地区,性能,时间,测试,功能等分布流量
    • 负载均衡

      • image-20230205134610408
    • 稳定性治理

      • 微服务架构中常见的流量治理措施

      • 限流

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

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

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

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

    image-20230205134731225

  • 字节所使用的微服务管理

    • 请求重试的意义:避免偶发错误导致的问题,提高SLA(Service-Level Agreement)

      • 本地函数调用

        • 通常没有重试意义
      • 远程函数调用

        • 网络抖动、下游负载高、下游机器宕机......
        • 重试是有意义的,可以避免偶发性的错误,提高 SLA
      • 重试的意义

        • 降低错误率

          • 重复两次还错的概率会大大减小
        • 降低长尾延时

          • 对于偶尔耗时较长的请求,重试请求有机会提前返回。
        • 容忍暂时性错误

          • 某些时候系统会有暂时性异常 (例如网络抖动)重试可以尽量规避
        • 避开下游故障实例

          • 一个服务中可能会有少量实例故障 (例如机器故障),重试其他实例可以成功
    • 重试的意义很大但是默认不使用的原因是:

      • 幂等性: 多次请求可能会造成数据不一致
      • 重试风暴: 随着调用深度的增加,重试次数会指数级上涨(稍后分析)
      • 超时设置:假设一个调用正常是 15 的超时时间,如果允许一次重试,那么第一次请求经过多少时间时,才开始重试呢?

      重试风暴的具体产生(由于微服务使用链式调用,会重复累加)

      image-20230205145018141

    • 常见的重试策略:以下三种

    image-20230205145155441

    image-20230205145205474

    image-20230205145217070

    • 本章的重点实际上就是在宣传字节自己的超时组件会使得重试风暴常数级的增加