[ 后端与 Go | 青训营笔记 ]

116 阅读5分钟

[ 后端与 Go | 青训营笔记 ]

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

课内:Go 微服务框架 - 不变的基建

微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。

重点

  • 微服务架构介绍;
  • 微服务架构原理及特征;
  • 核心服务治理功能;
  • 字节跳动服务治理实践。

细节

微服务架构介绍

背景由来

原因

  • 互联网快速发展;
  • 硬件设施快速发展;
  • 需求复杂;
  • 开发人员增加;
  • 计算机理论发展。

演变历史

  • 单体架构;

image-20230204164940626

  • 垂直应用架构;

image-20230204165049464

  • 分布式架构;

image-20230204165138503

  • SOA 架构;

image-20230204165151289

  • 微服务架构。

image-20230204165205292

架构概览

image-20230204165219639

基本要素
  • 服务治理;
  • 可观测性;
  • 安全。

image-20230204165304470

微服务架构原理及特征

基本组件

服务

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

实例

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

实例与进程的关系

  • 实例与进程之间没有必然对应关系,可以一个实例对应一个或多个进程。

集群

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

常见的实例承载形式

  • 进程、VM、k8s pod。

有状态 / 无状态服务

  • 服务的实例是否存储了可持续化的数据。

image-20230204170010021

image-20230204170027032

工作原理

服务间通信

  • 对于单体服务,不同模块通信只是简单的函数调用;
  • 对于微服务,服务间通信意味着网络传输。

image-20230204170211503

服务注册与发现

  • 指定调用一个目标服务的地址;

image-20230204170310464

  • DNS

    • 本地 DNS 存在缓存,导致延时;
    • 负载均衡问题;
    • 不支持服务实例的探活检查;
    • 域名无法配置端口。

image-20230204170516740

  • 新增一个统一的服务注册中心,用于存储服务名到服务实例的映射。

image-20230204170651981

image-20230204170703883

image-20230204170716816

image-20230204170733382

image-20230204170743277

image-20230204170754970

image-20230204170807095

流量特征
  • 统一网关入口;
  • 内网通信多数采用 RPC ;
  • 网状调用链路。

image-20230204170909761

核心服务治理功能

服务发布

定义

  • 指让一个服务升级运行新的代码的过程。

难点

  • 服务不可用;
  • 服务抖动;
  • 服务回滚;

image-20230204171201882

蓝绿部署

  • 简单、稳定,但需要双倍资源。

image-20230204171232920

image-20230204171252755

image-20230204171317421

image-20230204171326326

image-20230204171334896

image-20230204171342873

灰度发布(金丝雀发布)

image-20230204171502068

image-20230204171512672

流量治理
  • 在微服务架构下,可以基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精确控制。

image-20230204171631324

服务负载均衡

定义

  • 负责分配请求在每个下游实例上的发布。

常见的 LoadBalance 策略

  • Round Robin;
  • Random;
  • Ring Hash;
  • Least Request。

image-20230204171903733

稳定性治理
  • 线上服务总会错误,这与程序的正确性无关。

image-20230204172004677

典型的稳定性治理功能

  • 限流;
  • 熔断;
  • 过载保护;
  • 降级。

image-20230204172105745

字节跳动服务治理实践

重试
  • 重试可以避免偶发的错误,提高 Service-Level Agreement。

image-20230204172237182

作用

  • 降低错误率;
  • 降低长尾延时;
  • 容忍暂时性错误;
  • 避开下游故障实例。

image-20230204172537293

难点

  • 幂等性;
  • 重试风暴;
  • 超时设置。

image-20230204172635549

策略

  • 限制重试比例;

image-20230204172731553

  • 防止链路重试;

image-20230204172759811

  • Hedged requests;

image-20230204172828999

重试效果验证

  • 在链路上发生的重大放大错误。

image-20230204172900285

总结

对微服务架构有了一定的了解。