初识微服务架构| 青训营笔记

139 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天 本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习微服务架构知识时候进行的简单记录。本次课程基本为理论课程,接下来我将对微服务架构中的重要内容进行说明。

一、本堂课的重点内容

  1. 微服务架构介绍
  2. 微服务架构原理及特征
  3. 核心服务治理功能
  4. 字节跳动服务治理实践

二、详细知识点介绍

微服务架构介绍

系统架构演变历史

  • 单体架构:例如学校的课设,单机架构,将所有的内容逻辑放在一个项目里面
  • 垂直应用架构:按照业务线垂直划分
  • 分布式架构:抽取业务无关的公共模块
  • 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,然后又有相应的问题,最后会采用服务注册中心(微服务架构顺势引入),一切都非常合理,也让人印象深刻。