系统设计之通讯协议

一、通讯协议

架构风格定义了应用程序编程接口 (API) 的不同组件如何相互交互。因此,它们通过提供设计和构建 API 的标准方法来确保效率、可靠性以及与其他系统集成的便捷性。以下是最常用的样式:

1. SOAP

成熟、全面、基于XML

最适合于企业应用

  • 可扩展性:通过在SOAP消息中添加自定义的XML元素,可以扩展协议以满足不同的需求。
  • 独立性:可以使用不同的底层传输协议进行通信,如HTTP、SMTP等。
  • 中立性:可以在不同的平台和操作系统之间进行通信,不限制使用的编程语言。
  • 安全性:可以通过添加安全性相关的标签和协议来保证通信的安全性。

2. RESTful

流行且易于实现的HTTP方式

非常适用于web服务

RESTful 的设计思想是将资源(Resource)作为核心,每个资源都有一个特定的URL,通过HTTP方法(如GET、POST、PUT、DELETE等)来对资源进行操作,而不同的HTTP方法实现了对资源的不同操作。使用RESTful API的开发者只需要通过 HTTP 请求指定资源的URL和HTTP方法即可进行相应的操作。因此 RESTful API 支持多种数据格式,如JSON、XML、YAML等。

通过 RESTful 接口,客户端可以通过标准的 HTTP 方法对特定资源进行读取、添加、修改、删除及搜索等操作,RESTful 接口本身具备良好的可扩展性、独立性和兼容性,因此得到了广泛的应用和支持。并且RESTful遵循HTTP协议定义的状态码,使得其能够提供可靠的、稳定的网络服务。此外,RESTful 还支持多种安全性协议和编码方式,保证系统和数据的安全性和隐私性。

相比于传统的 SOAP 协议,RESTful 更加轻量、灵活,且简化了整个系统的架构和设计,支持快速的开发和迭代,具有更好的可读性、可维护性、伸缩性和可扩展性,是一种更加适合构建现代分布式系统的API架构设计。

3. GraphQL

查询语言,请求特定的数据

减少网络开销,响应速度快

以下是GraphQL的一些优点:

  1. 灵活性:GraphQL允许客户端精确地指定所需的数据,避免了过度获取和返回不必要的数据。客户端可以在单个请求中获取多个资源,并减少了网络传输的数据量,提高了性能。
  2. 自描述性:GraphQL的数据模型和查询语言具有自描述性。客户端可以通过查询语句获取数据模型的结构信息,从而更好地理解和开发,减少了文档的依赖和沟通成本。
  3. 数据的聚合和组合:GraphQL允许客户端通过查询语句来聚合和组合多个数据源的数据。这种能力可以在单个请求中获取来自多个资源和服务的数据,提供更灵活的数据组织和组合。
  4. 版本控制:GraphQL提供了一种简单而有效的方式来进行版本控制,客户端可以通过指定所需的字段和类型来控制所使用的数据模型和API版本。
  5. 社区支持:GraphQL拥有一个活跃的开发和社区生态系统,在开源社区中得到广泛的支持和发展。

然而,GraphQL也有一些缺点:

  1. 学习曲线:相对于传统的REST接口,学习GraphQL的概念和语法可能需要一些时间。需要熟悉GraphQL的查询、类型系统和数据模型等概念。
  2. 服务端复杂性:GraphQL在服务端的实现可能有一定的复杂性。需要构建和维护用于解析和组织数据的GraphQL服务器。
  3. 不适用于简单场景:对于简单的API和小规模的项目,GraphQL可能会带来不必要的复杂性和开销,并不一定适用于所有的场景。

总的来说,GraphQL在灵活性、性能和开发效率方面具有许多优点,但在复杂性和学习曲线方面可能存在一些挑战。选择是否使用GraphQL需要根据具体需求和项目规模来权衡优缺点。

4. gRPC

经典、高性能协议换中区

适合微服务架构

以下是gRPC的一些优点:

  1. 高性能:在传输效率上,gRPC使用HTTP/2协议和Protocol Buffers编码,采用了流、复用、头压缩等技术,可以实现低延迟和高吞吐量。相比于基于HTTP1.x和SOAP等协议,gRPC具有更高的性能和效率。
  2. 跨语言支持:gRPC支持多种编程语言,如Java、C++、Python、Golang等,使得不同语言的应用能够使用相同的RPC调用方式进行通信,无需关注底层实现细节。
  3. 简单易用:gRPC使用Protocol Buffers提供IDL,可以快速且语言无关地定义接口,简化了API开发和维护工作。同时,gRPC生成代码和文档等工具简化了客户端和服务端的开发和测试的工作量,提高了开发效率。
  4. 安全性:gRPC支持应用层加密、身份验证等安全机制,保证通信的安全性。此外,还支持传输层安全协议(TLS)等其他机制来保护通讯的安全性。
  5. 可扩展性:gRPC允许开发者和用户通过自定义拦截器和插件等方式来扩展其功能,以满足不同的企业级应用和需求。

虽然gRPC在高性能、跨语言支持和简化开发等方面具有很多优点,但是也存在一些缺点:

  1. 学习成本:相比于其他RPC框架,gRPC使用IDL语言和编码规则可能需要一些时间来学习和理解。
  2. 对底层协议的依赖:gRPC的高效性和性能优势来自于HTTP/2和Protocol Buffers编码等技术,而这些技术在某些环境和场景下可能会面临限制和局限性。

总体来说,gRPC作为一个RPC框架,在性能、透明化的实现细节、多语言支持、自动生成的模板代码等方面具有很多优点。但是,它也不能完全适用于所有的场景和应用,需要根据实际需求和场景进行选择。

5. WebSocket

实时、双向、持久连接

非常适合低延时数据交换

以下是WebSocket的一些优点:

  1. 实时性:WebSocket支持持久连接,可以实现实时的双向通信。服务器可以主动向客户端推送数据,而不需要客户端进行轮询或定期请求。
  2. 低延迟:由于WebSocket使用单个TCP连接进行通信,减少了连接的建立和关闭的开销,可以实现低延迟的实时通信。
  3. 更少的数据传输:相比于HTTP协议,WebSocket采用更少的头部信息,减少了数据传输的开销,提高了效率和性能。
  4. 跨域支持:WebSocket支持跨域通信,可以在不同的域之间进行实时通信,方便开发复杂的分布式系统。

然而,WebSocket也有一些缺点:

  1. 兼容性:虽然现代浏览器和服务器都已经支持WebSocket,但是在一些老旧的浏览器上可能存在兼容性问题,需要进行降级处理或使用替代方案。
  2. 长连接维持:持久连接会占用服务器资源,因此需要服务器能够有效地管理连接和资源,以避免资源的浪费和滥用。
  3. 安全性:WebSocket通信是在单个TCP连接上进行的,因此需要确保通信的安全性和保护信息的隐私性。可以通过加密和身份验证等技术来增强安全性。

总体来说,WebSocket作为实时通信的协议,在实时性和低延迟方面具有明显的优势,适用于需要实时通信和推送的应用场景。但对于一些不需要实时通信的情况,使用传统的HTTP协议也可以满足需求,并且更容易实现和维护。因此,在选择是否使用WebSocket时,需要综合考虑实际需求和使用场景。

6. Webhook

事件驱动、HTTP回调、异步

事件发生时通知系统

Webhook是一种以HTTP协议为基础的机制,用于实现应用程序之间的实时通信。通过Webhook,一个应用程序可以将特定事件的通知传递给其他应用程序,从而实现跨应用程序的数据传递和触发操作。

以下是Webhook的一些优点:

  1. 实时性:Webhook允许应用程序实时通知其他应用程序特定事件的发生,从而可以及时响应和处理需要的数据和操作。
  2. 简单易用:Webhook是基于HTTP协议的,使用简单的POST请求即可。它不需要额外的库或协议来实现,易于使用和集成到现有系统中。
  3. 可靠性:Webhook是一个可靠的机制,因为接收通知的应用程序可以通过HTTP状态码来验证通知的接收情况。
  4. 扩展性:Webhook可以通过定义和实现不同的事件和回调机制,灵活适应多种扩展和应用需求。
  5. 解耦性:通过Webhook,应用程序之间可以实现解耦,每个应用程序只需要关注自己感兴趣的事件,而不需要直接依赖其他应用程序。

然而,Webhook也具有一些缺点:

  1. 配置和管理:当涉及到多个应用程序和多个Webhook时,配置和管理可能会变得复杂和繁琐。
  2. 安全性:由于Webhook是通过HTTP请求来传递数据和触发操作的,因此在实现时需要考虑安全性,如身份验证、加密等。
  3. 可靠性:Webhook的可靠性依赖于目标应用程序的可用性和稳定性。如果目标应用程序不可用,那么通知可能会丢失或延迟。

总体来说,Webhook是一种简单而有效的实时通信机制,可以实现应用程序之间的事件通知和数据传递。它具有实时性、易用性和可靠性等优点,但在配置和管理、安全性和可靠性方面也需要进行适当的考虑和处理。选择是否使用Webhook需根据具体应用需求和使用场景来权衡其优缺点。

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

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

相关文章

STM32获取最大堆栈空间

参考 stackflow相关讨论 原理 通过参考链接,可知探测Stack的最大深度是先在stack中填充不常用的特定值,然后实时检测这些值哪些发生了变化,变化的表示使用到了这个空间,如果程序完全遍历后,有些值还是没变&#xff…

网络运维与网络安全 学习笔记2023.11.19

网络运维与网络安全 学习笔记 第二十天 今日目标 STP工作原理、STP高级配置、MSTP工作原理 MSTP配置案例、MSTP负载均衡 STP工作原理 单点故障 PC之间的互通链路仅仅存在1个 任何一个设备或链路出现问题,PC之间都会无法通信 解决方案 增加冗余/备份设备 增加冗…

9 HDFS架构剖析

问题 100台服务器,存储空间单个200GB 20T 5T文件如何存储? 128MB一块 128MB81GB 1288*10241TB 5T数据分成的128MB的块数 8192 * 5 客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。 HDFS集群有两类节点: 一个na…

成为电车销量的“中坚力量”,微小型车不能只有“低价”?

日常交通中,越来越多的汽车开始“绿牌出行”,市场的最新销量也不断验证着新能源车抢占更多市场的事实。 11月初,国内多家车企公布10月销量数据,其中新能源汽车销量增长仍然亮眼。根据中国工业和信息化部数据,我国汽车…

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案 也是昨天晚上折腾了一个晚上到凌晨四点多,实在没有头绪,在论坛,贴吧,各种求助查贴,没有什么人解决.后面请教了一个安全圈的大佬朋友给解决了. 我的问题是在kali上的,所以只写了kali 的解决方案: 修改插件: vim /opt/…

Hadoop-- hdfs

1、HDFS中的三个进程:NameNode(NN)、DataNode(DN)、SecondNameNode(SNN) 2、NameNode(NN) 1、作用: 1、接收客户端的一个读、写的服务,在namenode上存储了数据文件和datanode的映射的关系。 …

【Q1—45min】

1.epoll除了边沿触发还有什么?与select区别. epoll 是Linux平台下的一种特有的多路复用IO实现方式,与传统的 select 相比,epoll 在性能上有很大的提升。 epoll是一种当文件描述符的内核缓冲区非空的时候,发出可读信号进行通知&…

划片机新手教程:从准备工作到注意事项全解析!

随着科技的飞速发展,划片机已成为半导体行业不可或缺的一部分。对于新手来说,如何正确操作划片机显得尤为重要。以下是新手操作划片机的步骤和建议。 一、准备工作 在开始操作划片机之前,首先需要准备好以下工具和材料: 1. 划片机…

Java(三)(static,代码块,单例设计模式,继承)

目录 static 有无static修饰的成员变量 有无static修饰的成员方法 static的注意事项 代码块 静态代码块 实例代码块 单例设计模式 饿汉式单例写法 懒汉式单例写法 继承 基本概念 注意事项 权限修饰符 单继承 object 方法重写 子类方法中访问其他成员(成员变量…

Flume学习笔记(3)—— Flume 自定义组件

前置知识: Flume学习笔记(1)—— Flume入门-CSDN博客 Flume学习笔记(2)—— Flume进阶-CSDN博客 Flume 自定义组件 自定义 Interceptor 需求分析:使用 Flume 采集服务器本地日志,需要按照日志…

交易机器人-微信群通知

微信公众号:大数据高性能计算 1 背景 背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行量化交易的时候,就需要自己去做一些量化…

Linux 环境搭建

✨个人主页: Anmia.🎉所属专栏: C Language 🎃操作环境: Visual Studio 2019 版本 本章概要 1. 认识 Linux, 了解 Linux 的相关背景 2. 学会如何使用云服务器 3. 掌握使用远程终端工具 xshell 登陆 Linux 服务器 1. Li…

语义检索系统【全】:基于milvus语义检索系统指令全流程-快速部署版

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 博主首页,更多redis、java等优质好文以及各种保姆级教程等您挖掘! 目录 前言 JetBrains全家桶介绍 申请过程: 获取学…

C++类与对象(2)—构造函数析构函数

目录 一、类的6个默认成员函数 二、构造函数 1、定义 2、特征 三、析构函数 1、定义 2、特征 四、默认生成构造&析构 1、定义 2、内置类型 3、自定义类型 4、声明处给默认值 5、总结 下一篇 一、类的6个默认成员函数 如果一个类中没有定义任何成员&#xff0…

Idea2023 Springboot web项目正常启动,页面展示404解决办法

Idea2023 Springboot web项目正常启动,页面展示404解决办法 问题: 项目启动成功,但是访问网页,提示一直提示重定向次数过多,404 解决方法 在IDEA的Run/Debug Configurations窗口下当前的Application模块的Working directory中添…

python 对图像进行聚类分析

import cv2 import numpy as np from sklearn.cluster import KMeans import time# 中文路径读取 def cv_imread(filePath, cv2_falgcv2.COLOR_BGR2RGB): cv_img cv2.imdecode(np.fromfile(filePath, dtypenp.uint8), cv2_falg) return cv_img# 自定义装饰器计算时间 def…

vue中使用echarts渐变柱状图 Cannot read properties of undefined (reading ‘graphic‘)解决方法

在使用渐变颜色时报错,Cannot read properties of undefined (reading ‘graphic’) echarts也下载了,引入了,就是报错,用不了new charts, 结果换了一个版本号就可以了,本来用的"echarts": "…

7.docker运行redis容器

1.准备redis的配置文件 从上一篇运行MySQL容器我们知道,需要给容器挂载数据卷,来持久化数据和配置,相应的redis也不例外。这里我们以redis6.0.8为例来实际说明下。 1.1 查找redis的配置文件redis.conf 下面这个网址有各种版本的配置文件供…

02-1解析xpath

我是在edge浏览器中安装的xpath,需要安装的朋友可以参考下面这篇博客最新版edge浏览器中安装xpath插件 一、xpathd的使用 安装lxml pip install lxml ‐i https://pypi.douban.com/simple导入lxml.etree from lxml import etreeetree.parse() 解析本地文件 htm…