微服务的进程间通信(IPC)
微服务的进程间通信(IPC)
本文介绍了几种典型的微服务间通信方式,并提供了几种相应的实现方式。
微服务的进程间通信架构图:

术语
IPC:进程间通信
MSA:微服务架构
概述
服务间通信包含两大类:
- 基于同步请求/响应的通信,如REST,gRPC
- 基于异步消息的通信,如AMQP或STOMP
通信视角
视角 #1
一对一通信
一对多通信
视角 #2
- 同步通信
- 异步通信
一对一通信类型
- 请求/响应通信
- 异步请求响应
- 单方面通知
一对多通信类型
- 发布/订阅
- 发布/异步响应
APIs
服务API是服务端和客户端之间的合约。
- 理想情况下,首先应该定义服务的接口,然后再实现服务
服务APIs使用版本语法来命名APIs的版本。版本语法包含三个部分:MAJOR.MINOR.PATCH。
消息格式
IPC的本质是消息的交互。消息有两种格式:文本格式和二进制格式。
- 文本格式:JSON,XML
- 二进制格式:Avro,Protobuf和Thrift
在实现时必须注意消息格式的跨语言协作,因此不推荐使用JavaSerializer。
RPC
远程调用服务的方法,但对调用者来说,就像使用本地方法一样。
流程:
- 客户端的业务逻辑调用RPI代理接口
- RPI代理通过网络调用RPI服务,即调用服务端的业务逻辑
- 服务端将结果返回给RPI代理,最终由RPI代理返回给客户端的业务逻辑。

REST
REST是一种理念,而非协议。REST用到了HTTP。
REST的一个主要理念是资源,它代表一个单独的业务实体,如Movie,Customer等,或一个对象集合。
REST使用HTTP verb来操作资源,如:
POST /movies: Create a moviePUT /movies: Update a movieGET /movies: Get all moviesGET /movies/{movieId}: Get a movie
gRPC
gRPC是一个基于二进制的消息协议,因此必须优先处理API(定义API)。首先使用IDL定义接口,然后编译生成期望语言的客户端和服务端stubs。

断路器
是一个RPI代理,用于在连续发送的错误超过一定阈值时,在一定时间内拒绝调用。
常用的断路器库如下:
- Netflix Hystrix ( Java )
- Polly ( .Net )
- Hystrix Go (Go lang)
API通信的健壮性
为了构建同步通信的健壮性,需要考虑如下模式:
- 网络超时
- 重试
- 断路器
- 回滚
- 可靠性测试
服务发现
问题
服务A需要通过API调用服务B,因此服务A需要知道服务B的地址。
传统方式
最简单的方式是静态配置实例的网络地址,这样调用者可以在配置文件中指定该地址。
传统方式的问题
现在,由于在自动扩容、失败和升级时会动态创建服务实例,并为实例动态分配网络位置,因此引出了服务发现的需求。
服务发现
服务发现的概念非常简单,最主要的组件是服务注册表,存储了应用服务实例的网络位置。

服务发现的两种主要实现方式:
- 服务端和客户端直接与服务注册表交互
- 通过部署平台(如kubernetes)进行交互
服务发现模式:
- 自注册
- 客户端发现
- 服务端发现
异步消息
基于消息的应用通常会使用一个消息代理(broker),作为服务间的中间人。另一种方式是使用无消息代理架构。
概念
发送端会向一个channel写入消息,接收者会从该channel中读取消息。
消息
消息包含首部和消息体。
首部是一个键值对集合,此外还包含一个唯一消息Id(来自发送端或由消息基础设施生成)。
消息体包含需要发送的数据。
消息类型
- 文档
- 目录
- 事件

Channels
消息通过channel进行交互。channel有两种类型:
- 点到点channel
- 发布订阅channel
异步通信实现
异步请求响应

发布订阅

无消息代理
- 服务可以直接进行交互
- ZeroMQ就是一个典型的无消息代理技术

基于消息代理的通信
消息代理是所有消息流的中间人。
好处
- 发送端不需要知道消费端的位置
- 在消息被消费者处理前,消息代理会对消息进行缓存
典型的开源消息代理
- ActiveMQ
- RabbitMQ
- Apache Kafka
在选择消息代理时需要考虑的因素
- 支持的编程语言
- 支持的消息标准
- 消息顺序
- 保证消息的发送
- 持久化
- 稳定性
- 可扩展性
- 延迟
- 产品竞争力
微服务的进程间通信(IPC)的更多相关文章
- 【Android】进程间通信IPC——AIDL
AIDL官网定义AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Androi ...
- 微服务架构的进程间通信(IPC)
先抛出几个问题: 微服务架构的交互模式有哪些? 微服务常用的进程间通信技术有哪些? 如何处理部分请求失败? API的定义需要注意的事项有哪些 微服务的通信机制与SOA的通信机制之间的关系与区别 微服务 ...
- 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3
编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...
- Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...
- SOA和微服务架构
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- 基于 Docker 的微服务架构实践
本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...
- SOA和微服务架构的区别
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- 0107-将Monolith重构为微服务
重构到微服务的概述 将单一应用程序转换为微服务的过程是应用程序现代化的一种形式.这是开发人员几十年来一直在做的事情.因此,在将应用程序重构为微服务时,我们可以重用一些想法. 一个不使用的策略是重写“B ...
- 进程间通信IPC、LPC、RPC
进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法.进程是计算机系统分配资源的最小单位.每个进程都有自己的一部分独立的系 ...
随机推荐
- Python3+PYQT5 实现并打包exe小工具(1)
前言: 由于项目原因,配置测试环境与正式环境切换频率很高,固写了一键切换环境的工具.用于记录. 实现逻辑: 1.读取注册表中客户端的安装目录,把固定的环境配置文件添加到固定目录下实现配置测试环境: 2 ...
- HashSet为什么可以有序输出?
首先HashSet是不保证有序,而不是保证无序,因为在HashSet中,元素是按照他们的hashCode值排序存储的.对于单个字符而言,这些hashCode就是ASCII码,因此,当按顺序添加自然数或 ...
- Docker 概述(一)
1-1 虚拟化技术发展史 在虚拟化技术出现之前,如果我们想搭建一台服务器,我们需要做如下的工作: 购买一台硬件服务器:在硬件服务器上安装配置操作系统系统:在操作系统之上配置应用运行环境:部署并运行应用 ...
- 大话Spark(7)-源码之Master主备切换
Master作为Spark Standalone模式中的核心,如果Master出现异常,则整个集群的运行情况和资源都无法进行管理,整个集群将处于无法工作的状态. Spark在设计的时候考虑到了这种情况 ...
- windows基线检测脚本编写指南-powershell版
前言: 因为工作的原因,要写windows下的基线检查脚本.之前没接触过,在网上找了半天也没找到现成的,无奈只好自己研究,最后还是成功完成了工作. 在我编写之后发现windows下的基线基本就是检 ...
- ZooKeeper 基本概念并介绍RPC中Netty和Zookeeper的使用
前言 ZooKeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等.Zookeeper提供一个类似Linux文件系统的属性结构,每个节点可存储少量的内存文件,并提供每 ...
- 200-Java语言基础-Java编程入门-006 | Java数组定义及使用(引用数据类型)
一.数组概述和定义格式说明 为什么要有数组(容器): 为了存储同种数据类型的多个值 数组概念: 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引 ...
- 用实战玩转pandas数据分析(一)——用户消费行为分析(python)
CD商品订单数据的分析总结.根据订单数据(用户的消费记录),从时间维度和用户维度,分析该网站用户的消费行为.通过此案例,总结订单数据的一些共性,能通过用户的消费记录挖掘出对业务有用的信息.对其他产 ...
- [BJOI2020] 封印
一.题目 点此看题 二.解法 今天不知道为什么手感这么好,写一发完全没调就过掉了. 我感觉这种多组询问的字符串题是很难的,经常没有什么思路.我先考虑了一下能不能像 区间本质不同的子串个数 这样直接离线 ...
- ResNet的个人总结
ResNet可以说是我认真读过的第一篇paper,据师兄说读起来比较简单,没有复杂的数学公式,不过作为经典的网络结构还是有很多细节值得深究的.因为平时不太读英文文献,所以其实读的时候也有很多地方不是很 ...