微服务架构原理与治理实践 | 青训营

85 阅读5分钟

微服务架构介绍

为什么系统架构需要演进?

  • 互联网的爆炸性发展
  • 硬件设施的快速发展
  • 需求复杂性的多样化
  • 开发人员的急剧增加
  • 计算机理论及技术的发展

系统架构演变历史

单体架构 -> 垂直应用架构 -> 分布式架构 -> SOA架构 -> 微服务架构。

单体架构

所有的功能模块都在一个进程上。

优势很明显:性能最高。冗余小。

劣势:debug困难、模块互相影响。

垂直应用架构

按照业务线垂直划分。

优势:业务独立开发维护。

劣势:不同的业务存在冗余、每个业务还是单体。

分布式架构

抽出业务无关的模块。

优势:有与业务无关的独立服务。

劣势:服务模块bug可导致全站瘫痪、调用关系复杂、不同服务冗余。

SOA架构(Service Oriented Architecture)

面向服务

优势:引进了服务注册中心

劣势:整个系统设计是中心化的、需要从上至下设计、重构起来比较困难。

微服务架构

彻底的服务化

优势:开发效率高、业务独立设计、自下而上、故障隔离。

劣势:治理、运维难度高、观测是一个不小的调整、安全性问题等。

微服务架构的核心要素

  1. 服务治理:服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理等。
  2. 可观测性:日志采集、日志分析、监控打卡、监控大盘、异常报警、链路追踪等。
  3. 安全:身份认证、认证授权、访问令牌、审计、传输加密、黑产攻击等。

微服务架构原理及特征

基本概念

  • 服务:一组具有相同逻辑的运行实体。
  • 实例:一个服务中,每个运行的实体即为一个实例。
  • 实例与进程的关系:实例与进程之间没有必然对应关系,可以一个实例对应一个或多个进程(反之不常见)。
  • 集群:通常指服务内部的逻辑划分,包含多个实例。
  • 常见的实例承载形式:进程、VM、k8s pod等。
  • 有状态/无状态服务:服务的实例是否存储了可持久化的数据(如磁盘文件)。

服务之间通信

对于单体服务,不同模块之间的通信只是简单的函数调用。

对于微服务来说,服务间通信意味着网络传输。

服务的注册与发现

在代码层面,如何指定调用一个目标服务的地址?

给ip:port写到代码里? 不太好。

DNS行不行?

  • 本地DNS存在缓存,导致延时。
  • 负载均衡问题。
  • 不支持服务实例的探活检查。
  • 域名无法配置端口。

解决:新增一个统一的服务注册中心,用于存储服务的基本信息。

流量特征

  • 统一网关入口。
  • 内网通信多数采用RPC。
  • 网状调用链路。

核心服务治理功能

服务发布

服务发布就是指一个服务升级运行新代码的过程。

难点:服务不可用、服务抖动、服务回滚。

蓝绿部署

将服务实例逻辑划分蓝绿两个部分,发布的时候,先发布其中某一个部分,等那一个部分发布完成后,再发布剩下的部分。

这样做的好处就是简单,稳定。不过需要两倍的资源。

灰度发布(金丝雀发布)

image.png

这样看起来虽然不错,但如果在发布到99%的时候发现一个bug,那么就需要将那99%的实例全都回滚。

流量治理

在微服务架构下,可以基于地区、集群、实例、请求等维度,来控制流量。

负载均衡

负载均衡(Load Balance)负责分配请求在每个下游实例上的分布。就是在服务实例集群中选择一个实例调用的策略。

常见的策略

  • Round Robin。
  • Random。
  • Ring Hash。
  • Least Request。

稳定性治理

线上服务总是会出问题的,这与程序的正确性无关。不可控因素。

  • 网络攻击。
  • 流量突增。
  • 机房断电。
  • 光纤被挖。
  • 机器故障。
  • 网络故障。
  • 机房空调故障。

解决方案:限流、熔断、过载保护、降级。

重试的意义

  • 重试可以避免掉偶发的错误,提高SLA(Service-Level Agreement)。
  • 降低错误率:不妨设单词请求的错误率为0.01,那么连续两次都错误的概率为0.0001。
  • 降低长尾延迟:对于偶尔耗时较长的请求,重试请求有机会提前返回。
  • 容忍暂时性错误:某些时候系统会有暂时性异常(例如网络抖动),重试可以尽量规避。
  • 避开下游故障实例:一个服务中可能会有少量实例故障(例如机器故障),重试其他实例可以成功。

重试的难点

幂等性

重试风暴

如果调用链路较长,重复次数会被放大许多倍,最上游服务可能因此挂掉。

可以限制重试比例,如设定一个重试比例阈值(例如1%),重试次数占所有请求比例不超过该阈值。

还可以防止链路重试,链路层面的防重试风暴的核心是限制每层都发生重试,理想情况下只有最下一层发生重试。可以返回特殊的status表明“请求失败,别重试”。

对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应。

超时设置

总结

微服务架构是一种将复杂应用拆分成独立小型服务的设计方式,以满足互联网发展、多样需求、快速开发的需求。系统架构演进受到互联网扩张、硬件发展、需求多样化、开发规模增加等影响,从单体架构到微服务架构逐渐演进。微服务架构的核心包括服务治理、可观测性和安全,通过独立服务、流量控制、发布策略、负载均衡、稳定性治理等实现。然而,微服务也带来了治理、运维、安全等挑战,需要综合考虑。