微服务架构介绍
为什么系统架构需要演进?
- 互联网的爆炸性发展
- 硬件设施的快速发展
- 需求复杂性的多样化
- 开发人员的急剧增加
- 计算机理论及技术的发展
系统架构演变历史
单体架构 -> 垂直应用架构 -> 分布式架构 -> SOA架构 -> 微服务架构。
单体架构
所有的功能模块都在一个进程上。
优势很明显:性能最高。冗余小。
劣势:debug困难、模块互相影响。
垂直应用架构
按照业务线垂直划分。
优势:业务独立开发维护。
劣势:不同的业务存在冗余、每个业务还是单体。
分布式架构
抽出业务无关的模块。
优势:有与业务无关的独立服务。
劣势:服务模块bug可导致全站瘫痪、调用关系复杂、不同服务冗余。
SOA架构(Service Oriented Architecture)
面向服务
优势:引进了服务注册中心
劣势:整个系统设计是中心化的、需要从上至下设计、重构起来比较困难。
微服务架构
彻底的服务化
优势:开发效率高、业务独立设计、自下而上、故障隔离。
劣势:治理、运维难度高、观测是一个不小的调整、安全性问题等。
微服务架构的核心要素
- 服务治理:服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理等。
- 可观测性:日志采集、日志分析、监控打卡、监控大盘、异常报警、链路追踪等。
- 安全:身份认证、认证授权、访问令牌、审计、传输加密、黑产攻击等。
微服务架构原理及特征
基本概念
- 服务:一组具有相同逻辑的运行实体。
- 实例:一个服务中,每个运行的实体即为一个实例。
- 实例与进程的关系:实例与进程之间没有必然对应关系,可以一个实例对应一个或多个进程(反之不常见)。
- 集群:通常指服务内部的逻辑划分,包含多个实例。
- 常见的实例承载形式:进程、VM、k8s pod等。
- 有状态/无状态服务:服务的实例是否存储了可持久化的数据(如磁盘文件)。
服务之间通信
对于单体服务,不同模块之间的通信只是简单的函数调用。
对于微服务来说,服务间通信意味着网络传输。
服务的注册与发现
在代码层面,如何指定调用一个目标服务的地址?
给ip:port写到代码里? 不太好。
DNS行不行?
- 本地DNS存在缓存,导致延时。
- 负载均衡问题。
- 不支持服务实例的探活检查。
- 域名无法配置端口。
解决:新增一个统一的服务注册中心,用于存储服务的基本信息。
流量特征
- 统一网关入口。
- 内网通信多数采用RPC。
- 网状调用链路。
核心服务治理功能
服务发布
服务发布就是指一个服务升级运行新代码的过程。
难点:服务不可用、服务抖动、服务回滚。
蓝绿部署
将服务实例逻辑划分蓝绿两个部分,发布的时候,先发布其中某一个部分,等那一个部分发布完成后,再发布剩下的部分。
这样做的好处就是简单,稳定。不过需要两倍的资源。
灰度发布(金丝雀发布)
这样看起来虽然不错,但如果在发布到99%的时候发现一个bug,那么就需要将那99%的实例全都回滚。
流量治理
在微服务架构下,可以基于地区、集群、实例、请求等维度,来控制流量。
负载均衡
负载均衡(Load Balance)负责分配请求在每个下游实例上的分布。就是在服务实例集群中选择一个实例调用的策略。
常见的策略
- Round Robin。
- Random。
- Ring Hash。
- Least Request。
稳定性治理
线上服务总是会出问题的,这与程序的正确性无关。不可控因素。
- 网络攻击。
- 流量突增。
- 机房断电。
- 光纤被挖。
- 机器故障。
- 网络故障。
- 机房空调故障。
解决方案:限流、熔断、过载保护、降级。
重试的意义
- 重试可以避免掉偶发的错误,提高SLA(Service-Level Agreement)。
- 降低错误率:不妨设单词请求的错误率为0.01,那么连续两次都错误的概率为0.0001。
- 降低长尾延迟:对于偶尔耗时较长的请求,重试请求有机会提前返回。
- 容忍暂时性错误:某些时候系统会有暂时性异常(例如网络抖动),重试可以尽量规避。
- 避开下游故障实例:一个服务中可能会有少量实例故障(例如机器故障),重试其他实例可以成功。
重试的难点
幂等性
重试风暴
如果调用链路较长,重复次数会被放大许多倍,最上游服务可能因此挂掉。
可以限制重试比例,如设定一个重试比例阈值(例如1%),重试次数占所有请求比例不超过该阈值。
还可以防止链路重试,链路层面的防重试风暴的核心是限制每层都发生重试,理想情况下只有最下一层发生重试。可以返回特殊的status表明“请求失败,别重试”。
对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应。
超时设置
总结
微服务架构是一种将复杂应用拆分成独立小型服务的设计方式,以满足互联网发展、多样需求、快速开发的需求。系统架构演进受到互联网扩张、硬件发展、需求多样化、开发规模增加等影响,从单体架构到微服务架构逐渐演进。微服务架构的核心包括服务治理、可观测性和安全,通过独立服务、流量控制、发布策略、负载均衡、稳定性治理等实现。然而,微服务也带来了治理、运维、安全等挑战,需要综合考虑。