我们身处于一个充斥着分布式系统解决方案的计算机时代,无论是支付宝、微信这样顶级流量产品、还是区块链、IOT等热门概念、抑或如火如荼的容器生态技术如Kubernetes,其背后的技术架构核心都离不开分布式系统。

为什么要懂分布式架构

系统学习分布式架构设计对于技术人的成长非常关键,对于云原生开发者而言如何设计出符合云原生设计哲学的应用往往离不开分布式系统知识与方法论的运用。如何设计出高弹性、可配置、可分布、高性能、高容错、更安全、更韧性、快交付的原生应用往往是衡量开发者水准的重要参考。

然后而分布式系统是一个很大的概念,从架构设计、研发流程、运维部署、工程效率等多个角度均有很深的知识可以挖掘,学习成本和难道相对较大。近期整理了过去阅读过的一些和分布式相关书刊和文章,加上自己做分布式开发的一些的心得分享给大家,本文作为开篇,总体上给出知识概览,后续将分篇结合代码实践来进行阐述。起草仓促,水平有限,欢迎大家一起学习指正。

分布式系统大图

一、设计

网关模式,Gateway

功能

  • 请求路由,客户端直接调用 Gateway,Gateway 负责路由转发到注册服务上
  • 服务注册,后端服务将 API 注册,Gateway 负责路由
  • 负载均衡,支持多种负载策略
    • round robin
    • 随机均衡算法
    • 多权重负载
    • session 粘连
    • 其它
  • 安全特性,支持 HTTPS,账户鉴权,及其它安全特性支持
  • 灰度发布,可以针对服务版本或者租户等特性做灰度发布
  • API 聚合,将多个后端接口聚合,减少客户端调用次数
  • API 编排,通过编排来串接多个 API 完成特定业务

设计要点

  • 可用性,必须保证高可用
  • 扩展性,可以灵活扩展以支持特定业务比如特定业务流控
  • 高性能,通常使用异步 IO 模型框架实现,比如 Java netty,Go Channel
  • 安全,如加密通信,鉴权,DDOS 防御等
  • 运维
    • 应用监控,包括容量,性能,异常检测等
    • 弹性伸缩,具备高弹性能力,以低成本应对高峰值
  • 架构
    • 与业务解耦合,提供扩展扩展机制比如 Plugin,Serverless 的思路支持后端业务
    • 服务隔离,可以按照后端服务划分网关,做到不同服务使用不同网关
    • 网关部署靠近后端,保证网络损耗最小,性能最佳

      边车模式,Sidecar

      价值

  • 分离控制与逻辑,分离业务逻辑与路由,流控,熔断,幂等,服务发现,鉴权等控制组件
  • 适用场景
    • 老系统改造扩展,Sidebar 进程与服务进程部署在同一个节点,通过网络协议通讯
    • 多语言混合分布式系统扩展
    • 应用程序由多方提供

      设计要点

  • 标准服务协议,Sidebar 到 Service,Sidebar 到 Sidebar 协议尽可能与语言解耦
  • 聚合控制逻辑比如流控,熔断,幂等,重试,减少业务逻辑
  • 不要使用对服务侵入的方式进行进程间通讯如信号量,共享内存,优先使用本地网络通讯的方式比如 TPCP 或者 HTTP

    服务网格,Service Mesh

    新一代微服务架构,本质是服务间通信的基础设施层。

    file
    架构图

    特点

  • 应用间通讯中间层
  • 轻量级网络代理
  • 解耦应用程序
  • 应用程序无感知

    主流框架

  • Istio
  • Linkerd

    分布式锁

    解决方案

  • Redis分布式锁,SETNX key value PX expiretime
    • value 生成,最好全局唯一比如TraceID,可以使用/dev/urandom生成
    • expiretime单位是毫秒,过期锁自动释放 ,锁持有者保证过期时间内争抢资源完成计算
  • 悲观锁,先获取锁,再进行操作,吞吐量底
  • 乐观锁,使用版本号方式实现,吞吐量高,可能出现锁异常,适用于多读情况
  • CAS,修改共享数据源的场景可以代替分布式锁

    设计要点

  • 排他性,任意条件只有一个client可以获取锁
  • 锁有自动释放方式,比如超时释放
  • 锁必须高可用,且持久化
  • 锁必须非阻塞且可重入
  • 避免死锁,client最终一定可以获取锁,不存在异常情况锁无法释放的情况
  • 集群容错性,集群部分机器故障,锁操作仍然可用

    配置中心

  • 静态配置,环境及软件启动配置
  • 动态配置,运行时动态调整的配置如流控开关,熔断开关等

    异步通讯

  • 请求响应式,发送方直接向接收方发送请求
    • 发送方主动轮询
    • 发送方注册一个回调函数,接收方处理完成后回调发送方
  • 事件驱动设计(EDA)
    • 消息订阅,发送方发布消息,接收方订阅并消费消息
    • Broker 中间人,发送方向Broker发布消息,接收方向Broker订阅消息,彼此解耦,比如中间件RocketMQ
    • 事情驱动设计优势