这是我参与「第五届青训营 」伴学笔记创作活动的第9天,今天学习了微服务架构的原理与基本治理下面是我的笔记。
微服务架构
1、微服务架构的演进
-
单体架构
- All in one process
-
垂直应用架构
- 按照业务线垂直划分
-
分布式架构
- 抽出与业务无关的公共模块
-
SOA架构
- 面向服务
-
微服务架构
- 彻底的服务化
从单体架构到微服务架构的演进也带来了以下好处:
- 每个服务较小,大部分由于十几个接口或服务方法组成,非常容易维护;
- 每个服务都可以独立部署,非常易于扩展;
- 可以更好地划分职责范围;
- 可以使软件系统可持续性交付部署.
2、微服务架构的原理
-
微服务架构的核心要素
-
服务治理
-
可观测性
-
安全
基本原理:
-
服务
- 一组具有相同逻辑的运行实体
-
实例
- 一个服务中的每个运行实体
-
实例与进程的关系
- 没有必然的对应关系,一般是一对一或者一对多
常见的实例承载形式
- 进程、VM、k8s pod......
服务间通信
微服务之间通过网络进行通信,http,rpc协议等。
服务注册与发现
如果直接指定ip:port,则缺少动态能力。使用dns则存在缓存,导致产生一定的延迟。
微服务的策略是:
- 新增一个统一的服务注册中心,用于存储服务名到服务实例之间的映射关系
- 旧服务实例下线前,从服务注册中心删除该实例,下线流量
- 新服务实例上线后,在服务注册中心注册该实例,上线流量
-
服务发布
-
蓝绿部署
- 将服务分成两个部分,分别先后发布,较为简单,但需要两倍资源。
-
灰度发布(金丝雀发布)
- 先发布少部分实例,接着逐步增加发布比例
- 不需要增加资源
- 回滚难度大,基础设施要求高
流量治理与负载均衡
在微服务架构下,可以基于地区,集群,实例,请求等维度,对端对端流量的路由路径进行精确控制。
负载均衡策略
-
Round Robin
-
Random
-
Ring Hash
-
Least Request
稳定性治理
-
限流
- 限制服务处理的最大 QPS,拒绝过多请求
-
熔断
- 中断请求路径,增加冷却时间从而让故障实例尝试恢复
-
过载保护
- 在负载高的实例中,主动拒绝一部分请求,防止实例被打挂
-
降级
- 服务处理能力不足时,拒绝低级别的请求,只响应线上高优请求
3、请求重试
-
请求重试的意义
- 本地函数调用
- 通常没有重试意义
- 远程函数调用
- 网络抖动、下游负载高、下游机器宕机......
- 重试是有意义的,可以避免偶发性的错误,提高 SLA
- 重试的意义
- 降低错误率
- 降低长尾延时
- 容忍暂时性错误
- 避开下游故障实例
- 本地函数调用
-
请求重试的难点
- 幂等性
- get类请求具有幂等性,但是post请求不具备,同一张表单不能提交多次
- 重试风暴
- 随着调用链路的增加,重试次数呈指数级上升
- 超时设置
- 无法确定超时时间的合理设置。
- 幂等性
-
重试策略
- 限制重试比例
- 设定一个重试比例阈值(例如 1%),重试次数占所有请求比例不超过该阈值
- 防止链路重试
- 返回特殊的 status code,表示“请求失败,但别重试”
- Hedged Requests
- 对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应
- 限制重试比例