微服务架构原理与治理|青训营笔记

83 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第9天,今天学习了微服务架构的原理与基本治理下面是我的笔记。

微服务架构

1、微服务架构的演进

  • 单体架构

    • All in one process
  • 垂直应用架构

    • 按照业务线垂直划分
  • 分布式架构

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

    • 面向服务
  • 微服务架构

    • 彻底的服务化

    从单体架构到微服务架构的演进也带来了以下好处:

    • 每个服务较小,大部分由于十几个接口或服务方法组成,非常容易维护;
    • 每个服务都可以独立部署,非常易于扩展;
    • 可以更好地划分职责范围;
    • 可以使软件系统可持续性交付部署.

img

2、微服务架构的原理

  • 微服务架构的核心要素

  • 服务治理

  • 可观测性

  • 安全

基本原理:

  • 服务

    • 一组具有相同逻辑的运行实体
  • 实例

    • 一个服务中的每个运行实体
  • 实例与进程的关系

    • 没有必然的对应关系,一般是一对一或者一对多

常见的实例承载形式

  • 进程、VM、k8s pod......

服务间通信

微服务之间通过网络进行通信,http,rpc协议等。

服务注册与发现

如果直接指定ip:port,则缺少动态能力。使用dns则存在缓存,导致产生一定的延迟。

微服务的策略是:

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

  • 蓝绿部署

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

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

流量治理与负载均衡

在微服务架构下,可以基于地区,集群,实例,请求等维度,对端对端流量的路由路径进行精确控制。

负载均衡策略

  • Round Robin

  • Random

  • Ring Hash

  • Least Request

稳定性治理

  • 限流

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

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

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

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

3、请求重试

  • 请求重试的意义

    • 本地函数调用
      • 通常没有重试意义
    • 远程函数调用
      • 网络抖动、下游负载高、下游机器宕机......
      • 重试是有意义的,可以避免偶发性的错误,提高 SLA
    • 重试的意义
      • 降低错误率
      • 降低长尾延时
      • 容忍暂时性错误
      • 避开下游故障实例
  • 请求重试的难点

    • 幂等性
      • get类请求具有幂等性,但是post请求不具备,同一张表单不能提交多次
    • 重试风暴
      • 随着调用链路的增加,重试次数呈指数级上升
    • 超时设置
      • 无法确定超时时间的合理设置。
  • 重试策略

    • 限制重试比例
      • 设定一个重试比例阈值(例如 1%),重试次数占所有请求比例不超过该阈值
    • 防止链路重试
      • 返回特殊的 status code,表示“请求失败,但别重试”
    • Hedged Requests
      • 对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应