06微服务间的通信方式

一句话导读

        微服务设计的一个挑战就是服务间的通信问题,服务间通信理论上可以归结为进程间通信,进程可以是同一个机器上的,也可以是不同机器的。服务可以使用同步请求响应机制通信,也可以使用异步的基于消息中间件间的通信机制。同步的有restful、RPC等方式,异步的有各种mq中间件,如rabbitmq、rocketmq、kafka等,还有一些不常用的通讯方式,如websocket可以让服务间建立长链接,数据共享方式可以让服务通过数据库或文件的方式进行通讯。

目录

一句话导读

一、什么是通信

        1.定义

        2.通信媒介

        3.通信协议

二、微服务的通信方式有哪些

        1.微服务的同步通信

       (1) REST方式

        (2) gRPC方式

2.微服务的异步通信


一、什么是通信

        1.定义

        百度百科的解释:通信是指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法、任意媒质,将信息从某方准确安全地传送到另方。

        维基百科的解释:通信是发送者通过某种媒体以某种格式来传递信息到收信者以达致某个目的。广义上,任何信息的交通都是通信,狭义上的通信专指以电为载体进行的信息交流,所以很多时候,“通信”与“电信”的含义相近,不特别加以区分。通信技术拉近了人与人之间的距离,提高了通信的效率,深刻的改变了人类的沟通方式。

        整体来看,至少一点是通用共识的,就是通信发送者通过媒介将信息传递给接收者,而这里的发送者、接收者可以是人与人、人与自然界,机器与机器、人与机器等等。

        2.通信媒介

        在定义中提到的媒介就是通信媒介,那么具体什么是通信媒介呢?

        通信媒介指的是信息传递的物理或逻辑通道,它是信息传递的途径或介质。通信媒介可以是多种形式,包括电缆、无线信号、光纤、空气等。在不同的场景中,使用不同的通信媒介来传递信息。例如,在计算机网络中,通信媒介可以是以太网、Wi-Fi等;在人际交往中,通信媒介可以是声音、文字、图像等。

        3.通信协议

        人们要相互理解各自传递的信息,我们双方就要约定一个规则,比如我们通过声音说汉语或者通过文字写英文来传递信息,这里提到的说汉语、写英文那就是我们约定的规则,也就是通信协议。能够保障发送者、接收者都能够理解信息的含义。

        通信协议指的是在信息传递过程中所遵循的规则和约定,以确保信息能够正确、可靠地传递和解释。通信协议规定了信息的格式、传输方式、错误检测和纠正方法等。通信协议是确保通信双方能够相互理解并成功交流的基础。例如,在计算机网络中,TCP/IP协议是常用的通信协议;在人类交往中,语言和符号也是通信协议的一种形式。

二、微服务的通信方式有哪些

        微服务之间的通讯方式可以有很多,我们可以分成两个维度去总结,一个是接收端多少的维度,一个是接口阻塞情况维度。通过接收端多少我们可以分为,点对点模式和广播模式,点对点模式则是发送者只向一个接收者发送消息,广播模式,则是发送者通过广播的信息发送给众多的接收者;通过接口阻塞情况维度可以分为同步通信和异步通信,同步通信则是发送者发送消息后需要等待接收者响应,等待的过程则是阻塞过程。异步通信则是发送者将消息发送出去后,就不用管了,接收者处理消息时,发送者还可以做其他事,不阻塞等待响应。

        1.微服务的同步通信

        常见的有这两种方式:REST方式、gRPC方式

       (1) REST方式

        REST(Representational State Transfer)是一种网络架构风格,用于设计分布式系统中的网络应用程序。它最初由Roy Fielding在他的博士论文中提出,并在2000年被正式引入。REST强调以资源为中心,通过使用一组预定义的操作对这些资源进行状态转移和交互。

        REST 的核心思想是将资源(Resource)暴露为一组统一的、易于理解的URL,并使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来对资源进行操作。每个资源可以用一个唯一的URL进行访问,而HTTP方法则指示了对该资源要执行的操作。例如,通过GET请求获取资源,资源可以通过xml、json对象、二进制等形式作为载体。通过PUT请求更新资源等等,在springcloud中,feign模式是将http请求进行了进一步封装。本质还是通过REST方式做服务间的交互的。

        REST 的特点

  •  无状态性(Statelessness):

        每个HTTP请求都应该包含足够的信息来执行请求,服务器不应该依赖之前的请求来理解当前的请求。这使得服务端不需要维护客户端的状态,使系统更简单和可扩展。

  • 资源导向(Resource-Oriented):

        REST 架构将数据或功能抽象为资源,每个资源都有一个唯一的标识符(URL)。客户端通过对资源进行操作来实现不同的业务功能。

  • 统一接口(Uniform Interface):

        REST 使用一组统一的操作方法(HTTP方法)来对资源进行操作,包括GET(获取)、POST(创建)、PUT(更新)和DELETE(删除)等。这简化了客户端和服务器之间的交互。

  • 缓存(Caching):

        REST 鼓励使用缓存来提高性能。服务器可以在响应中指定是否允许客户端缓存响应,以减少重复请求。

  • 按需获取(Client-Server):

        REST 鼓励将客户端和服务器分离,客户端负责用户界面和用户体验,服务器负责数据存储和业务逻辑。

  • 分层系统(Layered System):

        REST 支持构建分层的系统结构,每一层都只知道与之相邻的层,这有助于提高系统的可伸缩性和灵活性。

  • 自描述性(Self-Descriptive):

        REST 的响应应该包含足够的信息,使客户端能够理解如何处理响应的数据。这可以通过使用标准的媒体类型(如JSON、XML)和自描述的标头来实现。

  • 跨平台(Platform-Independent):

        REST 架构不依赖于特定的编程语言或技术栈,使得不同平台的应用程序能够相互通信和交互。

        (2) gRPC方式

        gRPC 是一种高性能、开源的远程过程调用(RPC)框架,最初由 Google 开发并开源。它允许不同的应用程序在不同的环境中进行通信,使用了现代的协议和序列化机制,如 Protocol Buffers(ProtoBuf),以提供高效、可靠的跨网络通信。

以下是 gRPC 的一些关键特点和组成部分:

  • 基于 HTTP/2:

        gRPC 基于 HTTP/2 协议,可以在一个连接上进行多路复用,减少了连接的数量,提高了性能。

  • 多种支持语言:

        gRPC 提供了多种编程语言的支持,包括 Java、C++、Python、Go、C#、Node.js 等,使得不同语言的应用程序可以进行跨平台的通信。

  • IDL(Interface Definition Language):

        使用 Protobuf(Protocol Buffers)定义服务接口,IDL 会自动生成客户端和服务器端的代码,使得开发者可以专注于业务逻辑的实现。

  • 支持多种通信模式:

        gRPC 支持多种通信模式,包括简单的请求-响应、流式请求、流式响应和双向流式通信。

  • 强大的错误处理和元数据支持:

        gRPC 提供了丰富的错误处理和状态码,以及对元数据(Metadata)的支持,使得开发者可以更好地进行错误处理和上下文传递。

  • 拦截器:

        gRPC 支持拦截器机制,可以在客户端和服务器端添加拦截器,用于处理日志、认证、鉴权等逻辑。

  • 性能优越:

        gRPC 基于二进制协议,序列化效率高,性能优越,适用于高并发和低延迟的场景。

2.微服务的异步通信

服务间的异步通信采用异步交换消息的方式完成,如RabbitMq、kafka

Kafka和RabbitMQ都是消息队列系统,它们的主要区别包括:

  • 通信模型:Kafka基于发布-订阅模型,而RabbitMQ则采用了AMQP协议、MQTT协议等不同模型,支持点对点和发布-订阅等模型。
  • 性能与可靠性:Kafka在高并发、大数据流时表现更出色,可实现每秒百万级别的数据处理;而RabbitMQ采用了AMQP协议,能够保证消息传输的可靠性和事务处理能力。
  • 数据存储:Kafka将消息以文件的形式存储在磁盘上,存储的消息不会立刻被消费;而RabbitMQ则采用内存缓存,消息一旦发送就会立刻被消费掉,存储的消息数受到限制。
  • 集群架构:Kafka支持集群架构的高可用和分区;而RabbitMQ则基于主从架构,支持镜像队列、负载均衡等机制。

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

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

相关文章

【云原生|Kubernetes】14-DaemonSet资源控制器详解

【云原生|Kubernetes】14-DaemonSet资源控制器详解 文章目录 【云原生|Kubernetes】14-DaemonSet资源控制器详解简介典型用法DaemonSet语法规则Pod模板Pod 选择算符在选定的节点上运行 Pod DaemonSet的 Pods 是如何被调度的污点和容忍度DaemonSet更新和回滚DaemonSet更新策略执…

MySQL登录成功后密码修改

场景 最近想通过CLI登录一台远古MySQL,结果遇到CLI密码不对,但是,GUI程序之前自动记住密码能够正常登录使用。 思路 通过GUI方式登录,修改密码后,再让新密码生效后,重新使用CLI方式登录MySQL 解决 通过…

Vue2-简介、模板语法、数据绑定、MVVM、数据代理、事件处理

🥔:成功之后就能光明正大地回望所有苦难 VUE-Day1 Vue简介1、Vue是什么?2、谁开发的? 发展历程?3、Vue的特点4、容器和实例、实例中的el和data总结 Vue模板语法插值语法指令语法 数据绑定1.单向数据绑定(v-…

51单片机学习--DS18B20温度读取温度报警器

需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明: sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来: unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…

opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以…

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…

javaweb监听器和juery技术

监听servlet创建 package com.hspedu.listener;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;/*** 老韩解读* 1. 当一个类实现了 ServletContextListener* 2. 该类就是一个监听器* 3. 该类可…

VoxWeekly|The Sandbox 生态周报|20230807

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布,对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容,欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter,并加入 Discord 社区&#xf…

OpenCV和PIL图像对象转换

OpenCV和PIL(Python Imaging Library)都是常用的Python图像处理库。它们都有自己的图像对象类型,因此在使用它们时需要进行相应的转换。 下面是OpenCV图像对象和PIL图像对象之间的转换方法: 将OpenCV图像对象转换为PIL图像对象&…

npm发包中一些操作备忘

1、npm发布相关命令 发布 npm publish 发布beta版 npm publish --tag beta 取消发布 npm unpublish --force 2、lerna发布相关命令 发布 lerna publish 其他的的官方文档里面比较全 lerna中文文档

【Vue3】keep-alive 缓存组件

当在 Vue.js 中使用 <keep-alive> 组件时&#xff0c;它将会缓存动态组件&#xff0c;而不是每次渲染都销毁和重新创建它们。这对于需要在组件间快速切换并且保持组件状态的情况非常有用。 <keep-alive> 只能包含&#xff08;或者说只能渲染&#xff09;一个子组件…

CANoe通过Frame Histogram窗口统计报文周期(方便快捷)

文章目录 效果展示1.插入Frame Histogram窗口2.Activate3.运行CANoe&#xff0c;停止后查看write窗口 效果展示 统计报文周期信息输出在write窗口。 1.插入Frame Histogram窗口 2.Activate 3.运行CANoe&#xff0c;停止后查看write窗口 统计报文周期信息输出在write窗口。

安卓开发上位机基于Qt qwidget第一次一些事

话说为什么要用Qt搞安卓&#xff0c;那肯定是因为熟悉Qt啊&#xff0c;总不能能在学java那一套东西吧&#xff0c;我相信Qt搞出来的性能上会好很多…… 目录 1、是开发环境搭建 2、关文件读写权限问题 3、关于调试 4、AP热点模式IP地址不是固定的 5、比较顺利的点 1…

04-2_Qt 5.9 C++开发指南_SpinBox使用

文章目录 1. SpinBox简介2. SpinBox使用2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. SpinBox简介 QSpinBox 用于整数的显示和输入&#xff0c;一般显示十进制数&#xff0c;也可以显示二进制、十六进制的数&#xff0c;而且可以在显示框中增加前缀或后缀。 QDoubleSpinBox…

Shell编程基础(十三)正则表达式

正则表达式 正则表达式元数据普通元字符扩展元字符 总结^ 和 \< 的区别 以及 $ 和 \> 的区别* ? {}的区别 正则表达式 格式&#xff1a;^ 表达式 $ 在不同的场景下&#xff0c;定义是一样&#xff0c;但使用要按照具体的命令去调用&#xff0c;中间的表达式都是通用的…

机器学习笔记:李宏毅ChatGPT课程1:刨析ChatGPT

ChatGPT——Chat Generative Pre-trained Transformer 1 文字接龙 每次输出一个概率分布&#xff0c;根据概率sample一个答案 ——>因为是根据概率采样&#xff0c;所以ChatGPT每次的答案是不一样的&#xff08;把生成式学习拆分成多个分类问题&#xff09;将生成的答案加到…

Linux(进程)

Linux&#xff08;进程&#xff09; 1. 冯诺依曼结构体系2 . 操作系统&#xff08;OS&#xff09;3.进程task_ struct内容分类查看进程查看PID以及PPIDfork()Linux操作系统进程的状态僵尸进程孤儿进程进程优先级其他概念 1. 冯诺依曼结构体系 冯诺依曼结构也称普林斯顿结构&am…

C++ | 查看结构体中成员变量在内存中的偏移量(结构体内存对齐)

内存在使用过程并不是单一的依次排列&#xff0c;而是按照某种既定的规则来进行对齐&#xff0c;以方便快速访问 内存的对齐原则有以下三条: 数据成员对齐:成员根据其自身大小&#xff0c;从自身大小的整数倍内存地址(以第一个元素存储在0位置为参考)开始存储结构体成员对齐:如…

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注…

让我目瞪口呆的BUG:网络问题导致的双主从故障

引言&#xff1a; 在软件开发过程中&#xff0c;我们经常会遇到各种各样的BUG。有些BUG会让我们感到困惑和无奈&#xff0c;而有些则让我们目瞪口呆。今天我要和大家分享的就是我在开发过程中遇到的一个令人难以置信的BUG&#xff0c;即由于网络问题导致的双主从故障。 问题背…