这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天 本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习微服务架构知识时候进行的简单记录。本次课程基本为理论课程,接下来我将对微服务架构中的重要内容进行说明。
一、本堂课的重点内容
- 微服务架构介绍
- 微服务架构原理及特征
- 核心服务治理功能
- 字节跳动服务治理实践
二、详细知识点介绍
微服务架构介绍
系统架构演变历史
- 单体架构:例如学校的课设,单机架构,将所有的内容逻辑放在一个项目里面
- 垂直应用架构:按照业务线垂直划分
- 分布式架构:抽取业务无关的公共模块
- SOA架构:面向服务(拥有服务注册中心)
- 微服务架构:彻底的服务化
微服务架构概览
- 核心组件(各种服务和MQ)
- 网关:处理外界流量
- 服务配置和治理:服务的基础化能力
- 链路追踪和监控:提供问题定位的能力
微服务架构核心要素
- 服务治理:重点,包括服务注册、服务发现、负载均衡等
- 可观测性:日志采集、日志分析等
- 安全:身份验证、认证授权等
微服务架构原理及特征
基本概念
- 服务:一组具有相同逻辑的运行实体(相同逻辑:相同代码)
- 实例:一个服务中,每个运行实体即一个实例
- 集群:服务内部的逻辑划分,包含多个实例(服务包含集群,集群包含实例)
- 有状态/无状态服务:服务的实例是否存储了可持久化数据
服务间通信
对于单体服务,不同模块通信就是函数调用;对于微服务,服务间通信意味着网络传输
服务注册与发现
在代码层面,如何指定调用一个目标服务的地址?(IP:PORT)
- hardcode:直接用grpc的api来调用地址(不太可能指定固定的IP地址,不能写死)
- DNS:登记地址(本地DNS存在缓存,导致延时;负载均衡问题;不支持服务实例的探活检查;域名无法配置端口)
- 新增一个统一的服务注册中心,用于存储服务名到服务实例的映射
流量特征
- 统一网关入口
- 内网通信多数采用RPC
- 网状调用链路
核心服务治理功能
服务发布
服务发布,指让一个服务升级运行新的代码的过程
服务发布的难点:服务不可用;服务抖动;服务回滚
流程:
- 蓝绿部署(简单稳定,但是需要两倍资源)
- 灰度发布(金丝雀发布)
流量控制
在微服务架构下,可以基于地区、集群、实例和请求等维度,对流量进行控制
负载均衡
负载均衡负责分配请求在每个下游实例上的分布
常见的LB策略:
- Round Robin
- Random
- Ring Hash
- Least Request
稳定性治理(关键)
线上服务总是会出问题的,这与程序的正确行为无关
- 网络攻击
- 流量突增
- 机房断电
- 光纤被挖
- 机器故障
稳定性治理功能:
- 限流(rate limit,可以拒绝qps)
- 熔断(负载过大等其他因素无法连接服务时,connection failure)
- 过载保护(CPU 99%,用dynamic overload检测并拒绝请求)
- 降级(保证重要的服务能够得到处理)
字节跳动服务治理实践
重试的意义
重试可以避免掉偶发的错误,提高SLA(Servie-Level Agreement)
- 降低错误率(0.01->0.0001)
- 降低长尾延时
- 容忍暂时性错误(例如网络抖动)
- 避开下游故障实例
重试的难点
- 幂等性
- 重试风暴(3->9->27->3^n)
- 超时设置
重试策略
- 限制重试比例:设定一个重试比例阈值(1%:成功1000次,只能重试10次)
- 防止链路重试:限制每层都发生重试(可以返回特殊的status表明请求失败,但别重试)
- Hedged requests:对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应
三、课后个人总结
通过本节课的学习,我对微服务架构有了更好的了解,对于其中基本概念以及服务治理功能有了深入的理解,对于重试的意义、难点与策略有了大致的掌握。课程中对于具体的概念会有相应的例子来进行辅助说明,对于我的理解有较大的帮助,例如服务的注册与发现,显然我们刚开始会想到直接调用API来调用IP端口,但是对于一个大型的服务项目来说,IP端口不可能是固定的,因此想到利用NDS,然后又有相应的问题,最后会采用服务注册中心(微服务架构顺势引入),一切都非常合理,也让人印象深刻。