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

80 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

1. 微服务架构介绍

  • 系统架构演变历史:

image-20230206110003921.png

  • 分布式架构

    抽出业务无关的公共模块,但是服务模块 bug 会导致全站瘫痪,调用关系复杂

image-20230206110845890.png

  • SOA 架构

    面向服务, 服务注册与发现,但是整个系统设计是中心化,需要从上至下设计,重构困难

image-20230206110918993.png

  • 微服务架构

    彻底的服务化,业务独立设计,自下而上,故障隔离,但是治理,运维难度增加,以及安全性挑战。

image-20230206111227900.png

核心要素:

  1. 服务配置和治理

    服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理

  2. 链路追踪和监控(可观测性)

    日志采集、日志分析、监控打点、监控大盘、异常报警、链路追踪

  3. 安全

    身份验证、认证授权、访问令牌、审计、传输加密、黑产攻击

2. 微服务架构原理及特征

2.1 基本概念

  • 服务(service)

    一组具有相同逻辑的运行实体。

  • 实例(instance)

    一个服务中,每个运行实体即为一个实例。

  • 实例与进程的关系

    实例与进程之间没有必然对应关系,可以一个实例可以对应一个或多个进程(反之不常见)。

  • 集群(cluster)

    通常指服务内部的逻辑划分,包含多个实例。

  • 常见的实例承载形式

    进程、VM、k8s pod ……

  • 有状态/无状态服务

    服务的实例是否存储了可持久化的数据(例如磁盘文件)。

  • 服务间通信

    HTTP/ RPC/Thrift

image-20230206113947568.png

2.2 服务注册与发现

  • DNS -- 一个域名可以注册多个不同的 IP

    ​ 但是 DNS 不支持负载均衡(一般选择第一个IP)、不支持服务实例探活检查 ,域名无法支持配置端口(一个服务占了一个端口)

image-20230206114257118.png

  • 服务注册中心

    基于DNS 思想,新增一个中间层服务注册中心,用于存储服务名到服务实例的映射。

    服务发现会实时刷新

image-20230206115003895.png

2.3 流量特征

​ 统一网关入口、内网通信多数采用RPC(二进制形势传输)

image-20230206115437474.png

3. 核心服务治理功能

3.1 服务发布

  • 难点

    服务不可用

    服务抖动

    服务回滚

  • 如何发布

    • 蓝绿部署 -- 先升级一个集群,再切换

      简单,稳定,但是有一半资源不可用

image-20230206133734105.png

  • 灰度发布(金丝雀发布)-- 加一个新服务,再减一个老服务

    但需要不停更新注册表

image-20230206134330244.png

3.2 流量治理

​ 流量可以基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行选择。

image-20230206134554311.png

3.3 负载均衡

负责分配请求再每个下游实例上的分布

常见的 Load Balance 策略:

  • Round Robin
  • Random
  • Ring Hash
  • Least Request

3.4 稳定性治理

网络攻击、流量突增、机房故障等

治理方案:

  • 限流

image-20230206135834922.png

  • 熔断

    熔断冷却,过段时间,会再次请求重连

image-20230206140113790.png

  • 过载保护

    cpu 过载,拒绝服务。

image-20230206140144412.png

  • 降级

    保证重要的服务进行处理,等级低的服务被拒绝

image-20230206140205466.png

4. 服务治理实践

4.1 重试

​ 重试可以避免点偶发的错误,提高 SLA(Service-Level Agreement), 但默认不用

  • 降低错误率 假设单次请求的错误概率为 0.01,那么连续两次错误概率则为 0.0001,

  • 降低长尾延时 对于偶尔耗时较长的请求,重试请求有机会提前返回。

  • 容忍暂时性错误

    某些时候系统会有暂时性异常(例如网络抖动),重试可以尽量规避。

  • 避开下游故障实例 一个服务中可能会有少量实例故障(例如机器故障),重试其他实例可以成功。