这是我参与「第五届青训营 」笔记创作活动的第一天
1、微服务架构介绍
微服务架构的背景由来、架构概览、基本要素
- 互联网爆炸性发展
- 硬件设施的快速发展
- 需求复杂性的多样化
- 计算机理论及技术的发展
单体架构->垂直应用架构->分布式架构->SOA架构->微服务架构
单体架构:all in one process
优点: 性能最高,冗余小
缺点: debug困难, 模块分工、开发流程(多人协作困难)
垂直应用架构:按照业务线垂直划分
优点:业务无关的独立服务
缺点:不同业务存在冗余、每个业务还是单体
分布式架构:抽出业务无关的公共模块
优点:业务无关的独立服务
缺点:服务bug可能导致全站瘫痪、调用关系复杂、不同服务冗余
SOA架构:面向服务
优点:服务注册
缺点:整个系统设计是中心化的、需要从上至下设计、重构困难
微服务架构:彻底服务化
优点:开发效率高、业务独立设计、至下而上、故障隔离
治理、运维难度、观测挑战、安全性
- 服务治理:服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理....
- 可观测性:日志采集、日志分析、监控打点、监控大盘、异常报警、链路追踪....
- 安全:身份验证、认证授权、访问令牌、审计、传输加密、黑产攻击....
2、微服务架构原理及特征
微服务架构的基本组件、工作原理、流量特征
- 服务(service):一组具有相同逻辑的运行实体
- 实例(instance):一个服务中,每个运行实体即为一个实例
- 实例与进程的关系:没有必然关系,可以一个实例对应一个或多个进程(反之不常见)
- 集群(cluster):通常指内部的逻辑划分,包括多个实例。
- 常见的实例承载形式:进程、VM、k8s pod ....
- 有状态/无状态服务:服务的实例是否存储了可持久化的数据(例如磁盘文件)。无状态比如说起到一个代理作用。
单体与微服务服务间通信区别
单体:不同模块,函数调用
微服务:服务间通讯意味着网络传输
服务注册与发现
服务注册中心,用于存储服务器名到服务器实例的映射
通过服务健康检查来使服务上线与下线
流量特征
统一网关入口
内网通信多数采用RPC
内网通讯链路
3、核心服务治理功能
核心的服务治理功能,包括流量治理、服务均衡、稳定性治理
服务发布(deployment):即让一个服务升级运行新代码的过程。 难点:
服务不可用、服务抖动、服务回滚
蓝绿部署
服务一半一半的升级,升级过程中一半的流量不可用。(可以在流量低峰期升级)
灰度发布(金丝雀发布)
减少发布时所需要的服务资源,但是精细化回滚难度大
流量治理:可以基于地区、集群、实例、请求的维度等因素进行分流。
负载均衡
Round Robin、Random 、Ring Hash、Least Request.....
稳定性治理
限流:当流量超过阈值有效控制
熔断:服务器不正常过一段时间在访问
过载保护:当服务器压力大,拒绝(部分)访问
降级:让优先级高的先处理
4、服务治理实践
在微服务架构稳定性治理中,对重新请求策略的探索和实践
重试的意义:
- 本地函数调用失败(重试意义不大)
参数非法、OOM、NPE(空指针异常)、边界case、系统崩溃、死循环、程序异常退出.....
- 远程函数调用(有重试的意义)
网络抖动、下游负载高导致超时、下游机器宕机、本地机器宕机、本地机器负载高导致调度超时、下游熔断限流。
可以避免偶发的错误、降低错误率(错误率^n)、降低长尾延时、容忍暂时性错误、避开下游故障实例
重试可能引发引发问题:重试风暴
重试风暴(调用链路深)
解决/避免重试引发问题
限制重试比例:设定一个重试比例阈值(例如:1%),重试次数占请求比例不超过该阈值。
防止链路重试:(理想情况下,只有最后一层重试)