微服务架构原理与治理实践
这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
[TOC]
微服务架构介绍
架构概览
- 网关
处理外来流量
- 服务配置和治理
- 链路追踪和监控
基本要素
- 服务治理
服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理
- 可观测性
日志采集、日志分析、监控打点、监控大盘、异常报警、链路追踪
- 安全
身份验证、认证授权、访问令牌、审计、传输加密、黑产攻击
微服务架构原理及特征
基本概念
- 服务
一组具有相同逻辑的运行实体
- 实例
一个服务中,每个运行实体即一个实例
- 实例与进程的关系
实例与进程之间没有必然对应的关系
- 集群
服务内部的逻辑划分,包含多个实例
- 常见的实例承载形式
进程、VM、k8s pod
- 有状态/无状态服务
服务的实例是否存储了可持久化的数据
服务注册和发现
在代码层面,调用指定目标服务的地址,往往采用了hardcode的方式,此方式存在问题
解决思路:
新增一个统一的服务注册中心,用于存储服务名到服务实例的映射
流量特征
- 统一网关入口
- 内网通信多数采用RPC
- 网状调用链路
HTTP协议本质上是一个文本协议,RPC是二进制协议,RPC往往在执行效率上是优于HTTP协议的,故内网的流量传输使用RPC协议
核心服务治理功能
服务发布
服务发布,即指让一个服务升级运行新的代码的过程
难点:
- 服务不可用
- 服务抖动
- 服务回滚
蓝绿部署
将服务分为两个部分A和B,当需要服务发布的时候,先把A的流量切给B,然后进行更新A的服务,之后再对B进行类似的操作。
特点:
- 简单、稳定
- 需要两倍的资源
灰度发布
在服务中,先加入一个新实例,观察运行情况,将一个旧实例的流量切换给新实例,用新实例逐个替换掉旧实例。
特点:
- 需要对流量进行精细化操作
- 回滚操作困难
流量治理
在微服务架构下,基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精确控制。
负载均衡
负载均衡负责分配请求在每个下游实例上的分布
- Round Robin
- Random
- Ring Hash
- Least Request
稳定性治理
线上服务是一定会出问题的,跟代码的正确性无关
- 网络攻击
- 流量问题
- 机房断电
- 网络故障
稳定性治理的主要措施:
- 限流
- 熔断
- 过载保护
- 降级
字节跳动服务治理实践
重试的意义
在本地函数调用的过程中,可能出现若干问题,例如:参数非法、OOM、NPE、边界、系统崩溃、死循环、程序异常退出。
在远程函数调用的过程中,同样可能出现若干问题,例如:网络抖动、下游负载高导致超时、下游机器宕机、本地机器负载高、下游熔断限流。
重试可以避免掉偶发的错误。
- 降低错误率
- 降低长尾延时
- 容忍暂时性的错误
- 避开下游故障实例
重试的难点
- 幂等性
- 重试风暴
假设存在A、B、C、D四个服务依次调用,若每个服务设置重试3次,当遇到重试失败时,累计到D需要进行27次重试,指数级增加。
- 超时设置
重试策略
- 限制重试比例
- 防止链路重试(防止重试风暴)