这是我参与「第五届青训营 」笔记创作活动的第 9 天
重点:微服务架构原理及特征
难点:核心服务治理功能、字节跳动服务治理实践
1、微服务架构
核心要素:服务治理、可观测性、安全
1.1 单体架构
性能高、冗余小;debug困难、模块相互影响、模块分工、开发流程
1.2 垂直应用架构
按照业务线垂直划分;业务独立开发维护;不同业务存在冗余、每个业务还是单体
1.3 分布式架构
抽出无关的公共模块;业务无关的独立服务;服务模块bug可导致全站瘫痪、调用关系复杂、不同服务冗余
1.4 SOA架构
面向服务;服务注册;整个系统设计是中心化的、需要从上至下设计、重构困难
1.5 微服务架构
彻底的服务化;开发效率高、业务独立设计、自下而上、故障隔离;治理、运维难度、观测挑战、安全问题、分布式系统问题
2、微服务架构原理及特征
服务(Service)、实例(Instance)、进程与实例的关系、集群(cluster)、常见的实例承载形式(进程、VM、k8s pod等)、有状态/无状态服务
微服务之间通过网络进行通信;HTTP、RPC
2.1 服务注册及发现
2.1.1 代码层面指定调用一个目标服务的地址
直接指定ip:port:服务有多个实例,没法hardcode,服务实例ip port本身是动态变化的
使用DNS:本地DNS存在缓存导致延时、负载均衡问题、不支持服务实例的探活检查、域名无法配置端口
服务注册发现:新增一个统一的服务注册中心,用于存储服务名到服务实例的映射
2.2 服务实例上线及下线过程
旧服务实例下线前,从服务注册中心删除该实例,下线实例
新服务实例上线后,在服务注册中心注册该实例,上线流量
2.3 流量特征
统一网关入口、内网通信、网状调用链路
弱化连接的概念,强调“请求”,即同一个客户端长连接发出的请求,理论可以到达服务中所有实例
3、核心服务治理功能
3.1 服务发布(deployment)
即指让一个服务升级运行新的代码的过程
难点:服务不可用、服务抖动、服务回滚
3.1.1 蓝绿部署
将服务分成两个部分,分别先后发布;简单、稳定;需要两倍资源
3.1.2 灰度发布(金丝雀发布)
先发布少部分实例,接着逐步增加发布比例;不需要增加资源;回滚难度大,基础设施要求高
3.2 流量治理
在微服务框架下,基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精确控制(狭义)
3.3 负载均衡(Load Balance)
负责分配请求在每个下游实例上的分布
3.4 稳定性治理
与程序的正确性无关
微服务架构中典型的稳定性治理功能:限流、熔断、过载保护、降级
4、字节跳动服务治理实践
4.1 重试意义
本地函数调用基本没有重试的意义
远程函数调用重试可以避免偶发性错误,提高SLA
重试可以降低错误率、降低长尾延时、容忍暂时性错误、避开下游故障实例
4.2 重试的难点
幂等性:多次请求可能造成数据不一致
重试风暴:随着调用深度的增加,重试次数会指数级上涨
超时设置:假设调用时间一共1s,经过多少时间开始重试?
4.3 重试策略
限制重试比例:设定一个重试比例阈值,重试次数占所有请求比例不超过该阈值
防止链路重试:返回特殊的 status code,表示“请求失败,但别重试”
Hedged Requests:对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应
4.4 重试效果验证
字节跳动重试组件能够极大限制重试发生的链路放大效应
课后个人总结
微服务架构是当前大多数互联网公司的标准架构,通过本节课我学习到了微服务架构的由来和原理、服务治理功能的工作原理,了解了不少微服务框架的相关知识