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

【BlossomRPC】手把手教你写一个RPC协议

文章目录

  • 新的开始
  • 什么是RPC?
  • 设计一个RPC需要些什么?

新的开始

经常会遇到一些项目,看着看着就发现看不懂文档了,也就是会出现一些跳过讲解的文章,使得自己很难了解某种中间件的开发全貌,所以想着自己先设计一个比较简易的RPC框架,在实现所有功能的前提下,向公司内部的技术分享一样,用口语化的方式讲述RPC框架,使得大家更容易理解。
这也是BlossomRPC项目的初衷。

RPC项目

配置中心项目

网关项目
再之前的网关项目中,我们已经了解到了Netty再网络通信中的作用,我们可以使用Netty开发非常多的东西,比如实现WebSocket,Http的服务器,上位机等。
只要是涉及到网络通信这一块的东西,都可以考虑使用我们的Netty去进行设计。
这一章节,我们将使用Netty去实现一个简单的RPC框架。
好的,接下来我们继续按照自顶向下的方式来学习这个自研的RPC框架。
(嘿嘿,最近在读金字塔原理,这不得让我试试我的学习成果)
因此,为了能够向你讲解清楚并且让你最后能理解这个项目,我会按照如下的方式为你介绍在这一章里面你会知道并且学习到什么东西。

  1. 什么是RPC
  2. 如何自己实现一个RPC框架
  3. 代码实战
    ok,let‘s go !

什么是RPC?

我在字节的时候,我和我的mentor闲聊聊到了RPC和HTTP。
然后就这个问题他问了我很多东西。
因此,再聊RPC之前,我们得先知道什么是RPC?他和HTTP的区别是什么?为什么我们会经常将PRC和HTTP去做比较呢?以及为什么企业内网中通信更多用的是RPC,而公网通信更多用的是HTTP?
我们随便搜索一下都能看到如下的对RPC的介绍:
RPC(Remote Procedure Call)是一种网络通信协议,它允许程序调用在另一台机器上的程序或服务,就像调用本地对象一样。RPC抽象了网络通信的复杂性,使得开发者可以像调用本地函数一样调用远程函数。RPC框架通常处理网络通信、数据的序列化/反序列化和错误处理等。
但是其实光看上面的描述其实还是没办法让我们对RPC有一个详细的了解,他依旧很抽象。
根据金字塔原理,我们知道这句话的目的是为了概述RPC的功能和作用,那么这段话中的每一个小句子的都是为了概述RPC来服务的。所以我们可以试图对上面的话中抽取一些关键词。

  1. 网络通信协议:RPC是一种用于网络间通信的方案。
  2. 程序调用:RPC允许一个程序调用另一台机器上的程序或服务。
  3. 类似本地对象调用:RPC使远程服务调用在使用上类似于调用本地对象。
  4. 抽象网络复杂性:RPC抽象化了底层的网络通信细节,简化了远程调用的过程。
  5. 调用远程函数:RPC的主要功能是允许开发者执行远程服务器上的函数或方法。
  6. 处理序列化/反序列化:RPC框架通常负责数据的序列化(将对象转换为网络传输的格式)和反序列化(将接收的数据转换回对象)。
  7. 错误处理:RPC框架通常包含错误处理机制,以处理网络通信中可能发生的问题。
    因此,其实我们可以对上面的话举个例子,然后进行一个总结描述:
    用白话来说,RPC(远程过程调用)就像是一个允许你通过电话指挥别人帮你完成任务的方法,而这个“别人”就是一台位于远处的电脑。想象一下,你需要完成一个任务,但是需要的工具或信息在别的地方,你就可以通过RPC来“打电话”给那台远程电脑,让它帮你完成这个任务。这个过程对你来说就像是让自己电脑上的一个程序做事一样简单,你不需要知道远程电脑是如何完成任务的,也不需要自己处理复杂的网络通信细节,你只需要负责拨号就行了,也就是说,你只需要知道对方的号码,然后接通电话的那一刻,说出你要对方做的使其即可。
    简而言之,RPC让远程电脑上的程序就像是你自己电脑上的程序一样容易调用。
    专业一点的说:RPC是一种能帮助你轻易调用远程机器上的程序接口并且帮助你屏蔽了各种底层复杂处理的方案,使得我们能专注于业务代码的开发而不是考虑底层细节。
    因此,为了能实现上面的目的,RPC一定需要完成上面的几个点,并且暴露出一个易于你调用的接口,使得你能非常方便的完成“打电话”这个动作。

那么第一个问题就回答完毕了,第二个问题我们经常能在网络上看见对它的讨论。
RPC和HTTP经常被拿来比较,主要是因为它们都被广泛用于服务间的通信,但在实现细节、性能、适用场景上有显著的不同。了解这些差异对于选择合适的通信机制来满足特定应用的需求非常重要。
这里我就直接引用知乎大佬的原话了:

既然有 HTTP 请求,为什么还要用 RPC 调用?
所以通过文章我们了解到,一个是技术方案,一个是通信协议。
而RPC这个技术方案,就包含了对通信协议的使用,因此,你可以直接使用HTTP协议作为RPC底层的传输机制,但是,你也可以使用更高效的协议,TCP/UDP都可以。

聊完了区别,我们来回答最后一个问题,其实这个问题就是在问,他和HTTP的优缺点了。
● HTTP:可读性好,跨语言,易于通过防火墙。优于RPC的地方在于其通用性和易用性,尤其是在构建面向公众的Web API时。
● RPC:更专注于效率和性能,适合用于内部服务之间的通信。RPC通常更快,因为它可以使用比HTTP更高效的传输协议和序列化方法。
● HTTP:由于工作在应用层,它包含了较多的协议头信息,因此相对于RPC在数据传输效率上可能较低。
● RPC:可能不如HTTP那样直观易用,且在跨语言支持和标准化方面可能不如HTTP强。
所以,我们总结一下,就能知道最后一问的答案(这一问就是我mentor问我的,她说我的当初的答案差点意思,嘿嘿,现在补充一下):

  1. 性能和效率:企业内网中的服务通常追求高效率和低延迟,RPC支持的高效二进制序列化和简化的通信协议在这方面表现更好。
  2. 安全和隔离:内网环境相对封闭和安全,服务间可以使用更为复杂的通信机制(如RPC),而无需担心公网中的安全问题。
  3. 协议和标准:HTTP作为互联网的基础协议,更适合用于构建公共API和服务。它的标准化和广泛支持使得不同环境和平台之间的通信更加容易。
  4. 兼容性和可访问性:HTTP在公网上的普遍兼容性使其成为互联网服务的理想选择,特别是在需要与浏览器等客户端交互时。

好的,我们基本了解完毕什么是RPC之后,我们就可以开始分析设计一个RPC框架需要用到那些知识了。

设计一个RPC需要些什么?

在着手编码之前,我们得先分析清楚设计一个RPC框架需要在那些方面下功夫去设计。
由于这个项目不会涉及的特别复杂,只是为了简单演示一下自己开发一个RPC框架所需要设计到的知识,所以我们一切从简。
我们也按照这张图片的方式进行处理,最终也可以完成对RPC请求的处理。
在这里插入图片描述
可以发现,对于一个RPC项目,我们需要从如下几个方面来考虑:

  1. 接口定义与服务规范
  2. 客户端代理(对客户端的请求进行代理)
  3. 序列化与反序列化
  4. 网络通信
  5. 服务注册与发现

了解到这些之后,我们就可以开始粗略的分析一下每一个点,然后详细的分析每一个点下面可能遇到的问题以及需要考虑到的一些东西。
如下是我列的一个粗略的大纲:

分析一下需要做的事情
1:消息协议的定义
- 版本 协议版本 1byte
- 压缩/序列化等算法的使用 1byte
- 消息类型 1byte
- 请求ID 8byte
- 消息长度 4byte
- 消息内容 Object2:编写编码器和解码器
- Server和Client都需要引入编解码器
- 编解码器需要对我这个特定的协议进行解析(基于上面的协议)
- 编解码器只是解析数据,最终数据的处理应该用Handler去操作3:处理序列化和反序列化
- 参考grpc、google、
- 可以考虑自己实现,也可以考虑使用开源的框架
- Java原生序列化 、 Json 、Arvo 、 protobuf4:编写Handler处理器------------完成协议部分-------------
------------客户端代理部分-----------5: 对客户端带有注解的服务进行代理
- JDK动态代理、CGLIB、SpringAop
- 其中Spring这种方式可以考虑使用BeanFactory的方式来得到代理对象
- 思考用什么样的一种方式可以对使用了我提供的注解的类进行代理的创建
-- BeanRegistry/BeanFactory/Bean反射6:编写注册中心代码/服务感知
- 项目是要整合springboot进行使用的
-- 要确保项目于springboot的无缝整合 减少用户感知
- 如何整合注册中心比如zk、nacos
- 如何编写一种通用的模板使得用户无感知,而只需要用到注解
-- 考虑使用AutoConfiguration+Conditional类型的注解进行依赖引入的判断
-- 如果引入了Nacos相关的重点依赖,那么注册中心用nacos
-- 也可以考虑提供枚举类型 / 通过配置文件的方式 让用户手动的去选择选用的注册中心
-- 优化用户体验,考虑在spring的application类型的文件中添加配置文件注释
-- 比如考虑到Spring中提供的各种Aware/Processor的使用
--- 比如ApplicatiopnAware/BeanFactoryAware/BeanClassLoaderAware/EnvironmentAware
--- 策略模式/单例模式/模板方法注册
--- 负载均衡的考虑
--- 考虑服务注册的时候注册上去的元数据信息
--- 如何从多个实例中选取一个特定实例(负载均衡算法实现)分析意义
1: 某些公司那边并不使用rpc通信的方式,他们用的是mq通信
2: 基站即服务
3: 什么时候用http,什么使用用rpc?
--------------------------

那么接下来,我们就按照上面的大纲来分析一下设计我们自己的RPC需要用到那些技术。
首先是序列化和反序列化,这里可以考虑两种方法,一种是使用最简单的Java原生的对象处理流,也就是Java自带的序列化,当然,这种方法并不好,性能低的同时,安全性以及移植性都很差。
第二种方法就是使用JSON,这是非常常见且简单的序列化方案。
其次就是使用Arvo、Protobuf这些序列化框架。
在这个项目中,序列化并不是非常重要的重头戏,因此我就直接选用JSON和原生Java序列化了。
当然,你甚至可以自定义序列化算法。
网络通信上,我们可以选择使用HTTP进行数据的传输,也可以使用Netty,这里很明显,我们选择Netty。
其次就是框架了,我们选择使用2.7.8版本的SpringBoot,这个版本已经支持了非常多的特性,并且可以非常快速简单的实现自动注入。
最后,注册中心我们选用Nacos和Zookeeper。
当然,我们的项目也支持你使用自己实现的注册中心。
(嘿嘿,自研注册中心正在开发中,敬请期待)
所以,了解完毕了上面,我们列出如下的技术栈:
SpringBoot2.7.8
Netty4.1.52
fastjson
好的,那么接下来我们正式开始准备开发。

相关文章:

【BlossomRPC】手把手教你写一个RPC协议

文章目录 新的开始什么是RPC?设计一个RPC需要些什么? 新的开始 经常会遇到一些项目,看着看着就发现看不懂文档了,也就是会出现一些跳过讲解的文章,使得自己很难了解某种中间件的开发全貌,所以想着自己先设计一个比较…...

算法之美:堆排序原理剖析及应用案例分解实现

这段时间持续更新关于“二叉树”的专栏文章,关心的小伙伴们对于二叉树的基本原理已经有了初步的了解。接下来,我将会更深入地探究二叉树的原理,并且展示如何将这些原理应用到更广泛的场景中去。文章将延续前面文章的风格,尽量精炼…...

Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore

没有基础的,请参考上一篇 彩蛋到最后一张图里找 参考链接 结果直接上图,没有任何业务代码 启动后,已经有了基本的CRUD功能,还扩展了批量删除,与动态查询 动态查询截图,支持分页,排序 实现原理…...

yolov8直接调用zed相机实现三维测距(python)

yolov8直接调用zed相机实现三维测距(python) 1. 相关配置2. 版本一2.1 相关代码2.2 实验结果 3. 版本二3.1 相关代码3.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1.yolov5直接调…...

element跑马灯/轮播图,第一页隐藏左边按钮,最后一页隐藏右边按钮(vue 开箱即用)

图示&#xff1a; 第一步&#xff1a; <el-carousel :class"changeIndex0?leftBtnNone:changeIndeximgDataList.length-1? rightBtnNone:" height"546px" :autoplay"false" change"changeNext"><el-carousel-item v-for…...

下载及安装PHP,composer,phpstudy,thinkPHP6.0框架

文章目录 目录 文章目录 前言 一、下载PHP 二、下载composer 三、下载PHPstudy 四、下载think PHP 1.下载 2.多应用开发 前言 thinkPHP是一款开源的PHP框架&#xff0c;它是基于MVC&#xff08;Model-View-Controller&#xff09;设计模式构建的。thinkPHP提供了丰富的…...

volatile使用场景总结

volatile关键字在Java中用于确保变量的可见性以及防止指令重排序&#xff0c;特别是在没有使用锁定机制时对变量进行读写的多线程环境中。以下是需要使用volatile修饰的一些场景&#xff1a; 确保变量的可见性 当一个变量被多个线程访问&#xff0c;且至少有一个线程在写&…...

AcWing 1413. 矩形牛棚(每日一题)

原题链接&#xff1a;1413. 矩形牛棚 - AcWing题库 作为一个资本家&#xff0c;农夫约翰希望通过购买更多的奶牛来扩大他的牛奶业务。 因此&#xff0c;他需要找地方建立一个新的牛棚。 约翰购买了一大块土地&#xff0c;这个土地可以看作是一个 R 行&#xff08;编号 1∼R&…...

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修…...

WPF使用外部字体,思源黑体,为例子

1.在工程中新建文件夹&#xff0c;命名为“Font"。 2.将下载好的字体文件复制到Font文件夹。 3.在工程中&#xff0c;加入静态资源 <Window.Resources><FontFamily x:Key"SYBold">/AnalyzeImage;Component/Font/#思源黑体 CN Bold</FontFamily…...

9、jenkins微服务持续集成(一)

文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…...

VOC(客户之声)赋能智能家居:打造个性化、交互式的未来生活体验

随着科技的飞速发展&#xff0c;智能家居已成为现代家庭不可或缺的一部分。然而&#xff0c;如何让智能家居更好地满足用户需求&#xff0c;提供更贴心、更智能的服务&#xff0c;一直是行业关注的焦点。在这个背景下&#xff0c;VOC&#xff08;客户之声&#xff09;作为一种用…...

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…...

node.js学习(2)

版权声明 以下文章为尚硅谷PDF资料&#xff0c;B站视频链接&#xff1a;【尚硅谷Node.js零基础视频教程&#xff0c;nodejs新手到高手】仅供个人学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;…...

【pytest】测试数据存储在 Excel 或 TXT 文件中,如何参数化

如果测试数据存储在 Excel 或 TXT 文件中&#xff0c;你可以使用外部库来读取这些数据&#xff0c;并将其转化为参数化测试所需的格式。下面我将分别展示如何从这两种文件中读取数据&#xff0c;并用于参数化测试。 从 Excel 文件中读取测试数据 你可以使用 pandas 库来读取 …...

ubuntu22.04@Jetson Orin Nano安装配置VNC服务端

ubuntu22.04Jetson Orin Nano安装&配置VNC服务端 1. 源由2. 环境3. VNC安装Step 1: update and install xserver-xorg-video-dummyStep 2: Create config for dummy virtual displayStep3: Add the following contents in xorg.conf.dummyStep 4: Update /etc/X11/xorg.con…...

面向对象特征二:继承

继承的概述 生活中的继承 财产继承&#xff1a; 绿化&#xff1a;前人栽树&#xff0c;后人乘凉 “绿水青山&#xff0c;就是金山银山” 样貌&#xff1a; 继承之外&#xff0c;是不是还可以"进化"&#xff1a; 继承有延续&#xff08;下一代延续上一代的基因、财…...

宝塔面板CentOS Stream 8 x86 下如何安装openlitespeed

宝塔自带的软件商店里如果没办法安装&#xff0c;那么我们可以通过指令来手动安装&#xff1a; 第一步&#xff1a; yum install epel-release Package epel-release-8-19.el8.noarch is already installed. Dependencies resolved. Nothing to do. Complete! 第二步&#…...

LeetCode 2952.需要添加的硬币的最小数量:贪心(排序)

【LetMeFly】2952.需要添加的硬币的最小数量&#xff1a;贪心&#xff08;排序&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-coins-to-be-added/ 给你一个下标从 0 开始的整数数组 coins&#xff0c;表示可用的硬币的面值&#xff…...

基于SpringBoot + Vue实现的在线装修管理系统设计与实现+毕业论文

介绍 系统包含用户、装修队、管理员三个角色 管理员&#xff1a; 管理员管理&#xff1a;管理其他管理员的账号和权限&#xff0c;确保系统管理的层次化和安全性。 装修队管理&#xff1a;审核装修队的资质&#xff0c;管理装修队的人员信息&#xff0c;监控工程进度&#xff…...

阿里云安全产品简介,Web应用防火墙与云防火墙产品各自作用介绍

在阿里云的安全类云产品中&#xff0c;Web应用防火墙与云防火墙是用户比较关注的安全类云产品&#xff0c;二则在作用上并不是完全一样的&#xff0c;Web应用防火墙是一款网站Web应用安全的防护产品&#xff0c;云防火墙是一款公共云环境下的SaaS化防火墙&#xff0c;本文为大家…...

作业 二维数组-定位问题

图形相似度 描述 给出两幅相同大小的黑白图像&#xff08;用0-1矩阵&#xff09;表示&#xff0c;求它们的相似度。 说明&#xff1a;若两幅图像在相同位置上的像素点颜色相同&#xff0c;则称它们在该位置具有相同的像素点。 两幅图像的相似度定义为相同像素点数占总像素点数…...

通过Jmeter准备压测数据-mysql示例

1、新建线程组 总共30万条数据 2、创建jdbc链接 创建jdbc连接配置 配置mysql连接 需要在jmeter安装的路径\apache-jmeter-5.6.3\lib\ext 目录下添加mysql 驱动 3、创建jdbc请求 jdbc链接名称需要与上一步中的保持一致&#xff0c;同时添加insert语句 例如 INSERT INTO test…...

如何系统的自学python?

系统地自学Python是一个循序渐进的过程&#xff0c;以下是一份详细的指南&#xff0c;帮助你从零开始逐步掌握这门语言&#xff1a; 1、了解Python及其应用场景&#xff1a; 阅读关于Python的简介&#xff0c;理解它为何流行&#xff0c;以及在哪些领域&#xff08;如Web开发…...

记录一个写自定义Flume拦截器遇到的错误

先说结论&#xff1a; 【结论1】配置文件中包名要写正确 vim flume1.conf ... a1.sources.r1.interceptors.i1.type com.atguigu.flume.interceptor.MyInterceptor2$MyBuilder ... 标红的是包名&#xff0c;表黄的是类名&#xff0c;标蓝的是自己加的内部类名。这三个都…...

Codeforces Round 934 (Div. 2) D. Non-Palindromic Substring

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…...

如何避免公网IP安全风险

目录 1. 使用防火墙 2. 定期更新和打补丁 3. 使用入侵检测和预防系统 4. 进行安全审计和监控 5. 实施最小权限原则 6. 使用VPN 7. 配置SSL/TLS 8. 使用DDoS保护服务 9. 强化认证措施 10. 定期备份数据 1. 使用防火墙 配置好网络防火墙&#xff0c;以允许仅必要的端口…...

探究 HTTPS 的工作过程

目录 1. HTTPS 协议原理 1.1. 为什么要有HTTPS协议 1.2. 如何理解安全 1.3. HTTPS 协议是什么 2. HTTPS 的前置概念 2.1. 什么是加密 && 解密 2.2. 为什么要加密 2.3. 常见的加密方式 2.3.1. 对称加密 2.3.2. 非对称加密 2.4. 数据摘要 && 数据指纹…...

算法学习——LeetCode力扣图论篇1

算法学习——LeetCode力扣图论篇1 797. 所有可能的路径 797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特…...

Stable Diffusion 模型下载:epiCPhotoGasm(真实、照片)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 该模型对照片是什么有很高的了解&#xff0c;所以…...

合作做网站的总结和心得/手机百度高级搜索入口

.第一&#xff0c;友好界面。高速公路收费管理系统开发设计&#xff0c;界面的友好性比较重要&#xff0c;满足这一要求才能体现出人性化设计特征&#xff0c;和用户应用系统便捷性相适应&#xff0c;动态的人机交互设计&#xff0c;用户应用系统的时候能感受到操作的便利&…...

仿小米论坛的wordpress主题/哪些广告平台留号码

web Deploy发布asp.net网站给我们提供方便&#xff0c;开始配置好了可以方便的发布网站&#xff0c;但是过久就出现无法执行此操作。请与服务器管理员联系&#xff0c;检查授权和委派设置。花了好长时间找到问问所在。现在解决方法分享出来。希望对大家有点用帮助 原来&#xf…...

自己建一个网站需要多少钱?/百度快照不更新怎么办

每当夜深人静的时候&#xff0c;正兴致冲冲的准备打开电脑玩游戏。结果按下开机键后&#xff0c;一片死寂&#xff0c;又按一遍&#xff0c;还是鸦雀无声&#xff0c;于是瞬间心态爆炸。相信不少小伙伴遇到过上面这种情况&#xff0c;甚至有些暴躁的大佬们直接巴掌伺候&#xf…...

厦门百度网站建设/青岛seo网络推广

一. offset系列 1. offset系列的5个属性 1. offsetLeft : 用于获取元素到最近的定位父盒子的左侧距离* 计算方式: 当前元素的左边框的左侧到定位父盒子的左边框右侧* 如果父级盒子没有定位, 那么会接着往上找有定位的盒子* 如果上级元素都没有定位,那么最后距离是与body的left值…...

各种类型网站建设/seo优化主要做什么

1. 什么是fastjson? fastjson是阿里巴巴的开源JSON解析库&#xff0c;它可以解析JSON格式的字符串&#xff0c;支持将Java Bean序列化为JSON字符串&#xff0c;也可以从JSON字符串反序列化到JavaBean。 Fastjson使用场景 Fastjson已经被广泛使用在各种场景&#xff0c;包括cac…...

龙江做网站/网站都有哪些

作者&#xff1a;张楷露、张琪 封面&#xff1a;自己想吧一、基本思想的异同共同点从二者表达的含义上看&#xff0c;主成分分析法和因子分析法都寻求少数的几个变量(或因子)来综合反映全部变量(或因子)的大部分信息&#xff0c;变量虽然较原始变量少&#xff0c;但所包含的信…...