[转帖]微服务的进程间通信(IPC)

服务,进程,间通信,ipc · 浏览次数 : 0

小编点评

## 内容摘要 本文介绍了几种典型的微服务间通信方式,以及如何实现它们。 **1. 一对一通信** * 两台服务直接进行通信,使用REST协议或gRPC协议进行通信。 * 优点:简单易用,代码易维护。 * 缺点:效率较低,无法进行并发处理。 **2. 多对一通信** * 多个服务之间进行通信,使用REST协议或gRPC协议进行通信。 * 优点:效率较高,可以进行并发处理。 * 缺点:代码复杂,需要编写多个服务端和客户端。 **3. 同步通信** * 服务器向客户端发送异步消息,客户端通过消息代理进行处理。 * 优点:效率高,可以进行并发处理。 * 缺点:客户端需要处理异步消息,可能影响效率。 **4.异步通信** * 服务器向客户端发送消息,并返回一个异步处理结果。 * 优点:效率高,可以进行并发处理。 * 缺点:客户端需要处理异步消息,可能影响效率。 **5. 单方面通知** * 客户端向服务端发送消息,服务端通过消息代理进行处理。 * 优点:代码简洁,易于实现。 * 缺点:效率较低,无法进行并发处理。 **6. 异步请求响应** * 客户端向服务端发送异步请求,服务端通过消息代理进行处理。 * 优点:效率高,可以进行并发处理。 * 缺点:需要考虑消息代理的缓存策略。

正文

https://www.cnblogs.com/charlieroro/p/14707910.html

 

 

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

译自:Microservice IPC

微服务的进程间通信架构图:

image

术语

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代理返回给客户端的业务逻辑。
image

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。

image

断路器

是一个RPI代理,用于在连续发送的错误超过一定阈值时,在一定时间内拒绝调用。

常用的断路器库如下:

  • Netflix Hystrix ( Java )
  • Polly ( .Net )
  • Hystrix Go (Go lang)

API通信的健壮性

为了构建同步通信的健壮性,需要考虑如下模式:

  • 网络超时
  • 重试
  • 断路器
  • 回滚
  • 可靠性测试

服务发现

问题

服务A需要通过API调用服务B,因此服务A需要知道服务B的地址。

传统方式

最简单的方式是静态配置实例的网络地址,这样调用者可以在配置文件中指定该地址。

传统方式的问题

现在,由于在自动扩容、失败和升级时会动态创建服务实例,并为实例动态分配网络位置,因此引出了服务发现的需求。

服务发现

服务发现的概念非常简单,最主要的组件是服务注册表,存储了应用服务实例的网络位置。

image

服务发现的两种主要实现方式:

  • 服务端和客户端直接与服务注册表交互
  • 通过部署平台(如kubernetes)进行交互

服务发现模式:

  • 自注册
  • 客户端发现
  • 服务端发现

异步消息

基于消息的应用通常会使用一个消息代理(broker),作为服务间的中间人。另一种方式是使用无消息代理架构。

概念

发送端会向一个channel写入消息,接收者会从该channel中读取消息。

消息

消息包含首部和消息体。

首部是一个键值对集合,此外还包含一个唯一消息Id(来自发送端或由消息基础设施生成)。

消息体包含需要发送的数据。

消息类型

  • 文档
  • 目录
  • 事件
image

Channels

消息通过channel进行交互。channel有两种类型:

  • 点到点channel
  • 发布订阅channel

异步通信实现

异步请求响应

image

发布订阅

image

无消息代理

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

基于消息代理的通信

消息代理是所有消息流的中间人。

好处

  • 发送端不需要知道消费端的位置
  • 在消息被消费者处理前,消息代理会对消息进行缓存

典型的开源消息代理

  • ActiveMQ
  • RabbitMQ
  • Apache Kafka

在选择消息代理时需要考虑的因素

  • 支持的编程语言
  • 支持的消息标准
  • 消息顺序
  • 保证消息的发送
  • 持久化
  • 稳定性
  • 可扩展性
  • 延迟
  • 产品竞争力

本文来自博客园,作者:charlieroro,转载请注明原文链接:https://www.cnblogs.com/charlieroro/p/14707910.html

与[转帖]微服务的进程间通信(IPC)相似的内容:

[转帖]微服务的进程间通信(IPC)

https://www.cnblogs.com/charlieroro/p/14707910.html 目录 微服务的进程间通信(IPC) 术语 概述 通信视角 APIs 消息格式 RPC REST gRPC 断路器 API通信的健壮性 服务发现 异步消息 概念 消息 消息类型 Channels 异

[转帖]Redis6通信协议升级至RESP3,一口气看完13种新数据类型

原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 在前面的文章 Redis:我是如何与客户端进行通信的 中,我们介绍过RESP V2版本协议的规范,RESP的全程是Redis Serialization Protocol,基于这个实现简单且解析性能优秀的通信协议,Redis的服务端与客户端可以

[转帖]微服务进入深水区后该何去何从

https://maimai.cn/article/detail?fid=1779240778&efid=6PAMlDpkjTrLurOEPgEghQ 2022 年,关于微服务发生了几件有趣的事情。其一,正式掌管 Twitter 不久的 Elon Musk 对 Twitter 的开发团队 “批判”

[转帖]腾讯服务注册中心演进及性能优化实践

https://my.oschina.net/u/4587289/blog/5577840 导语 注册中心作为微服务架构的核心,承担服务调用过程中的服务注册与寻址的职责。注册中心的演进是随着业务架构和需求的发展而进行演进的。腾讯当前内部服务数超百万级,日调用量超过万亿次,使用着统一的注册中心 ——

[转帖]10 张图搞懂服务注册发现机制

http://blog.itpub.net/70024420/viewspace-2926779/ 在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握。 引入服务注册与发现组件的原因 先来看一个问题,假如现在我

[转帖]微服务的简介和技术栈

https://www.cnblogs.com/PatrickLiu/p/13925259.html 一、简介 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能、高吞吐率、高稳定性、高扩展等特性提出了更高的要求。可以说业务需求是软件架构能力的第一推动力,由于这些因素导致了软件架构

[转帖]systemd写微服务启动脚本范例

https://blog.csdn.net/m0_46897923/article/details/125338465?spm=1001.2014.3001.5501 systemd写微服务启动脚本范例 1.下面是一个使用systemd写的服务的启动脚本模板:2.下面是笔者服务的实例3.system

[转帖]微服务基础设施搭建必做的 4 件事

https://www.jianshu.com/p/9d61aa5c16c1 建议阅读方式 可前往语雀阅读,体验更好:微服务基础设施搭建必做的 4 件事 背景介绍 随着流量与业务复杂度的日益增加,包括敏捷研发理论的普及,大型网站往往采用分治的方式,将整个系统划分为若干个内部相对自治的子模块 比如电商

[转帖]微服务并不是银弹

https://www.oschina.net/translate/microservices-not-a-silver-bullet?print 让我们看一个公司/客户与前端框架技术团队之间的典型对话。 这是你从公司/客户那里听到的,技术团队因此而疯狂。当整个世界都从微服务中获益时,为什么不应该采

[转帖]常见的Socket网络异常场景分析

https://www.cnblogs.com/codelogs/p/16001770.html 简介# 在目前微服务的背景下,网络异常越来越常见了,而有一些网络异常非常模糊,理解什么情况下会导致什么异常,还是有一定难度的,为此我做了大量实验,来复现各种异常场景。 socket状态变迁图# 先快速回