当前位置: 首页 > news >正文

RPC是什么?和HTTP区别?

RPC 是什么?HTTP 是什么?

作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。

在这里插入图片描述

此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不可靠,只要对可靠性有要求,一般就选 TCP 了。

Socket 本质是个代码库,我们需要先创建类似于:

在这里插入图片描述

其中 SOCK_STREAM是指使用字节流传输数据。说白了就是 TCP 协议。

在这里插入图片描述

在定义了 socket 之后,我们就可以对这个 socket 进行操作。
比如使用 bind() 方法绑定 IP 端口;
connect() 方法发起建联,里面就包含了常见的 TCP 三次握手流程;
在建立连接之后就可以使用 send() 方法发送数据;
accept() 方法接收数据。

在这里插入图片描述

光这个“纯裸”的 TCP 连接就可以收发数据了,那是不是就够了?

不行。

八股文常背 TCP 有三个特点:面向连接、可靠、基于字节流。

在这里插入图片描述

在这里插入图片描述

这里关注“基于字节流”,字节流可以理解为双向通道里流淌的二进制数据,就是一堆“01”串。“纯裸”的 TCP 连接收发的这些“01”串是没有任何边界的,你无法知道一条完整消息的起始位置。

在这里插入图片描述

由于无边界,所以当选择使用 TCP 发送“夏洛特烦恼”时,接收端无法区分你想表达的是“夏洛” 和“特烦恼”还是“夏洛特”和“烦恼”。这也就是所谓的“粘包”问题。

在这里插入图片描述

既然“纯裸” TCP 是不能直接拿来用的,那就需要在这个基础上加入一些自定义规则,来区分 消息边界。

于是,我们会把每条要发送的消息都包装一下。比如加入消息头,消息头中写清楚一个完整的包长度是多少,根据这个长度可以继续接收数据,截取出来后,就是我们真正想传输的消息体

这里的消息头中还可以放各种规则,比如消息体是否压缩、消息体格式之类的。只要上下游都约定好,互相能够解析就行了,这就是所谓的协议了。

在这里插入图片描述

每个使用 TCP 的项目,都可能会定义一套类似于这样的协议解析标准,它们可能有区别,但原理都类似。

于是基于 TCP 就衍生出非常多的协议,如 HTTP 和 RPC 。

TCP 是传输层的协议,而基于 TCP 造出来的各类协议,都是定义了不同规则的应用层协议。

在这里插入图片描述

HTTP 协议又叫做“超文本传输协议”,我们平时上网在浏览器中敲个网址就能访问网页,用到的就是 HTTP 协议。

在这里插入图片描述

RPC(Remote Procedure Call) 又叫做“远程过程调用”,它本身不是一种具体的协议,而是一种调用方式。

RPC 让我们可以像调用本地方法一样,调用远端服务器的方法(remoteFunc),屏蔽掉一些网络细节。

在这里插入图片描述

基于这个思路,大佬们造成了非常多款式的 RPC 协议,如 gRPC、tRPC 等。

虽然大部分 RPC 协议底层使用的是 TCP 协议,但也可以改用 UDP 或者 HTTP。

为什么有 HTTP 还要有 RPC?

其实,TCP 是 70 年代的产物,HTTP 是 90 年代的产物,由于直接使用 TCP 会出现粘包问题,所以可想而知,70~90 年代之间会有很多协议产生,其中包含 80 年代产出的 RPC 协议

在这里插入图片描述

因此我们该问的不是“为什么有 HTTP 了,还要有 RPC?”,而是“为什么有 RPC 了,还要有 HTTP?”。

为什么有 RPC 还要有 HTTP 协议?

现在电脑上安装的各种软件,如xx管家、xx视频,它们作为客户端,需要与服务端建立连接,收发消息,都会用到应用层协议。在这种 C/S(client server)架构下,他们就能使用自家创造的 RPC 协议,因为只需要连接自己公司的服务器。

但是xx浏览器却不同,不管是 Chrome 还是 IE,它们不仅需要连接自家服务器,还需要访问其他公司的网站服务器,因此需要一个统一的标准。于是 HTTP 就是当时用来统一 browser server 的协议。

当时 HTTP 主要用于 B/S 架构,而 RPC 主要用于 C/S 架构,但是现在没有分那么清楚了,B/S 和 C/S 在慢慢融合。

很多软件需要支持多端,如网页端、PC端、移动端,如果通信协议都用 HTTP,那么服务器只用一套就够了,而 RPC 开始退居幕后,一般用于公司内部集群里各个微服务之间的通讯。

那么,既然有了 HTTP,为啥还要使用 RPC 呢?

为什么有了 HTTP, 还要用 RPC?

这个问题需要从二者的区别说起:

首先是服务发现

服务建立连接的前提是需要知道对方的 IP 地址和端口号,寻找对方 IP 端口的过程叫做 服务发现。

在 HTTP 中,知道了服务域名,就可以通过 DNS 服务器解析 IP 地址,端口默认是 80 。

而 RPC 需要专门的中间服务来保存服务名的 IP 信息,比如 etcd (甚至是 Redis)。

可以看出服务发现方面,二者虽有区别,但不分高低。

在这里插入图片描述

其次是底层连接形式

以主流的 HTTP1.1 协议为例,默认在底层建立 TCP 连接之后会一直保持这个连接,Keep alive,之后的请求都会复用这条连接。

在这里插入图片描述

而 RPC 协议也和 HTTP 协议类似,也是通过建立 TCP 长连接进行数据交互。但不同的地方在于,RPC 一般还会再建立一个连接池,在请求量大的时候,建立多条连接放在连接池中,需要发数据的时候就从池中取出一条连接,用完再放回去。

在这里插入图片描述

由于连接池有利于提升网络性能,所以有些编程语言的网络库中也会给 HTTP 加个连接池,比如 Go。

可以看出这块二者也没有太大区别。

最后是传输的内容

HTTP 和 RPC 传输内容都是基于 TCP 传输的消息,包含消息头 header 和 消息体 body,header 适合标记一些特殊信息,其中最重要的信息就是消息体的长度;body 则是放真正需要传输的内容,而这些内容只能是二进制数据。

在这里插入图片描述

所以 TCP 传输字符串和数字的问题不大,因为字符串可以编码,再变成二进制,而数字本身可以直接转为二进制。

但是结构体呢?

需要想办法转为二进制,现在的方案主要有 json、protoBuf 等。将这个结构体转为二进制的过程叫做序列化。

在这里插入图片描述

在这里插入图片描述

对于主流的 HTTP1.1,虽然叫做超文本传输协议,支持音频视频,但是在设计之初是用于做网络文本展示的,所以传输内容主要以字符串为主,header 和 body 都是如此,在 body 这块使用 json 来序列化结构体。

而 RPC 因为定制化程度更高,可以采用体积更小的 protobuf 文件或其他序列化协议,来保存结构体,同时不需要像 HTTP 那样考虑各种浏览器行为,如 302 定向跳转,因此性能会更好。这也是公司内部抛弃 HTTP 而选择 RPC 的主要原因。

在这里插入图片描述

当然,上面说的 HTTP 其实特指主流的 HTTP1.1。

HTTP2 在前者的基础上做了很多改进,性能可能比 RPC 还好,甚至连 gRPC 底层都是用的 HTTP2,那么问题又来了,“为什么既然有了 HTTP2,还要使用 RPC?”

因为 HTTP2 是 2015 年才出来的,那时候很多公司内部的 RPC 服务都运行很多年了,基于历史原因,也就没必要换了。

参考:
RPC是什么?HTTP是什么?RPC和HTTP有什么区别?

备注:
在 HTTP/1.1 和 RPC(远程过程调用)中,消息头(header)和消息体(body)都是以二进制数据的形式在 TCP 连接上进行传输的。然而,它们的具体格式和编码方式有所不同。

  1. HTTP/1.1:

    • 消息头:HTTP 消息头是以文本格式编码的,通常是 ASCII 字符。每个头部字段由字段名和字段值组成,字段之间用冒号分隔。头部的结束是通过一个空行(即两个连续的换行符)来标识的。
    • 消息体:HTTP 消息体可以是任意类型的二进制数据(如图像、视频、JSON、XML 等),其内容的类型通常通过 Content-Type 头部字段来指明。消息体的长度可以通过 Content-Length 头部字段来指示,或者使用 Transfer-Encoding: chunked 进行分块传输。
  2. RPC:

    • RPC 的实现可以有多种形式(如 gRPC、XML-RPC、JSON-RPC 等),每种实现的消息格式可能不同。一般来说,RPC 的消息头和消息体也可以是二进制数据。
    • 在一些 RPC 实现中,消息头可能包含一些元数据(如方法名、请求 ID、版本信息等),而消息体则包含实际的参数或返回值。具体的编码方式(如 Protocol Buffers、Thrift 等)会影响消息的二进制表示。

总结来说,虽然 HTTP/1.1 的消息头是以文本格式传输的,但在底层 TCP 连接上,它们都是以二进制形式发送的。
而 RPC 的消息头和消息体通常都是以二进制格式传输的,具体取决于所使用的协议和编码方式。

相关文章:

RPC是什么?和HTTP区别?

RPC 是什么?HTTP 是什么? 作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。 此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不…...

西藏酥油茶:高原上的醇香温暖

西藏酥油茶:高原上的醇香温暖 在西藏高原,有一种饮品,它不仅滋养了一代又一代的藏民,还承载着丰富的文化与历史,它就是西藏酥油茶。酥油茶,藏语称为“恰苏玛”,意为搅动的茶,是藏族人民日常生活中不可或缺的一部分,更是待客、祭祀等活动中的重要礼仪物品。 历史与文化渊源 酥…...

十、VUE中的CSS

一、vue中解决样式不冲突的两种方式 scoped方式 在App.vue中引入Helloworld子组件 在Helloworld子组件中再次引入我们编写Demo子组件 解释: 这种方式是在style上加了个scoped,限制了样式的使用范围。 动态类名方式 二、vue构建打包 npm run build...

论文阅读 AlphaFold 2

用AlphaFold进行非常精确的蛋白质结构的预测(AlphaFold2) 发表于2021年07月15日 NatureDOI: 10.1038/s41586-021-03819-2自然和科学杂志评选为2021年最重要的科学突破之一2021年AI在科学界最大的突破 前言 2020年11月30号, deepmind博客说AlphaFold解决了50年以来生物学的大挑…...

PVE 虚拟机安装 Debian 无图形化界面服务器

Debian 安装 Debian 镜像下载 找一个Debian镜像服务器,根据需要的版本和自己硬件选择。 iso-cd/:较小,仅包含安装所需的基础组件,可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/:较…...

讯飞星火大模型将超越chatgpt?

讯飞星火大模型真的能超越ChatGPT吗? 在人工智能的世界里,新技术层出不穷,而科大讯飞最近发布的讯飞星火大模型3.0引发了不少讨论。有些人甚至大胆猜测:这个模型是否能够在某些方面超越如今广受欢迎的ChatGPT?今天,我们就来深入探讨一下这个话题,分析讯飞星火大模型3.0…...

Linux解决输入法卡死问题

说明:在Ubuntu系统中,如果您需要重启输入法服务(比如fcitx或ibus),您可以按照以下步骤操作。这些步骤适用于大多数基于Ubuntu的发行版,例如Ubuntu、Linux Mint等。 一、重启Fcitx输入法服务 1、使用Ctrl …...

PPT自动化 python-pptx -7: 占位符(placeholder)

占位符(placeholder)是演示文稿中用于容纳内容的预格式化容器。它们通过让模板设计者定义格式选项,简化了创建视觉一致幻灯片的过程,同时让最终用户专注于添加内容。这加快了演示文稿的开发速度,并确保幻灯片之间的外观…...

“AI视觉贴装系统:智能贴装,精准无忧

嘿,朋友们!今天我要跟你们聊聊一个特别厉害的技术——AI视觉贴装系统。这可不是普通的贴装设备,它可是融合了人工智能、计算机视觉和自动化控制等前沿科技的“智能贴装大师”。有了它,那些繁琐、复杂的贴装工作变得轻松又精准。来…...

【Efficient AIGC】SiTo: Similarity-based Token Pruning (AAAI-2025)

文章目录 SiTo: Training-Free and Hardware-Friendly Acceleration for Diffusion Models via Similarity-based Token Pruning背景介绍方法结果消融 文章目录 SiTo: Training-Free and Hardware-Friendly Acceleration for Diffusion Models via Similarity-based Token Prun…...

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似,区别就在于预处理部分存在不同;本文简单介绍了下音频处理的方法,以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…...

mac 通过 Homebrew 安装 git 遇到的问题

问题真多啊 !!! 解决方式 见 1. / 2. / 3 . / 4. / 5. remote: Enumerating objects: 290323, done. remote: Counting objects: 100% (473/473), done. remote: Compressing objects: 100% (253/253), done. error: RPC failed; curl 92 H…...

Flutter android debug 编译报错问题。插件编译报错

下面相关内容 都以 Mac 电脑为例子。 一、问题 起因:(更新 Android studio 2024.2.2.13、 Flutter SDK 3.27.2) 最近 2025年 1 月 左右,我更新了 Android studio 和 Flutter SDK 再运行就会出现下面的问题。当然 下面的提示只是其…...

【信息系统项目管理师-选择真题】2018上半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

探究 Facebook 隐私安全发展方向,未来走向何方?

随着社交媒体的普及,隐私和数据安全问题成为了全球关注的焦点。Facebook,作为全球最大的社交平台之一,其隐私安全问题尤其引人注目。近年来,随着用户数据泄露事件的不断发生,Facebook 不断调整其隐私政策,探…...

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…...

Leecode刷题C语言之购买水果需要的最小金币数

执行结果:通过 执行用时和内存消耗如下&#xff1a; int dp(int* prices, int pricesSize, int index, int* memo) {if (2 * index 2 > pricesSize) {return prices[index];}if (memo[index] -1) {int minValue INT_MAX;for (int i index 1; i < 2 * index 2; i) …...

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意&#xff1a;修改样式的字体颜色/字号&#xff0c;若中英文一致&#xff0c;选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…...

MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

文章目录 一、前言1.1 MySQL体系结构1.2 MySQL日志分类1.3 其他几种日志1.3.1 查询日志1.3.2 慢查询日志1.3.3 错误日志 二、bin log 二进制日志2.1 bin log简介2.2 binlog日志格式2.3 日志删除2.4 写入/刷盘机制 三、undo log 回滚日志3.1 undo log简介3.2 隐藏字段 —— 事务…...

数字MIC PDM接口

在音频采样中&#xff0c;我们经常会用到PCM&#xff0c;PDM这种方式&#xff0c;它们之间也是有一些区别的。 &#xff11;&#xff1a;PDM 工作原理&#xff1a; PDM使用远高于PCM采样率的时钟采样调制模拟分量&#xff0c;每次采样结果只有1位输出&#xff08;0或1&…...

dfs专题五:FloodFill算法

1.图像渲染 link:733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:int prev;vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {if(image[sr][sc] color) return …...

笔试-二维数组

应用 快递业务有N个站点&#xff0c;1<N<10000&#xff1b;站点0、站点1可达&#xff0c;记作0-1&#xff1b;如果0-1、1-2&#xff0c;则站点0、站点2可达&#xff0c;记作0-2&#xff1b;s[i][j]1表示i-j可达&#xff0c;反之s[i][j]0表示i-j不可达&#xff1b;s[i][j…...

大模型GUI系列论文阅读 DAY2续:《一个具备规划、长上下文理解和程序合成能力的真实世界Web代理》

摘要 预训练的大语言模型&#xff08;LLMs&#xff09;近年来在自主网页自动化方面实现了更好的泛化能力和样本效率。然而&#xff0c;在真实世界的网站上&#xff0c;其性能仍然受到以下问题的影响&#xff1a;(1) 开放领域的复杂性&#xff0c;(2) 有限的上下文长度&#xff…...

如何提升IP地址查询数据服务的安全?

随着网络科技深入人们的生活之中&#xff0c;数据相关服务顺时代浪潮应运而生。而在数据查询相关服务之中&#xff0c;数据安全乃是重中之重。而如何部署数据查询服务安全&#xff0c;今天让我们来大致了解一下&#xff1a; 数据加密 数据加密是数据查询服务安全的核心技术之…...

【Leetcode】--- 接雨水

题目传送门 方法一&#xff1a; 前缀和后缀和 算法原理 需要两个数组。 第一个数组存储最左边到第 i 个位置的最大高度&#xff08;前缀最大值&#xff09; 第二个数组存储最右边到第 i 个位置的最大高度&#xff08;后缀最大值&#xff09; 最终第 i 个位置的 接水量 min&am…...

深入探索Math.NET:开启高效数值计算之旅

一、引言 在当今数字化时代&#xff0c;数值计算已然成为科学研究、工程设计、金融分析等众多领域的核心驱动力。从探索宇宙奥秘的物理学计算&#xff0c;到优化建筑结构的土木工程设计&#xff0c;再到预测市场趋势的金融建模&#xff0c;数值计算的身影无处不在&#xff0c;…...

案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设

浪潮云洲工业互联网有限公司&#xff08;以下简称为“浪潮云洲”&#xff09;成立于2018年&#xff0c;定位于工业数字基础设施建设商、具有国际影响力的工业互联网平台运营商、生产性互联网头部服务商。截至目前&#xff0c;浪潮云洲工业互联网平台连续五年入选跨行业跨领域工…...

Logback日志文件详细配置

完整版Logback.xml文件 放在Resources目录下即可 Mac用户更改一下日志文件存放地点即可 <FileNamePattern>/Users/***/***/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern> <?xml version"1.0" encoding"UTF-8"?> <configurati…...

TDengine 与上海电气工业互联网平台完成兼容性认证

在工业数字化转型和智能化升级的浪潮中&#xff0c;企业对高效、可靠的数据管理解决方案的需求日益增长。特别是在风电智能运维、火电远程运维、机床售后服务等复杂多样的工业场景下&#xff0c;如何实现海量设备和时序数据的高效管理&#xff0c;已经成为推动行业升级的关键。…...

VMware虚拟机安装macOS11

1.安装虚拟机 如果尚未安装虚拟机&#xff0c;请先进行安装。地址&#xff1a;VMware17下载地址​​​​​​ 2、下载苹果镜像文件 macOS Big Sur 11.0.1 (20B29) 3、下载unlock文件&#xff08;目的是开启VMware的macOS选项功能&#xff09; https://download.csdn.net/d…...

PostgreSQL中级专家是什么意思?

数据库技术领域&#xff0c;PostgreSQL 作为一种广泛使用的开源关系型数据库管理系统&#xff0c;吸引了众多技术人员深入学习和研究。“PostgreSQL 中级专家” 是对掌握该数据库特定技能层次的一种描述。 知识储备 中级专家深入理解 PostgreSQL 的体系结构&#xff0c;包括进程…...

ubuntu20使用apt安装mysql8

目录 ubuntu20使用apt安装mysql8报错列表参考链接首先删除旧mysql 一、下载配置mysql8库索引下载apt包解压包配置更新apt库索引 二、下载安装mysql8三、启动mysql服务配置开机自启动&#xff0c;忽略 本地登录远程登录查看mysql的所有用户使用客户端远程登陆如果报错完成 参考链…...

FastDFS的安装及使用

分布式存储发展历程 前段时间 618 活动火热进行&#xff0c;正是购物的好时机。当我们访问这些电 商网站的时候&#xff0c;每一个商品都会有各式各样的图片展示介绍&#xff0c;这些图 片一张两张可以随便丢在服务器的某个文件夹中&#xff0c;可是电商网站如此 大体量的…...

二叉树(了解)c++

二叉树是一种特殊的树型结构&#xff0c;它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分&#xff0c;其次序不能任意颠倒&#xff0c;因此是一颗有序树 以A结点为例&#xff0c;左边的B是它的左孩子&#xff0c;右边的C是…...

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…...

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者&#xff1a;Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商&#xff0c; 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点&#xff0c;能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…...

【ComfyUI专栏】ComfyUI 部署Kolors

什么是Kolors?我相信一定会有朋友可能第一次听说这个生图的模型,开始我也很难想象,这竟然是快手推出的可灵AI的项目,我们可以直接利用模型来生成图片和视频。 大家可以通过直接访问可灵AI的网址获取到可灵的项目,但是对于我们来说我们需要基于ComfyUI来生成必要的图片和视…...

HBase的原理

一、什么是HBase HBase是一个分布式&#xff0c;版本化&#xff0c;面向列的数据库&#xff0c;依赖Hadoop和Zookeeper &#xff08;1&#xff09;HBase的优点 提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统 (2) HBase 表的特性 Region包含多行 列族包含多…...

Spring Boot中如何实现异步处理

在 Spring Boot 中实现异步处理可以通过使用 Async 注解和 EnableAsync 注解来实现。以下是如何配置和使用异步处理的步骤和示例代码。 步骤&#xff1a; 启用异步支持&#xff1a; 在 Spring Boot 配置类上使用 EnableAsync 注解启用异步处理。使用 Async 注解异步方法&…...

SSM电子商城系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 电…...

新版IDEA创建数据库表

这是老版本的IDEA创建数据库表&#xff0c;下面可以自己勾选Not null&#xff08;非空),Auto inc&#xff08;自增长),Unique(唯一标识)和Primary key&#xff08;主键) 这是新版的IDEA创建数据库表&#xff0c;Not null和Auto inc可以看得到&#xff0c;但Unique和Primary key…...

二叉树的存储(下)c++

链式存储 我们可以创建两个数组L[N]、r[N]&#xff0c;分别存储i 号结点的左右孩子的编号&#xff0c;这样就可以通过数组下标实现链式访问。 本质上还是孩子表示法&#xff0c;存储的是左右孩子的信息 #include <iostream>using namespace std;const int N 1e6 10; …...

Flutter中PlatformView在鸿蒙中的使用

Flutter中PlatformView在鸿蒙中的使用 概述在Flutter中的处理鸿蒙端创建内嵌的鸿蒙视图创建PlatformView创建PlatformViewFactory创建plugin&#xff0c;注册platformview注册插件 概述 集成平台视图&#xff08;后称为平台视图&#xff09;允许将原生视图嵌入到 Flutter 应用…...

Docker—搭建Harbor和阿里云私有仓库

Harbor概述 Harbor是一个开源的企业级Docker Registry管理项目&#xff0c;由VMware公司开发。‌它的主要用途是帮助用户迅速搭建一个企业级的Docker Registry服务&#xff0c;提供比Docker官方公共镜像仓库更为丰富和安全的功能&#xff0c;特别适合企业环境使用。‌12 Harb…...

一篇博文了解JVM的各个内存区域

​ JVM的内存区域可以细分为程序计数器、虚拟机栈、本地方法栈、堆和方法区 其中&#xff0c;方法区和堆是线程共享的&#xff0c;虚拟机栈、本地方法栈和程序计数器是私有的&#xff1b; 先来说说程序计数器&#xff0c;它也被称为PC寄存器&#xff0c;占据着很小的内存空间…...

无监督学习:聚类、异常检测

聚类 工作原因我对聚类特别熟悉&#xff0c;因此视频课程基本快进看完&#xff0c;不做记录 异常检测 高斯(正态)分布 多特征异常检测 将每个特征作为独立特征&#xff08;实践证明即使不完全独立也影响不大&#xff09;计算高斯分布的参数&#xff0c;然后将待预估样本代入…...

pdf与ofd的区别详细对比

PDF&#xff08;Portable Document Format&#xff09;和OFD&#xff08;Open Fixed-layout Document&#xff09;是两种常见的电子文档格式&#xff0c;它们在设计理念、技术实现、应用场景等方面存在显著差异。以下是对这两种格式的详细对比分析&#xff0c;涵盖其历史背景、…...

DDD架构实战第六讲总结:领域驱动设计中的聚合

云架构师系列课程之DDD架构实战第六讲总结:领域驱动设计中的聚合 聚合提升了对象系统的粒度,保证了业务逻辑的完整性,减少了错误产生的概率 一、引言 本讲将探讨领域驱动设计(DDD)中的重要概念——聚合。聚合是业务完整性的单元,是一个更大力度的封装。在领域驱动设计中…...

CentOS7使用源码安装PHP8教程整理

CentOS7使用源码安装PHP8教程整理 下载安装包解压下载的php tar源码包安装所需的一些依赖扩展库安装前的配置修改配置文件1、进入php8的安装包 配置环境变量开机自启启动服务创建软连接常见问题1、checking for icu-uc > 50.1 icu-io icu-i18n... no2、configure: error: Pa…...

vue3中自定一个组件并且能够用v-model对自定义组件进行数据的双向绑定

1. 基础用法 在 Vue3 中&#xff0c;v-model 在组件上的使用有了更灵活的方式。默认情况下&#xff0c;v-model 使用 modelValue 作为 prop&#xff0c;update:modelValue 作为事件。 1.1 基本示例 <!-- CustomInput.vue --> <template><input:value"mo…...