微服务框架 - 不变的基建 | 青训营笔记

118 阅读2分钟

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

微服务架构原理和特征

垂直应用架构(按业务线划分) 分布式架构(抽出业务无关的公共模块)

  • 服务出问题,全站瘫痪 SOA 架构(面向服务的,多了个服务注册中心) 微服务架构(彻底的服务化,故障隔离)

微服务架构核心要素

  • 服务治理
  • 可观测
  • 安全

区分服务和实例

服务间通信

单体服务,不同模块间通过函数调用 微服务,服务间通信通过网络传输

服务注册与发现

服务的地址也会变化,所以不能固定服务地址 解决:增加服务注册中心

服务上线下线过程

流量特征

  • 统一网关入口
  • 内部通信多数采用 RPC(RPC 效率 > HTTP)

核心服务治理功能

服务发布

定义:让一个服务运行新代码的过程 服务发布难点:

  • 服务不可用
  • 服务抖动
  • 服务回滚

蓝绿部署 简单但需要 2 倍资源

灰度发布(金丝雀发布) 回滚难度大

流量治理

基于地区、集群、实例、请求等维度 路径的选择

负载均衡

LB(load balance) 负责分配请求在上下游实例上的分布 常见 LB 策略:

  • Round Robin
  • Random
  • Ring Hash
  • Least Request

稳定性治理

线上服务总会出问题,与程序正确性无关

  • 限流
  • 熔断:断开服务连接
  • 过载保护
  • 降级:接受重要性高的服务

字节服务治理实践

重试的意义

重试可以避免偶发错误,提高 SLA(service-level agreement) 降低长尾延时

为什么默认不用重试 ?(重试难点)

  • 幂等性
  • 重试风暴:调用链末端服务会出现重试太多次
  • 超时设置:逻辑复杂

重试策略

  • 限制重试比例(比如 1%)
  • 防止链路重试:理想情况下只最后一层发生重试,解决办法:特殊返回值 status(失败但不重试)
  • Hedged requests:对于超时/延时高的请求,重新向另一个下游实例发一个相同请求,并等待先到达的响应