微服务框架 | 青训营笔记

64 阅读2分钟

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

微服务架构介绍

系统架构演变史

  • 互联网的爆炸性发展
  • 硬件设施的快速发展
  • 需求复杂性的多样化
  • 开发人员的急剧增加
  • 计算机理论及技术的发展

单体架构 - 垂直应用架构 - 分布式架构 - SOA架构 - 微服务架构 ……

微服务架构原理及特征

  • 服务 一组具有相同逻辑的运行实体
  • 实例 一个服务中,每个运行实体即为一个实例
  • 实例与进程的关系 实例与进程之间没有必然对应关系,可以一个实例可以对应一个或多个进程
  • 集群 通常指服务内部的逻辑划分,包含多个实例
  • 常见的实例承载形式 进程、VM、k8s pod……
  • 有状态 / 无状态服务 服务的实例是否存储了可持久化的数据

基本概念

如果把HDFS看作一组微服务。服务间通信,对于单体服务,不同模块通信只是简单的函数调用。对于微服务,服务间通信意味着网络传输。

服务注册及发现

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

流量特征

  • 统一网关入口
  • 内网通信多数采用RPC
  • 网状调用链路

核心服务治理功能

服务发布

服务发布(deployment),即指让一个服务升级运行系呢度代码的过程。

服务发布的难点:

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

字节跳动服务治理实践

重试的意义

本地函数调用

func LocalFunc(x int) int {
    res := calculate(x * 2)
    return res
}

可能由哪些异常?

  • 参数非法
  • ODM(Out Of Memory)
  • NPE(Null Pointer Exception)
  • 边界case
  • 系统崩溃
  • 死循环
  • 程序异常退出

远程函数调用

  • 网络抖动
  • 下游负载高导致超时
  • 下游机器宕机
  • 本地机器负载高,调度超时
  • 下游熔断,限流

重试可以避免偶发的错误,提高SLA(Service-Level Agreement)

重试的意义

  • 降低错误率
    • 假设单词请求的错误概率为0.01,那么连续两次错误的概率则为0.0001。
  • 降低长尾延时
    • 对于偶尔耗时较长的请求,重试请求有机会提前返回。
  • 容忍暂时性错误
    • 某些时候系统会有暂时性异常。
  • 避开下游故障实例
    • 一个服务中可能会有少量实例故障,重试其他实例可以成功。