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.rhkb.cn/news/84394.html

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

相关文章

Ansible的安装和配置

安装和配置 Ansible 安装所需的软件包 创建名为 /home/greg/ansible/inventory 的静态清单文件,以满足以下要求: 172.25.250.9 是 dev 主机组的成员 172.25.250.10 是 test 主机组的成员 172.25.250.11 和 172.25.250.12 是 prod 主机组的成员 172.2…

halo --- 上传图片服务器错误

文章目录 问题定位过程1、查看日志 报错的是数据库操作异常2、再次上传一张小一点的图片3、检查nginx的配置文件 原因解决 问题 上传图片时,报错服务器错误(包括上传附件、博客文章插入图片、上传相册) 定位过程 1、查看日志 报错的是数据库…

Element组件浅尝辄止4:Button组件

Button按钮组件&#xff1a;用途太广泛了&#xff0c;几乎参与到了日常开发中的方方面面 1.如何使用&#xff1f;How? //使用type、plain、round和circle属性来定义 Button 的样式。<el-row><el-button>默认按钮</el-button><el-button type"primar…

企业微信 企业内部开发 学习笔记

官方文档 文档 术语介绍 引入pom <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-cp-spring-boot-starter</artifactId><version>4.5.3.B</version></dependency>核心代码 推送消息 final WxCp…

【Spring专题】Spring底层核心原理解析

目录 前言阅读导航前置知识Q1&#xff1a;你能描述一下JVM对象创建过程吗&#xff1f;Q2&#xff1a;Spring的特性是什么&#xff1f;前置知识总结 课程内容一、Spring容器的启动二、一般流程推测2.1 扫描2.2 IOC2.3 AOP 2.4 小结三、【扫描】过程简单推测四、【IOC】过程简单推…

分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

文章目录 1. kafka 生产者发送消息整体架构2. Kafka 生产者重要参数配置01. acks02. 消息传递时间03. linger.ms04. buffer.memory05. batch.size06. max.in.flight.requests.per.connection07. compression.type08. max.request.size09. receive.buffer.bytes和 send.buffer.b…

uniapp 微信小程序 封装公共的请求js(api版本)

一、新建api文件夹 在项目目录下创建api文件夹&#xff0c;内放files跟index.js文件夹&#xff0c;files文件夹内放每个页面对应的js请求接口 1、index.js /*** api接口的统一出口*/ const api {}; const requireComponent require.context(./files, false, /\.js$/) requi…

ssm亚盛汽车配件销售业绩管理统源码和论文PPT

ssm亚盛汽车配件销售业绩管理统源码和论文PPT007 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 研究的意义 汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时…

『PostgreSQL』在 PostgreSQL中创建只读权限和读写权限的账号

&#x1f4e3;读完这篇文章里你能收获到 理解在 PostgreSQL 数据库中创建账号的重要性以及如何进行账号管理掌握在 PostgreSQL 中创建具有只读权限和读写权限的账号的步骤和方法学会使用 SQL 命令来创建账号、为账号分配适当的权限以及控制账号对数据库的访问级别了解如何确保…

HBase-写流程

写流程顺序正如API编写顺序&#xff0c;首先创建HBase的重量级连接 &#xff08;1&#xff09;读取本地缓存中的Meta表信息&#xff1b;&#xff08;第一次启动客户端为空&#xff09; &#xff08;2&#xff09;向ZK发起读取Meta表所在位置的请求&#xff1b; &#xff08;…

MySQL 建表 及其 表的约束类型

目录 步骤&#xff1a; 1、选择数据库(mydb--自定义数据库) 2、建立班级表 3、建立学生表 4、增加约束删除约束 增添约束&#xff1a; 删除约束&#xff1a; 以班级表和学生表为例说明表的约束类型 步骤&#xff1a; 1、选择数据库(mydb--自定义数据库) 2、建立班级表 …

【图像去噪的扩散滤波】基于线性扩散滤波、边缘增强线性和非线性各向异性滤波的图像去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SQL SERVER ip地址改别名

SQL server在使用链接服务器时必须使用别名&#xff0c;使用ip地址就会把192.188.0.2这种点也解析出来 解决方案&#xff1a; 1、物理机ip 192.168.0.66 虚拟机ip 192.168.0.115 2、在虚拟机上找到 C:\Windows\System32\drivers\etc 下的 &#xff08;我选中的文件&a…

maven Jar包反向install到本地仓库

maven Jar包反向install到本地仓库 需求实现 需求 项目打包时报错&#xff0c;缺少一个jar包。 但是在maven仓库都找不到此jar包&#xff0c;其他人提供了这个jar包。 需要把这个jar包install到本地仓库&#xff0c;使项目能正常打包运行。 实现 使用git bash命令执行以下脚…

24聊城大学823软件工程考研

1.软件发展有几个阶段&#xff1f;各有何特征&#xff1f; ①程序设计阶段 硬件特征&#xff1a;价格贵、存储容量小、运行可靠性差。 软件特征&#xff1a;只有程序、程序设计概念&#xff0c;不重视程序设计方法。 ②程序系统阶段。 硬件特征&#xff1a;速度、容量及工作可…

Redis的RDB持久化

Redis是一个键值对数据库服务器&#xff0c;服务器中通常包含着任意个非空数据库&#xff0c;而每个非空数据库中又可以包含任意个键值对&#xff0c;为了方便起见&#xff0c;我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 举个例子&#xff0c;下图展示了一…

使用自己的数据集预加载 Elasticsearch

作者&#xff1a;David Pilato 我最近在讨论论坛上收到一个问题&#xff0c;关于如何修改官方 Docker 镜像以提供一个现成的 Elasticsearch 集群&#xff0c;其中已经包含一些数据。 说实话&#xff0c;我不喜欢这个想法&#xff0c;因为你必须通过提 entrypoint.sh 的分叉版本…

一文详解 DolphinDB SQL 标准化

1. 与标准 SQL 的兼容性 在脚本层面&#xff0c;自 1.30.22 / 2.00.10 版本起&#xff0c;DolphinDB SQL 开始支持&#xff1a; 关键字全大写或全小写的书写方式脚本的换行不影响语法解析&#xff0c;但存在两种特殊情况&#xff1a; 组合关键字不允许拆分&#xff0c;如 ord…

PromQL实现Actuator获取的JVM指标的Full GC次数监控

Spring Boot 版本需要2.0.0或更高版本。 添加Micrometer Prometheus registry依赖: <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId> </dependency>在application.properties中开…

去趋势化一个心电图信号、信号功率谱、低通IIR滤波器并平滑信号、对滤波器引起的延迟进行补偿研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…