这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
内容源于青训营课堂视频以及一些文档,若有错误欢迎及时指出
1 微服务架构介绍
- 系统架构演变历史
- 微服务架构概览
- 微服务架构核心要素
演变历史
单体-垂直应用-分布式-SOA-微服务
- 单体:all in one process
- 垂直应用:按照业务线垂直划分
- 分布式:抽出业务无关的公共模块
- SOA:面向服务
- 微服务:彻底服务化
核心要素:服务治理、可观测性、安全
2 微服务架构原理及特征
- 微服务架构的基本组件
- 工作原理
- 流量特征
2.1 基本概念
-
服务:一组具有相同逻辑的运行实体
-
实例:一个服务中,每个运行实体即为一个实例
-
实例与进程的关系:实例与进程之间没有必然对应关系,一个实例可以对应一个或多个进程
-
集群:通常指服务内部的逻辑划分,包含多个实例
-
常见的实例承载形式:进程、VM、k8s pod
-
有状态/无状态服务:服务实例是否存储了可持久化的数据(k8s pvc)
-
服务间通信:对于单体服务是简单的函数调用,对于微服务服务间通信时网络传输(HTTP/RPC...)
2.2 服务注册及发现
问题:不同服务之间需要网络传输,而每个服务就对应于一个ip+port,如何指定调用一个目标服务的地址?
- 本地DNS存在缓存,导致延时
- 负载均衡
- 不支持服务实例的探活检查
- 域名无法配置端口
新增一个统一的服务注册中心,用于存储服务名到服务实例的映射
2.3 流量特征
- 统一网关入口
- 内网通信多数采用RPC
- 网状调用链路
弱化连接的概念,强调请求
3 核心服务治理功能
- 服务发布(deployment)
- 流量治理
- 负载均衡
- 稳定性治理
3.1 服务发布
- 蓝绿部署:简单稳定,但需要两倍资源
- 灰度发布(金丝雀发布):回滚难度大,基础设施要求高
3.2 流量治理
在微服务架构下可以基于地区、集群、实例、请求等维度,对端到端的路由路径进行精确控制
3.3 负载均衡
负责分配请求在每个下游实例上的分布
一个服务中每个实例的负载应当是大体均衡一致的
- Round Robin
- Random
- Ring Hash
- Least Request
3.4 稳定性治理
- 网络攻击
- 流量突增
- 机房断电
- 光纤被挖
限流、熔断、过载保护、降级
4 字节跳动服务治理实践
重试
意义
本地函数调用
- 参数非法
- OOM
- NPE...
远程函数调用
- 网络抖动
- 下游机器宕机
- 下游熔断...
意义在于可以避免掉偶发的错误,提高SLA
- 降低错误率
- 降低长尾延时
- 容忍暂时性错误
- 避开下游故障实例
难点
- 幂等性:多次请求可能会造成数据不一致
- 重试风暴:随着调用深度的增加,重试次数会指数级上涨
- 超时设置:设置多少的超时间隔
策略
- 限制重试比例(阈值)
- 防止链路重试
- Hedged requests
效果验证
for 循环重试