Skip to content

架构设计与模式之通信篇

Microservices 通信-同步通信

单体与微服务通信

  • 单体

    • 进程间通信(Inter-Process)
    • 高度耦合、难以分割和独立扩展
  • 微服务

    • 服务间通信(Inter-Service communication)
    • 协议:HTTP、gRPC 或 message brokers AMQP
    • 类型:同步、异步

同步与异步通信

  • 同步(Sync)

    • 服务间通信(Inter-Service communication)
    • 分布式网络调用(Distributed network calls)
    • HTTP,gRPC 协议
    • 阻塞式的请求与响应(Synchronous Request/Response)
    • REST APIs
  • 异步(Async)

    • 不必等响应,非阻塞线程(Not wait Response and not have blocked a thread)
    • 高级消息队列协议(AMQP,Advanced Message QueuingProtocol)
    • 队列模式 one-to-one(queue) mode
    • 话题模式 one-to-many(topic) mode
    • 发布订阅机制 publish/subscribe
    • 事件驱动微服务架构(Event-driven microservices architecture)
    • 工具:Kafka and RabbitMQ

同步通信最佳实践

  • Request/Response-based 通信

    • HTTP protocols and REST approaches
    • 场景:暴露 API 给微服务集群外部
  • 二进制格式通信机制

    • gRPC binary format communications
    • 场景:微服务集群内部,追求速度

RESTful API

  • 概念

    • REST(Representational State Transfer,表述性状态转移)
    • 来自 Roy Fielding 的博士论文,作为 SOAP and WSDL 的替代品。
    • 属于同步系统中的 Request/Response Communication
    • REST 遵从 HTTP 协议, 实现 HTTP Verbs 如 GET, POST 或 PUT
  • 特性

    • 无状态(Stateless)
    • 统一接口(Uniform Interface)
    • 可缓存(Cacheable)
    • C/S 模式(Client-Server)
    • 分层系统(Layered System)
    • 按需编码(Code on Demand)
  • 示例

    • https://eshop.com/orders // Correct
    • https://eshop.com/create-order // Wrong
  • RESTful API design

x

gRPC

  • 什么是 gRPC

    • gRPC (gRPC Remote Procedure Calls)
    • 高性能的、开源的、全局的 RPC 框架。
    • 使用 HTTP/2 协议来传输二进制消息
    • 通过协议缓存(Protocol Buffers)也叫 Protobuf 来定义接口
    • 生成跨平台的客户度与服务端的绑定结构
  • gRPC 如何工作

    • 如图

    x

    • gRPC 客户端直接调用服务端的方法(directly call a method on a server)
    • 易于建造分布式应用与服务
    • 定义服务-能指定可远程调用的方法(Defining a service that specifies methods that can be called remotely)
    • gRPC 可以支持的任何语言(Can be written in any language that gRPC supports)
  • gRPC 的优势

    • 使用 HTTP/2
    • 二进制序列化(Binary serialization)
    • 对多语言/平台的支持(Supporting a wide audience with multi-language/platform support)
    • 开源、强有力的社区支持(Open Source and the powerful community behind it)
    • 支持双向流式操作(Supports Bi-directional Streaming operations)
  • gRPC vs REST

    • 如图

    x

    • 兼容性

      • 单一事实来源 (Single source of truth):构建信息模型和关联的数据模式的一种做法,使每个数据元素都在一个地方被掌握,从而使数据标准化。
      • 内置多平台/语言
      • 处理非破坏性变更(Non breaking change ):指内部逻辑已经改变,但外部接口没变,依旧能以旧的方式访问。
    • 性能

      • 网络:处理连接
      • 速度:传输速度
      • CPU:提升资源利用率
    • 可维护性

      • 追踪(Tracing)
      • 日志(Logging)
      • 监控(Monitoring)
  • 微服务通信中 gRPC

    • 案例如图

    x

    • 后端微服务到微服务的同步通信
    • 多种环境(Polyglot environments)
    • 低延时、高吞吐量通信
    • 端到端实时通信
    • 适用网络受限环境(Network constrained environments)

      • 二进制 gRPC 小于基于文本的 JSON 消息。
      • binary gRPC messages are always smaller than an equivalent text-based JSON message.

Microservices 通信-API Gateway

客户/微服务直通模式

x

  • 客户到微服务直接通信的缺陷如下:(Drawbacks of direct client-to-microservice communication)
  • 需要聊天式的通信来完成请求(Chatty communications in order to fulfill the request)
  • 多种通信协议(Diverse communication protocol )
  • 公共网关功能 (such as authentication, authorization, logging),需要在每个服务内部实现。
  • 增加了 UI 侧的延时和复杂度

API 网关模式介绍

x

  • 用于构建负责、大型、基于微服务的应用(Complex large microservices-based applications)
  • 使用外观模式(Facade pattern)
  • 反向代理或网关路由(Reverse proxy or gateway routing)
  • 提供横切关注点(Cross-cutting concerns)功能,如认证、SSL终端、缓存(authentication, SSL termination and cache)。
  • 将请求从客户端路由到后端微服务(Routing requests from client to backend services)
  • 聚合若干微服务(Aggregate several microservice)
  • 存在单点故障风险(Single-point-of-failure risk)

API 网关主要特性

  • 网关路由模式(Gateway Routing Pattern)

    • 反向代理或网关路由(Reverse proxy or gateway routing)
    • 路由请求到多个微服务(Route requests to multiple microservices)
    • 只暴露一个端点(Exposing a single endpoint)
    • 第七层路由(Layer 7 routing)
    • 集中错误管理(Centralized Error Management)
  • 网关聚合模式(Gateway Aggregation Pattern)

    • 请求聚合(Requests aggregation)
    • 请求分发并聚合结果(dispatches several requests to the internal microservices & aggregates the results)
    • 聚合多个内部请求(Aggregate multiple internal requests)
    • 不同的后端服务(Different backend microservices)
    • 管理直接访问的服务(Manage direct access services)
    • 减少聊天式的通信(Reduce chattiness communication)
    • 分发请求(Dispatches requests)
  • 网关卸载模式(Gateway Offloading Pattern)

    • 即横切关注点与网关卸载(Cross-cutting concerns and gateway offloading),功能如下:
    • 身份验证和授权(Authentication and authorization)
    • 服务发现集成(Service discovery integration)
    • 响应缓存(Response caching)
    • 重试策略、断路器和QoS(Retry policies, circuit breaker, and QoS)
    • 速率限制和节流(Rate limiting and throttling)
    • 负载均衡(Load balancing)
    • 记录、跟踪、关联(Logging, tracing, correlation)
    • Headers、查询字符串和声明转换(Headers, query strings, and claims transformation)
    • IP允许列表(IP allowlisting)
    • 服务质量(Quality of Service)

微服务通信-API 网关模式

x

微服务通信-BFF 模式

x

  • 分离的 API 网关(Separate api gateways)
  • API 网关来处理路由与聚合操作(API Gateway for handling to routing and aggregate operations)
  • 为客户端应用分组(Grouping the client applications)
  • 避免单一网关的瓶颈(Avoid bottleneck of 1 API Gw)
  • 设计图案例

x

微服务间通信-服务到服务通信

  • 服务到服务通信(Service-to-Service Communications )
  • 链式查询(Chain Queries)

微服务间通信-服务聚合模式

x

  • 减少服务到服务的通信(Minimize service-to-service communications)
  • 通过 API 网关接收请求(Receives a request from api gw)
  • 分发多后端服务请求(Dispatches requests of multiple internal backend microservices)
  • 合并结果(combines the results)

微服务间通信-服务注册模式

x

  • 微服务发现模式(Microservice Discovery Patterns)
  • 注册与发现微服务(Register and discover microservices)
  • 所有微服务都应注册到注册中心(Microservices should register to Service Registry)
  • 找到服务的位置(Finds the location of microservice)

微服务聚合/注册模式

x

Microservices 通信-基于消息的异步通信

基于异步消息的通信

  • 多个微服务间需要交互(Multiple microservices are required to interact each other)
  • 不产生依赖关系或实现松散耦合(Without any dependency or make loosely coupled)
  • 基于消息的通信(Message-based Communication)
  • 考虑最终一致性(Eventual consistency)
  • 消息代理系统(Message broker systems)
  • AMQP 协议(AMQP,高级消息队列协议)
  • 案例:Kafka 和 RabbitMQ

设计原则/模式

  • 依赖倒置原则(DIP,Dependency Inversion Principles )
  • 发布订阅模式(Publish-Subscribe Design Pattern)

发布/订阅消息代理案例

x

Kafka 和 RabbitMQ 架构

Apache Kafka 简介

  • 开源事件流平台(Open-source event streaming platforms)
  • 水平可扩展、分布式和容错(Horizontally scalable, distributed and fault-tolerant)
  • 分布式发布/订阅(Distributed publish-subscribe)
  • 事件驱动的架构(Event-driven Architecture)
  • 主题消息(Topic Messages)
  • ZooKeeper同步(ZooKeeper sync)
  • 话题、分区、代理、生产者、消费者、Zookeeper(Topics, Partitions, Brokers, Producer, Consumer, Zookeeper)

Kafka 组件

x

  • 主题(Topic):消息类别的名称,同类消息发送到同一个Topic下。
  • 分区(Partition):Topic下面可划分很多分区,不设置的话只有一个分区;Partition是一个有序的消息队列。
  • 偏移量(Offset):Partition 中的消息都有一个唯一的编号,称之为 Offset,用来唯一标示某个分区中的 Message。
  • 副本因子(Replication Factor)

Kafka 集群架构

x

Kafka 核心 APIs

  • 生产者 API:生产者推送数据到代理(Producers API: Producers push data to brokers)
  • 消费者 API:订阅话题与处理数据流(Consumer API: Subscribe to topics and process the streams of data)
  • 流式 API:改变输入流到输出流(Streams API: Transforming the input streams to output streams)
  • 连接 API:配置连接器来从 Kafka 移入或移出数据(Connect API: Configure connectors to move data into Kafka or from Kafka)

RabbitMQ 概念及主要组件

x

  • 消息队列系统(Message Queue System)
  • 事件驱动的架构(Event-Driven Architecture)

RabbitMQ 交换类型

  • Direct 交换模式

    • 直接丟給指定的 Queue
  • Topic 交换模式

    • 類似 regular expression,設定 binding 規則,丟給符合的 Queue
  • Fanout 交换模式

    • 一次丟給全部負責的 Queue
  • Header 交换模式

    • 透過傳送資料的 header 來特別指定所要的 Queue

RabbitMQ 架构

  • 生产者只能向exchange发送消息(Producer can only send messages to an exchange)
  • Exchange控制消息的路由(Exchanges control the routing of messages)
  • RabbitMQ使用推送模型(RabbitMQ uses a push model)
  • 单独快速地分发消息(Distribute messages individually and quickly)