《微服务架构设计模式》第三章 微服务架构中的进程间通信

news2024/11/16 1:34:32

内容总结自《微服务架构设计模式》

微服务架构中的进程间通信

    • 一、通信概述
      • 通信方式
      • API定义
      • 消息格式
    • 二、同步通信
      • REST
      • gRPC
      • 断路器
      • 服务发现
    • 三、异步通信
      • 消息
      • 消息通道
      • 消息代理
      • 消息问题

)


一、通信概述

通信方式

有很多进程间通信技术可供开发者选择。服务可以使用基于同步请求/响应的通信机制,例如HTTP REST或gRPC。另外,也可以使用异步的基于消息的通信机制,比如AMQP或STOMP。消息的格式也不尽相同。服务可以使用具备可读性的格式,比如基于文本的JSON或XML。也可以使用更加高效的、基于二进制的Avro或Protocol Buffers 格式。

客户端和服务端的交互方式可以分为两个不同的维度
维度一:一对一、一对多
维度二:同步模式、异步模式

一对一一对多
同步模式请求/响应
异步模式异步请求/响应
单向通知
发布/订阅
发布/异步响应

API定义

相比于单体架构,我们面临的挑战在于:并没有一个简单的编程语言结构可以用来构造和定义服务的API。根据定义,服务和它的客户端并不会一起变一。如果使用不兼容的API部署新版本的服务,虽然在编译阶段不会出现错误,但是会在运行时故障。


API需要优先设计

即使在那些最简单的项目中,组件和API之间也经常发生冲突。例如,负责后端的Java程序员和负责前端的AngularJS程序员都声称完成了开发,然而这个应用程序却无法工作。前端的REST和WebSocket API无法与后端的API一起工作。最终导致这个应用程序的前端和后端无法正常通信!

在现代应用程序中,对API有着极高的可用性要求,一般会采用滚动升级的方式来更新服务,因此一个服务的旧版本和新版本肯定会共存。所以在处理API的时候存在相关的措施:

  1. 语义化的版本控制:规范化如何使用版本号,正确的方式递增版本号
  2. 进行次要并且向后兼容的改变:添加可选属性、向响应添加属性、添加新操作
  3. 进行主要并且不向后兼容的改变:服务强制客户端升级,必须同时支持新老版本API

消息格式

消息的格式可以分为两大类:文本(JSON、XML等)和二进制(Protocol Buffers、Avro等)




二、同步通信

请添加图片描述


REST

REST是一种(总是)使用HTTP协议的进程间通信机制。REST提供了一系列架构约束,当座位整体使用时,它强调组件交互的可扩展性、接口的通用性、组件的独立部署,以及那些能减少交互延迟的中间价,它强化了安全性,也能封装遗留系统。

REST中的一个关键概念是资源,它通常表示单个业务对象,例如客户或产品,或业务对象的集合。REST使用HTTP动词来操作资源,使用URL饮用这些资源。

好处:

  1. 它非常简单,并且大家都很熟悉
  2. 可以使用浏览器扩展(比如Postman插件)或者curl之类的命令行(假设使用的是JSON或其他文本格式)来测试HTTP API
  3. 直接支持请求/响应方式的通信
  4. HTTP对防火墙友好
  5. 不需要中间代理,简化系统架构

弊端:

  1. 它只支持请求/响应方式的通信
  2. 可能导致可用性降低。由于客户端和服务直接通信而没有代理来缓冲消息,因此他们必须在REST API调用期间都保持在线
  3. 客户端必须知道实例的位置(URL),这是现在应用程序中的一个重要问题。客户端必须使用所谓的服务发现机制来定位服务实例
  4. 在单个请求中获取多个资源具有挑战性
  5. 有时很难将多个更新操作映射到HTTP动词

gRPC

gRPC是REST的另一种替代方案,这是一个用于编写跨语言客户端和服务端的框架。gRPC使用Protocol Buffers是一种高效且紧凑的二进制格式。他是一种标记格式。

好处:

  • 设计具有复杂更新操作的API非常简单。
  • 它具有高效、紧凑的进程间通信机制,尤其是在交换大量消息时。支持在远程过程调用和消息传递过程中使用双向流式消息方式。
  • 它实现了客户端和用各种语言编写的服务端之间的互操作性。

弊端:

  • 与基于REST/JSON的API机制相比,JavaScript客户端使用基于gRPC的API需要 做更多的工作。
  • 旧式防火墙可能不支持HTTP/2。

gRPC是REST的一个引人注目的替代品,但与REST一样,它是一种同步通信机制,因此它也存在局部故障的问题。


断路器

本质就是微服务中提到的服务熔断和降级

当一个服务同步调用另一个服务时,它应该使用Netflix描述的方法来保护自己,这种方法包括以下机制的组合

  • 网络超时
  • 限制客户端向服务器发送请求的数量:限流
  • 断路器模式:控制客户端发出请求的成功和失败数量

服务发现

实现服务发现有以下两种主要方式:服务及其客户直接与服务注册表交互、通过部署基础设置来处理服务发现

1、服务及其客户直接与服务注册表交互

服务实例使用服务注册表注册其网络位置

  1. 自注册:服务实例向服务注册表注册自己
  2. 客户端发现:客户端从服务表检索可用服务实例的列表,并在他们之间进行负载平衡

请添加图片描述

二、通过部署基础设置来处理服务发现

部署平台(Docker、K8S)为每个服务提供DNS名称、虚拟IP(VIP)地址和解析为VIP地址的DNS名称。

  1. 第三方注册:服务实例由第三方自动注册到服务注册表
  2. 服务端发现:客户端向路由器发出请求,路由器负责服务发现

请添加图片描述




三、异步通信

使用消息机制时,服务之间的通信采用异步交换消息的方式完成。

消息模型的定义:消息通过消息通道进行交换,发送方(应用程序或服务)将消息写入通道接收方(应用程序或服务)从通道读取消息


消息

消息由消息头部和主体组成。标题是名称和值对集合,描述正在发送的数据和元数据。除了消息发送提供的名称和值对外,消息头部还包含其他信息,例如发件人或消息传递基础设施生成的唯一消息ID,以及可选的返回地址,该地址制定发送回复的消息通道。消息正文是以文本或二进制格式发送的数据。

消息有以下几种类型:

  1. 文档:仅包含数据的通信消息
  2. 命令:一条等同于RPC请求的消息
  3. 事件:表示发送方这一端发生了重要的时间,事件通常是领域事件,表示领域对象的状态发生的更改

消息通道

请添加图片描述

有两种消息通道:

  1. 点对点通道(一对一)
  2. 发布-订阅通道(一对多)

消息代理

类比理解为具体的MQ产品(MetaQ、Kafuka等)

请添加图片描述


消息问题

处理并发和消息顺序

常见的解决方案是使用分片(分区)通道:

  1. 分片通道由两个或多个分片组成,每个分片的行为类似于一个通道
  2. 发送方在消息头部指定分片键,通常是任意字符串或字节序列。消息代理使用分片键将消息分配给特定的分片
  3. 消息代理将接受方的多个实例组合在一起,并将它们视为相同的逻辑接受方

请添加图片描述

处理重复消息

由于保证有且仅有一次的消息传递通常成本很高,所以大多数消息代理承诺至少成功传递一次消息

解决重复消息常见做法:

  1. 编写幂等消息处理程序
  2. 跟踪消息并丢弃重复项

处理事务消息

常见做法是使用数据库表作为消息队列(借助本地的ACID事务),将需要发送的消息,存储到数据库中。

将消息从数据库移动到消息代理并对外发布有两种不同方法:

  1. 通过轮询模式发布事件:定时轮询select表的数据
  2. 使用事物日志拖尾模式发布事件:监听数据库的日志文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产操作系统介绍和安装

国产操作系统 分类 操作系统分类国产操作系统银河麒麟中科方德统信UOS红旗Linux深度系统优麒麟系统 具体介绍 麒麟操作系统 麒麟操作系统(Kylin操作系统,简称麒麟OS),是一种国产操作系统,由国防科技大学研发&#x…

【Pandas】pandas用法解析(二)

一、生成数据表 二、数据表信息查看 三、数据表清洗 四、数据预处理 ———————————————— 目录 五、数据提取 1.按索引提取单行的数值 2.按索引提取区域行数值 3.重设索引 4.设置日期为索引 5.提取4日之前的所有数据 6.使用iloc按位置区域提取数据 7…

Java线程生命周期详解

前言一、线程的生命周期二、线程状态转换三、线程生命周期示例结束语 前言 Java中的线程生命周期是多线程开发的核心概念。了解线程的生命周期以及它们如何进行状态转换对于编写有效且无错误的多线程程序至关重要。 一、线程的生命周期 Java线程主要有以下几个状态&#xff…

离散数学题目收集整理练习(期末过关进度80%~100%)完结撒花

✨博主:命运之光 🦄专栏:离散数学考前复习(知识点题) 🍓专栏:概率论期末速成(一套卷) 🐳专栏:数字电路考前复习 🌟博主的其他文章&…

UG NX二次开发(C#)-外部模式-导出dwg格式文件

文章目录 1、前言2、在UG NX界面中导出DWG的操作2.1 打开三维模型2.2 创建二维工程制图2.3 导出工程图纸3、采用NXOpen(C#)二次开发实现1、前言 在我们实际使用过程中,经常会用到不同软件之间的数据转换,数据转换是通过通用标准文件来实现的。当然,在三维转二维过程中,dwg…

4.部署Placement服务

Placement服务是从nova服务中拆分出来的组件,Placement组件应该在 Nova之前安装; Placement服务用于跟踪节点资源(比如计算节点,存储资源池,网络资源池等)的使用情况,提供自定义资源的能力&…

CSS基础学习--14 Position(定位)

一、定义 position属性指定了元素的定位类型 position 属性的五个值: staticrelativefixedabsolutesticky 元素可以使用的顶部,底部,左侧和右侧属性定位。然而,这些属性无法工作,除非是先设定position属性。他们也有…

scratch lenet(1): 读写 pgm 图像文件

scratch lenet(1): 读写 pgm 图像文件 文章目录 scratch lenet(1): 读写 pgm 图像文件1. 目的2. pgm 格式介绍2.1 概要2.2 meta 信息2.3 像素内容 3. 创建 .pgm 文件4. 使用C语言读取 .pgm 灰度图文件4.1 实现4.2 解释 5. 使用C语言保存 .pgm 灰度图文件 1. 目的 最近在 githu…

车载软件架构 —— 闲聊几句AUTOSAR OS(四)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

初识Telegraf、InfluxDB和Grafana铁三角形成的监控可视化解决方案

文章目录 前言原始的监控靠人盯进化的监控靠批处理脚本高端的监控靠完整的可视化解决方案Telegraf、InfluxDB和Grafana铁三角TelegrafInfluxDBGrafana Grafana仪表板展示服务器资源总览负载和内存使用网络带宽磁盘IOIO延迟其他指标进程信息 总结 前言 数据监控目前用于各行各业…

Cracking C++(13): 读取不超过n个字符

文章目录 1. 目的2. 正确用法实例3. 纠正错误用法3.1 错误用法3.2 让 AddressSanitizer 告诉你错误3.3 解释 4. 总结 1. 目的 在读取 pgm 格式图像的 meta 信息时, 使用了 %2s 这个格式串, 之前不是很了解, 尝试后发现, 如果不小…

花上半小时帮你快速熟悉微服务架构

本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。 要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对…

读发布!设计与部署稳定的分布式系统(第2版)笔记02_停飞的代码异常

1. 以前“计划内的停机”很正常,现在则不被接受 2. 高可用性架构 2.1. CF系统不会遇到任何常见的单点失效问题 2.1.1. 硬件的每一部分都有冗余 2.1.1.1. CPU 2.1.1.2. 驱动器 2.1.1.3. 网卡 2.1.1.4. 电源 2.1.1.5. 网络交换机 2.1.1.6. 风扇 2.1.2. 为了…

Redis哨兵模式的配置

1.环境准备 master节点1个slave节点2个sentinel【哨兵】节点3个redis版本5.0.3操作系统:Centos7 2.主从节点配置 创建redis-conf目录,此目录用于存放主从节点的配置文件 复制redis.conf,然后创建三个配置文件:redis-6379.conf&…

循环缓冲题目

题目:一环形缓冲区由 6 个缓冲区 0~5 组成,其中 Full 表示装满数据的缓冲区,Empty 表示空缓冲区。按照顺时针方向,指针 Pf 指向第一个 “满” 缓冲区,指针 Pe 指向第一个 “空” 缓冲区。进程 In 在 Pe 指示下不断向 E…

XSS数据接收网站——XSS在线平台

文章目录 前言使用步骤1、进入到xss在线平台主页2、创建项目3、生成攻击poc4、查看返回结果 前言 平台的网址是: 链接: XSS在线平台 使用步骤 1、进入到xss在线平台主页 2、创建项目 我的项目,点击创建,项目名称和描述随便填,…

Docker安装和使用,Docker拉取Mysql.

Docker Unbuntu安装dockerdocker的相关操作开启docker服务查看镜像搜索镜像拉取镜像删除镜像运行容器查看容器停止运行容器重新运行容器删除容器构建一个Docker镜像登陆Dockerhub提交镜像到dockerhub退出dockerhub进入正在运行的容器的交互式终端其他docker操作 docker拉取mysq…

qemu arm Linux 环境测试交叉编译的 glib 库 测试用例 tests

环境搭建 ubuntu 20.04 arm 平台交叉编译 glib 库 交叉编译 glib 库 glib 库 本身带有大量的测试用例 tests,分别在 glib 各个模块目录下的 tests 目录,如果是 ARM Linux 平台的交叉编译,可以开启 installed_tests 选项 开启 glib tests 测…

2.pixi.js编写的塔防游戏(类似保卫萝卜)-场景编辑器

游戏说明 一个用pixi.js编写的h5塔防游戏,可以用electron打包为exe,支持移动端,也可以用webview控件打包为app在移动端使用 环境说明 cnpm6.2.0 npm6.14.13 node12.22.7 npminstall3.28.0 yarn1.22.10 npm config list electron_mirr…

一种正弦信号叠加高频噪声的信号基频率准确测量方法

1.问题 当信号叠加有高频噪声时,特别是类似有变频器这类强干扰源存在的情况下,如何测得信号的准确频率,是个问题。FFT要求长时间采样,对于嵌入式应用,采样点数和时间消耗都是个问题。而即使用示波器的波形叠加功能&…