微服务架构原理 | 青训营

48 阅读3分钟
  1. 微服务架构
    • 系统架构需要演进(由于各种原因)
      • 单体架构
        • 性能最高
        • 冗余小
        • debug困难
        • 模块相互影响
        • 模块分工,开发流程难
      • 垂直应用架构
        • 业务独立开发维护
        • 每个业务还是单体
      • 分布式架构
        • 抽出与业务无关的公共模块
        • 单个bug会导致全站瘫痪
        • 调研关系复杂 不同服务冗余
      • SOA架构
        • 面向服务
        • 服务注册中心
        • 重构困难
        • 从上而下
      • 微服务架构
        • 彻底的服务化
        • 从下而上
        • 开发效率好
        • 业务独立
        • 故障隔离
        • 治理,运维难
        • 观测挑战
        • 安全性
        • 分布式系统
    • 用户通过 网关 处理不同的服务
    • 服务配置和治理
    • 链路追踪和监控
    • 转存失败,建议直接上传图片文件
    • 服务治理
    • 可观测性
      • 以往是单个整体的服务去看日志
      • 而微服务日志数量庞大
      • 链式调用看传统调用栈不合适
    • 安全
      • 服务之间认证授权
  2. 微服务架构原理
    • 基本概念
      • seveice(服务) instance(实例)
      • 实例和进程的关系 一个实例可能会有多个进程
      • 集群 cluster 服务内部的逻辑划分
      • 实例承载进程 VM k8s pod
      • 有状态/无状态 是否可持久化的数据
    • HDFS看做一组微服务
    • 微服务通信
      • 单体服务 不同模块通信 通过函数调用
      • 微服务 服务间通信意味着网络传输
      • 网络传输协议
        • HTTP
        • gRPC
        • Thrift
    • 服务注册及发现
      • hardcode 写死ip地址
        • 存在多个实例
        • 服务地址会变
      • 指定域名 DNS解析成多个地址
        • 本地DNS存在缓冲 导致延时
        • 负载均衡问题(可能一直访问IP)
        • 不支持探活检查
        • 域名无法指定端口
      • 新增统一的服务注册中心
        • 一个哈希表
        • 设置权重 每次调用random
        • 上述是服务注册发现的基本的机制
        • 无损的服务实例上下线
          • 先删表 再下线
          • 先上线 (健康检查) 再加表(注册)
      • 流量特征
        • 统一网关入口
        • 内网通信多采用RPC(二进制协议 性能好)
        • 网状调用链路
  3. 核心服务治理
    • 服务发布 让一个服务升级运行新的代码
      • 难点
        • 服务不可用
        • 服务抖动
        • 服务回滚
      • 解决
        • 蓝绿发布
          • 简单稳定
          • 但需要两倍资源 在流量少的时段发布
        • 灰度发布(金丝雀发布)
          • 慢慢加新的代码实例
          • 精细的部署 回滚很难
    • 流量治理(Traffic Control)
      • 可以基于地区 集群 实例 请求等维度 对端到端流量的路由路径治理
    • 负载均衡(Load Balance) 分配下游的流量
      • Load Balance
        • 轮询
        • Random
        • Ring Hash 一致性哈希
    • 稳定性治理
      • 线上服务总会出问题 这与程序的正确性无关
        • 网络攻击
        • 流量突增
        • 机房断电
      • 解决办法
        • 限流 (reject 一些流量)
        • 熔断 (冷却 拒绝上游的流量)
        • 过载保护 (CPU过高 拒绝一部分)
        • 降级 (拒绝低等级)
  4. 字节的服务治理实践
    • 本地函数调用 没有重试的必要
    • 远程函数调用 有重试的意义(存在网络调用)
      • 网路抖动
      • 下游负载高导致超时
      • 下游及其宕机
      • 本地机器负载高
      • 下游熔断 限流
    • 重试可以避免偶发的错误 提高SLA (Service-Level-Agreement)
      • 降低错误了
      • 降低长尾延时
      • 融入暂时性错误
      • 避开下游故障实例
    • 重试的难点
      • 幂等性
      • 重试风暴(调用链路太深 重试次数随服务层数会指数增加)
      • 超时设置
      • 解决方案
        • 限制重试比例 每一个服务的
        • 防止链路重试
        • Hedeged requests
        • 字节内部重试实践