微服务的进程间通信(IPC)

本文介绍了几种典型的微服务间通信方式,并提供了几种相应的实现方式。

译自:Microservice 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 movie
  • PUT /movies : Update a movie
  • GET /movies : Get all movies
  • GET /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)的更多相关文章

  1. 【Android】进程间通信IPC——AIDL

    AIDL官网定义AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Androi ...

  2. 微服务架构的进程间通信(IPC)

    先抛出几个问题: 微服务架构的交互模式有哪些? 微服务常用的进程间通信技术有哪些? 如何处理部分请求失败? API的定义需要注意的事项有哪些 微服务的通信机制与SOA的通信机制之间的关系与区别 微服务 ...

  3. 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3

    编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...

  4. Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  5. SOA和微服务架构

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...

  6. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  7. SOA和微服务架构的区别

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...

  8. 0107-将Monolith重构为微服务

    重构到微服务的概述 将单一应用程序转换为微服务的过程是应用程序现代化的一种形式.这是开发人员几十年来一直在做的事情.因此,在将应用程序重构为微服务时,我们可以重用一些想法. 一个不使用的策略是重写“B ...

  9. 进程间通信IPC、LPC、RPC

    进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法.进程是计算机系统分配资源的最小单位.每个进程都有自己的一部分独立的系 ...

随机推荐

  1. vue之下拉菜单Dropdown的使用

    通过组件slot来设置下拉触发的元素以及需要通过具名slot为dropdown 来设置下拉菜单.默认情况下,下拉按钮只要hover即可,无需点击也会显示下拉菜单. <el-dropdown> ...

  2. vue之v-for遍历下拉框select和单选框组radio-group

    1.v-for遍历下拉框 <el-form-item label="审核状态:" prop="status"> <el-select v-mo ...

  3. ctf.show_web13(文件上传之.user.ini)

    这是一道文件上传题,先二话不说丢个图片码,显示为 先考虑文件太小,用burp抓包,添加了一堆无用的东西后显示仍然是error file zise,直到上传正常图片依旧如此,考虑文件太大.将一句话木马修 ...

  4. Java基础语法:类型转换

    由于Java是强类型语言,所以有时候在进行运算时,需要用到类型转换. 整型.常量.字符类型数据可以混合运算. 运算中,不同类型的数据先转化为同一类型,然后再进行运算. 类型转换等级有低级到高级的划分, ...

  5. CMD(命令提示符)的基本操作(文件)

    打开CMD窗口,接下来将介绍如何使用CMD来创建.删除.修改.查看文件 1.1 使用CMD创建空文件(为了更好的演示,本文皆以D盘为当前路径),命令如下: copy nul xxx.xx(文件名) 命 ...

  6. zabbix Python3管理

    import requests import json import os # user config here ip = '192.168.52.130' user = "root&quo ...

  7. C++构造函数的选择

    构造函数用来初始化类对象.构造函数有好几种,在编程时如何选择不同的构造函数呢?做个总结 一.默认构造函数 默认构造函数是在程序员没有声明任何构造函数的时,编译器为了初始化类对象自己进行的默认构造函数. ...

  8. 辨析js遍历对象与数组的方法

    1     遍历对象的方法? (1) for-in(也可遍历数组,但效率较低,一般用来遍历对象) 示例: // 生成一个原型上有属性并且有可枚举属性与不可枚举属性的对象 const data = Ob ...

  9. 漏洞复现-Bash之一键破壳

        注:使用docker搭建测试环境 (1)访问搭建的环境网址:http://192.168.11.101:8081/ (2)使用burp拦截数据包,并修改User-Agent的内容: (3)使用 ...

  10. ubantu16与windows下——redis的安装与使用

      (1) 打开ubantu16,使用如下命令下载安装包 wget http://download.redis.io/releases/redis-2.8.3.tar.gz (2)解压缩命令: tar ...