架构设计与模式之通信篇¶
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
gRPC¶
-
什么是 gRPC
- gRPC (gRPC Remote Procedure Calls)
- 高性能的、开源的、全局的 RPC 框架。
- 使用 HTTP/2 协议来传输二进制消息
- 通过协议缓存(Protocol Buffers)也叫 Protobuf 来定义接口
- 生成跨平台的客户度与服务端的绑定结构
-
gRPC 如何工作
- 如图
- 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
- 如图
-
兼容性
- 单一事实来源 (Single source of truth):构建信息模型和关联的数据模式的一种做法,使每个数据元素都在一个地方被掌握,从而使数据标准化。
- 内置多平台/语言
- 处理非破坏性变更(Non breaking change ):指内部逻辑已经改变,但外部接口没变,依旧能以旧的方式访问。
-
性能
- 网络:处理连接
- 速度:传输速度
- CPU:提升资源利用率
-
可维护性
- 追踪(Tracing)
- 日志(Logging)
- 监控(Monitoring)
-
微服务通信中 gRPC
- 案例如图
- 后端微服务到微服务的同步通信
- 多种环境(Polyglot environments)
- 低延时、高吞吐量通信
- 端到端实时通信
-
适用网络受限环境(Network constrained environments)
- 二进制 gRPC 小于基于文本的 JSON 消息。
- binary gRPC messages are always smaller than an equivalent text-based JSON message.
Microservices 通信-API Gateway¶
客户/微服务直通模式¶
- 客户到微服务直接通信的缺陷如下:(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 网关模式介绍¶
- 用于构建负责、大型、基于微服务的应用(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 网关模式¶
微服务通信-BFF 模式¶
- 分离的 API 网关(Separate api gateways)
- API 网关来处理路由与聚合操作(API Gateway for handling to routing and aggregate operations)
- 为客户端应用分组(Grouping the client applications)
- 避免单一网关的瓶颈(Avoid bottleneck of 1 API Gw)
- 设计图案例
微服务间通信-服务到服务通信¶
- 服务到服务通信(Service-to-Service Communications )
- 链式查询(Chain Queries)
微服务间通信-服务聚合模式¶
- 减少服务到服务的通信(Minimize service-to-service communications)
- 通过 API 网关接收请求(Receives a request from api gw)
- 分发多后端服务请求(Dispatches requests of multiple internal backend microservices)
- 合并结果(combines the results)
微服务间通信-服务注册模式¶
- 微服务发现模式(Microservice Discovery Patterns)
- 注册与发现微服务(Register and discover microservices)
- 所有微服务都应注册到注册中心(Microservices should register to Service Registry)
- 找到服务的位置(Finds the location of microservice)
微服务聚合/注册模式¶
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)
发布/订阅消息代理案例¶
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 组件¶
- 主题(Topic):消息类别的名称,同类消息发送到同一个Topic下。
- 分区(Partition):Topic下面可划分很多分区,不设置的话只有一个分区;Partition是一个有序的消息队列。
- 偏移量(Offset):Partition 中的消息都有一个唯一的编号,称之为 Offset,用来唯一标示某个分区中的 Message。
- 副本因子(Replication Factor)
Kafka 集群架构¶
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 概念及主要组件¶
- 消息队列系统(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)