这是我参与「第五届青训营 」伴学笔记创作活动的第 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:对于超时/延时高的请求,重新向另一个下游实例发一个相同请求,并等待先到达的响应