微服务 | 青训营笔记

96 阅读5分钟

微服务 | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天,主要记录相关的知识点。

本堂课重点内容

  • 微服务架构简介
  • 微服务架构原理及特征
  • 微服务核心服务治理功能

微服务架构简介

微服务架构本身是 SOA 架构在服务层面更进一步的架构,相比较于 SOA ,微服务架构自身不需要依赖于服务注册中心,而是将业务与服务合为一体。

整体的微服务的框架如下:

image.png

作为分布式系统之一的微服务架构,服务是最重要的,为了管理好服务,就需要有服务配置与链路追踪的管理能力。

微服务架构包括三个基本要素:服务治理,可观测性和安全。

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

微服务架构原理及特征

基本概念

服务(service):一组具有相同逻辑的运行实体(一个服务运行的代码是一样的)

实例(instance):一个服务中的每个运行实体(一个服务就是运行同一段代码的多个实例)

集群(cluster):指服务内部的逻辑划分,包含多个实例

服务,集群与实例的关系如下图所示:

image.png

实例与进程的关系:没有必然对应关系,一般一对一或者一对多(一个实例对多个进程)

实例承载形式:进程、VM、k8s pod等

有状态/无状态服务:一个服务的实例是否存储了可持久化的数据(例如存储到磁盘)

服务间通信

对于普通的单体架构,服务通信只需要通过函数调用就可以了,因为都在本地,但是对于微服务,由于是分布式的,所欲通常会需要网络传输。

一个通信的示例图

image.png

服务注册与发现

由于服务之间需要通过网络通信,因此获取服务之间的实例的地址就成为了一个开发中要考虑的问题。

一种简单的的方案是直接指定ip地址与端口号,但是带来的问题也很明显:

  • 没有任何动态能力(写死了ip和port)
  • 有多个实例下游实例怎么办?

另外一种方式是使用DNS:

  • 本地 DNS 存在缓存,导致延迟
  • DNS 没有负载均衡
  • 不支持服务探活检查
  • DNS 不能指定端口

在微服务架构中,为了解决这个问题,提出了服务注册发现这个概念,其实际工作原理如下:

  • 新增一个统一的服务注册中心,用于存储服务名到服务实例之间的映射关系
  • 旧服务实例下线前,从服务注册中心删除该实例,下线流量
  • 新服务实例上线后,在服务注册中心注册该实例,上线流量

从微服务流量的角度来看,其具有如下特点:

  • 统一网关入口
  • 外网通信多数采用 HTTP,内网通信多数采用 RPC(Thrift, gRPC)
  • 网状链路调用

微服务核心服务治理功能

服务发布

服务发布:让一个服务升级运行新的代码的过程(更新代码)

服务发布的问题:

  • 服务不可用:对于一个服务下的一个实例,一旦服务更新,那么这个实例就会进入暂时的不可用状态。
  • 服务抖动:流量消失,进入短暂的不可用状态。
  • 服务回滚:新升级的代码出现问题,需要回滚版本。

解决服务发布问题的办法:

  1. 蓝绿部署

    • 将服务分成两个部分(cluster),分别先后发布
    • 优点是简单、稳定
    • 缺点是需要使用两倍资源,并且在高流量的情况下可能会给服务器带来压力,因此适合在低流量场景下使用
  2. 灰度发布(金丝雀发布)

    • 先发布少部分实例,接着逐步增加发布比例
    • 优点是不需要像蓝绿部署那样增加资源
    • 缺点是回滚难度大,基础设施要求高,并且流量等需要精细化控制

流量治理

流量控制:在微服务架构中,可以从各个维度对端到端的流量在链路上进行精确控制

流量控制可以从以下几个角度考虑:

  • 地区
  • 集群
  • 实例
  • 请求

流量控制的实例:

image.png

负载均衡

负载均衡:负责分配请求在每个下游实例上的分布(即对于一个服务的多个实例,尽可能使得每个实例收到的请求个数较为均衡)。

常用的负载均衡策略如下:

  • Round Robin

  • Random

  • Ring Hash

  • Least Request

稳定性治理

一个重要思想:线上服务总是会出问题,不管服务是否正确。

即使程序没有 bug,在上线后面对复杂的环境,也可能会产生新的问题。

稳定性治理的方式:

  1. 限流:限制服务处理的最大 QPS,(请求接收方)拒绝过多请求

  2. 熔断:(请求发起方)中断请求路径,增加冷却时间从而让故障实例尝试恢复

  3. 过载保护:在负载高的实例中,(请求接收方)主动拒绝一部分请求,防止实例被打挂

  4. 降级:服务处理能力不足时,(请求接收方)拒绝低级别的请求,只响应线上高优请求

个人总结

本次课程主要学习了:

  • 微服务架构简介
  • 微服务架构原理及特征
  • 微服务核心服务治理功能