深入解析 JSON-RPC:从基础到高级应用(附调用示例)
在当今的软件开发领域,远程过程调用(RPC)技术是实现分布式系统间通信的关键手段之一。JSON-RPC,作为一种基于 JSON 数据格式的轻量级 RPC 协议,因其简洁性和高效性而备受青睐。本文将全面深入地探讨 JSON-RPC 的核心概念、请求与响应机制、错误处理、批处理特性,以及如何在实际开发中高效地应用 JSON-RPC,帮助读者从基础到高级层面全面掌握这一技术。
JSON-RPC 简介
JSON-RPC 是一种无状态、轻量级的远程过程调用(RPC)协议,主要用于在不同系统或服务之间进行通信。它基于 JSON(JavaScript Object Notation)数据格式,使得数据交换变得简单且高效。JSON-RPC 的设计目标是简单易用,同时保持足够的灵活性以满足各种应用场景的需求。它支持多种传输方式,包括 HTTP、WebSocket 等,这使得 JSON-RPC 可以在不同的网络环境中使用。
JSON-RPC 请求对象
在 JSON-RPC 中,请求对象是客户端向服务器发送的 JSON 格式的数据,用于请求服务器执行某个方法。请求对象包含以下字段:
- jsonrpc:一个字符串,指定 JSON-RPC 协议的版本。对于 JSON-RPC 2.0,该字段的值必须是
"2.0"
。 - method:一个字符串,表示要调用的方法名称。
- params:一个可选的字段,可以是 JSON 数组或对象,用于传递方法调用所需的参数。
- id:一个可选的字段,用于标识请求。如果存在,它必须是一个字符串、数字或
null
。如果不存在,该请求被视为通知(notification),服务器不需要返回响应。
示例请求对象
{"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": 1
}
请求对象的构造
在构造请求对象时,需要注意以下几点:
- jsonrpc 字段:必须始终设置为
"2.0"
,以确保使用的是 JSON-RPC 2.0 协议。 - method 字段:方法名称必须是一个字符串,且服务器必须支持该方法。
- params 字段:如果存在,必须是 JSON 数组或对象。如果是数组,参数按位置传递;如果是对象,参数按名称传递。
- id 字段:如果存在,必须是唯一的(对于批处理请求)。如果不存在,请求被视为通知,服务器不会返回响应。
JSON-RPC 响应对象
当服务器接收到一个有效的请求对象时,它会返回一个响应对象。响应对象包含以下字段:
- jsonrpc:一个字符串,指定 JSON-RPC 协议的版本。对于 JSON-RPC 2.0,该字段的值必须是
"2.0"
。 - result:一个可选的字段,表示方法调用的结果。如果请求成功,该字段必须存在,且包含方法的返回值。
- error:一个可选的字段,表示方法调用过程中发生的错误。如果请求失败,该字段必须存在,且包含错误信息。
- id:一个字段,与请求对象中的
id
字段相对应,用于标识响应。
示例响应对象
{"jsonrpc": "2.0","result": 19,"id": 1
}
响应对象的构造
在构造响应对象时,需要注意以下几点:
- jsonrpc 字段:必须始终设置为
"2.0"
,以确保使用的是 JSON-RPC 2.0 协议。 - result 字段:如果请求成功,必须包含该字段,且值为方法的返回值。
- error 字段:如果请求失败,必须包含该字段,且值为错误信息。
- id 字段:必须与请求对象中的
id
字段一致,以便客户端能够匹配请求和响应。
JSON-RPC 错误对象
如果在方法调用过程中发生错误,服务器会返回一个包含错误信息的响应对象。错误对象包含以下字段:
- code:一个数字,表示错误的类型。
- message:一个字符串,提供错误的简短描述。
- data:一个可选的字段,可以包含有关错误的额外信息。
示例错误对象
{"jsonrpc": "2.0","error": {"code": -32601,"message": "Method not found"},"id": 1
}
错误代码
JSON-RPC 2.0 定义了一系列标准错误代码,用于描述常见的错误情况:
代码 | 消息 | 含义 |
---|---|---|
-32700 | Parse error | 服务器接收到无效的 JSON。在服务器解析 JSON 文本时发生错误。 |
-32600 | Invalid Request | 发送的 JSON 不是一个有效的请求对象。 |
-32601 | Method not found | 方法不存在 / 不可用。 |
-32602 | Invalid params | 方法参数无效。 |
-32603 | Internal error | 内部 JSON-RPC 错误。 |
-32000 至 -32099 | Server error | 保留用于实现定义的服务器错误。 |
JSON-RPC 批处理
JSON-RPC 支持批处理请求,允许客户端一次性发送多个请求对象。服务器会返回一个包含多个响应对象的数组。每个响应对象与一个请求对象相对应,但响应对象的顺序可能与请求对象的顺序不同。
示例批处理请求
[{"jsonrpc": "2.0","method": "sum","params": [1, 2, 4],"id": "1"},{"jsonrpc": "2.0","method": "notify_hello","params": [7]},{"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": "2"}
]
示例批处理响应
[{"jsonrpc": "2.0","result": 7,"id": "1"},{"jsonrpc": "2.0","result": 19,"id": "2"}
]
批处理请求的注意事项
- 请求对象的顺序:批处理请求中的请求对象顺序可能与响应对象的顺序不同。
- 通知:通知请求(没有
id
字段)不会返回响应对象。 - 错误处理:如果批处理请求中的某个请求失败,服务器会返回一个包含错误信息的响应对象。
JSON-RPC 实践
在实际开发中,使用 JSON-RPC 时需要注意以下几点:
请求对象的构造
- 确保请求对象符合规范:特别是
jsonrpc
字段必须是"2.0"
,id
字段必须是唯一的(对于批处理请求)。 - 使用辅助函数:例如
Params()
,可以简化参数的构造过程。
错误处理
- 处理服务器返回的错误:服务器返回的错误对象包含错误代码和描述,客户端应该根据这些信息进行适当的错误处理。
- 处理网络错误:除了 JSON-RPC 错误,还需要处理网络错误和 HTTP 错误。
批处理请求
- 提高效率:批处理请求可以减少网络往返次数,提高通信效率。
- 注意响应顺序:响应对象的顺序可能与请求对象的顺序不同,客户端需要根据
id
字段匹配请求和响应。
安全性
- 数据加密:在传输敏感数据时,应使用 HTTPS 或其他加密协议。
- 身份验证:确保只有授权的客户端可以调用服务器上的方法。
示例代码
客户端示例
以下是一个使用 Python 和 requests
库发送 JSON-RPC 请求的示例:
import requests
import json# 定义请求对象
request = {"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": 1
}# 发送请求
response = requests.post("http://127.0.0.1:5000/jsonrpc", json=request)# 解析响应
response_data = response.json()# 打印结果
print(response_data)
服务器示例
以下是一个使用 Python 和 Flask 框架实现的简单 JSON-RPC 服务器示例:
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/jsonrpc', methods=['POST'])
def jsonrpc():data = request.jsonif isinstance(data, list):responses = []for req in data:if req['jsonrpc'] != '2.0':responses.append({"jsonrpc": "2.0","error": {"code": -32600,"message": "Invalid Request"},"id": None})continuemethod = req.get('method')params = req.get('params', [])id_ = req.get('id')if method == 'sum':if not isinstance(params, list) or len(params) < 1:responses.append({"jsonrpc": "2.0","error": {"code": -32602,"message": "Invalid params"},"id": id_})continueresult = sum(params)responses.append({"jsonrpc": "2.0","result": result,"id": id_})elif method == 'subtract':if not isinstance(params, list) or len(params) != 2:responses.append({"jsonrpc": "2.0","error": {"code": -32602,"message": "Invalid params"},"id": id_})continueresult = params[0] - params[1]responses.append({"jsonrpc": "2.0","result": result,"id": id_})else:responses.append({"jsonrpc": "2.0","error": {"code": -32601,"message": "Method not found"},"id": id_})return jsonify(responses)else:if data['jsonrpc'] != '2.0':return jsonify({"jsonrpc": "2.0","error": {"code": -32600,"message": "Invalid Request"},"id": None}), 400method = data.get('method')params = data.get('params', [])id_ = data.get('id')if method == 'sum':if not isinstance(params, list) or len(params) < 1:return jsonify({"jsonrpc": "2.0","error": {"code": -32602,"message": "Invalid params"},"id": id_}), 400result = sum(params)return jsonify({"jsonrpc": "2.0","result": result,"id": id_})elif method == 'subtract':if not isinstance(params, list) or len(params) != 2:return jsonify({"jsonrpc": "2.0","error": {"code": -32602,"message": "Invalid params"},"id": id_}), 400result = params[0] - params[1]return jsonify({"jsonrpc": "2.0","result": result,"id": id_})else:return jsonify({"jsonrpc": "2.0","error": {"code": -32601,"message": "Method not found"},"id": id_}), 404if __name__ == '__main__':app.run(debug=True)
客户端和服务端交互示例
-
启动服务器:
python server.py
-
发送单个请求:
import requests import json# 定义请求对象 request = {"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": 1 }# 发送请求 response = requests.post("http://127.0.0.1:5000/jsonrpc", json=request)# 解析响应 response_data = response.json()# 打印结果 print(response_data)
输出:
{"jsonrpc": "2.0","result": 19,"id": 1 }
-
发送批处理请求:
import requests import json# 定义批处理请求对象 requests_batch = [{"jsonrpc": "2.0","method": "sum","params": [1, 2, 4],"id": "1"},{"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": "2"} ]# 发送批处理请求 response = requests.post("http://127.0.0.1:5000/jsonrpc", json=requests_batch)# 解析响应 response_data = response.json()# 打印结果 print(response_data)
输出:
[{"jsonrpc": "2.0","result": 7,"id": "1"},{"jsonrpc": "2.0","result": 19,"id": "2"} ]
结论
通过本文的详细介绍和示例代码,你应该对 JSON-RPC 有了更深入的理解。JSON-RPC 是一种简单而强大的远程过程调用协议,适用于各种应用场景。通过理解其基本概念和结构,开发者可以更高效地使用 JSON-RPC 进行系统间通信。希望本文能帮助你在实际开发中实现高效、可靠的分布式系统通信。
相关文章:
深入解析 JSON-RPC:从基础到高级应用(附调用示例)
在当今的软件开发领域,远程过程调用(RPC)技术是实现分布式系统间通信的关键手段之一。JSON-RPC,作为一种基于 JSON 数据格式的轻量级 RPC 协议,因其简洁性和高效性而备受青睐。本文将全面深入地探讨 JSON-RPC 的核心概…...
MAC环境给docker换源
2025-03-28 MAC环境给docker换源 在官网下载docker ,dmg 文件 参考: https://blog.csdn.net/qq_73162098/article/details/145014490 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},&q…...
Ollama及HuggingFace路径环境变量设置
日常经常用到这俩的一些环境变量,特记录下来,如有错误,还请指正。 1. Ollama路径环境变量设置 Ollama 模型路径变量名为OLLAMA_MODELS,设置示例: 变量名示例OLLAMA_MODELS C:\Users\Administrator\.ollama\models D…...
Redis | 基于 Redis 实现机器列表 Token 缓存的 Java 实现
关注:CodingTechWork 引言 在分布式系统中,Token 缓存是一种常见的需求。它可以帮助我们快速验证用户身份,减少对数据库的频繁访问,提高系统的性能和响应速度。本文将介绍如何使用 Redis 来实现机器列表的 Token 缓存,…...
Linux\CentOS解决OpenSSH和Nginx安全漏洞
前言 由于有些服务器需要对公网提供服务、客户对于服务器安全比较重视,需要公司提供服务器安全报告。大多数服务器经过漏洞扫描之后、会出现很多软件低版本的漏洞,此时就需要升级软件的版本来解决这些漏洞问题。本篇文章记录升级软件过程。 漏洞编号漏…...
ubuntu22.04 ROS2humble 路径文件
ROS2humble 路径文件 /opt/ros/humble/include/opt/ros/humble/lib/opt/ros/humble/share 下载ros2之后会有下面的文件,在/opt/ros/humble下 /opt/ros/humble/include C/C 头文件(.h, .hpp) /opt/ros/humble/lib 作用: 存放 编译生成的二…...
zookeeper部署教程
在Linux系统中离线安装并配置ZooKeeper,可按以下步骤操作: 1. 准备安装包和依赖 下载ZooKeeper:在有网络的环境下,前往Apache ZooKeeper官网下载所需的稳定版本,例如zookeeper-3.8.2.tar.gz。准备JDK:Zoo…...
生成信息提取的大型语言模型综述
摘要 信息提取(IE)旨在从简单的自然语言文本中提取结构知识。最近,生成型大型语言模型(LLMs)在文本理解和生成方面表现出了显著的能力。因此,已经提出了许多基于生成范式将LLM集成到IE任务中的工作。为了对…...
霸王茶姬小程序(2025年1月版)任务脚本
脚本用于自动执行微信小程序霸王茶姬的日常签到和积分管理任务。 脚本概述 脚本设置了定时任务(cron),每天运行两次,主要用于自动签到以获取积分,积分可以用来换取优惠券。 核心方法 constructor:构造函数,用于初始化网络请求的配置,设置了基础的 HTTP 请求头等。 logi…...
Maven中为什么有些依赖不用引入版本号
先给出一个例子: <parent><artifactId>sky-take-out</artifactId><groupId>com.sky</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>sky-s…...
机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法
一、集成学习框架 对训练样本较少的结构化数据领域,Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是:XGBoost是在GBDT的基础上优化而来,CatBoost和LightGBM是在XGBoost的基础上…...
第十二章——位运算
按位的与& 若x的第i位和y的第i位都是1,那么(x&y)1,否则(x&y) 0 应用:希望让某一位或某些位为0 。取一个数中的一段。 按位的或| 若x的第i位1或y的第i位1,那么&…...
陪伴就诊 APP 功能架构:如何通过特定模块筛选优秀陪诊师
在当今社会,随着人们对医疗服务品质需求的提升,陪诊师这一职业应运而生。然而,市场上陪诊师众多,水平参差不齐,如何筛选出优秀的陪诊师成了大家关注的焦点。而陪伴就诊 APP 的等级功能,为我们提供了一个有效…...
UI产品经理基础(六):如何解决用户的质疑?
在需求调查中遇到用户质疑“不专业”或“不了解需求”,本质上是用户对产品经理的信任缺失或沟通鸿沟导致的。要化解这种质疑,需从专业能力展示、沟通方式优化、用户参与感提升三个维度切入,结合具体场景采取针对性策略。以下是系统化的解决方…...
【江协科技STM32】BKP备寄存器RTC实时时钟(学习笔记)
BKP备寄存器 BKP简介 BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒࿰…...
Flutter项目之table页面实现
目录: 1、首页页面index.dart(首页table页面)searchbar.dart (搜索页面)common_swiper.dart (轮播图)index_navigation.dart (导航区域)index_navigatorItem_list.dart (数组构造) 2、房屋推荐index_recommond.dart (房屋推荐区域)IndexRecom…...
Stable Virtual Camera 重新定义3D内容生成,解锁图像新维度;BatteryLife助力更精准预测电池寿命
在数字内容创作的激烈竞争中,Stability AI 正站在命运的十字路口。这家曾以 Stable Diffusion 引爆图像生成革命的公司,却因上层管理问题陷入了危机。近期,Stability AI 推出了 Stable Virtual Camera 模型,不知能否以一记重拳打破…...
物理安全——问答
目录 1、计算机的物理安全包含哪些内容 1. 设备保护 2. 访问控制 3. 电力与环境安全 4. 数据存储保护 5. 硬件防护 6. 监控与审计 7. 灾难恢复与应急响应 8. 拆卸与维修安全 2、物理安全有哪些需要关注的问题 1、计算机的物理安全包含哪些内容 1. 设备保护 防止盗窃&…...
「查缺补漏」巩固你的 RabbitMQ 知识体系
1 MQ 存在的意义 消息中间件一般主要用来做 异步处理、应用解耦、流量削峰、日志处理 等方面。 1.1 异步处理 一个用户登陆网址注册,然后系统发短信跟邮件告知注册成功,一般有三种解决方法。 串行方式,依次执行,问题是用户注册…...
前后前缀
一种特殊的前缀方法: 通过前后两次前缀,可以求出目的区间值 例题1: 最大或值:2680. 最大或值 - 力扣(LeetCode)(贪心前缀) 贪心可知只让一个数变化最后或值最大,所以通过…...
C++细节知识for面试
1. linux上C程序可用的栈和堆大小分别是多少,为什么栈大小小于堆? 1. 栈(Stack)大小 栈默认为8MB,可修改。 为什么是这个大小: 安全性:限制栈大小可防止无限递归或过深的函数调用导致内存…...
构建高可用性西门子Camstar服务守护者:异常监控与自愈实践
在智能制造领域,西门子Camstar作为领先的MES系统承载着关键生产业务。但在实际运维中,我们发现其服务常因数据库负载激增(如SQL阻塞链超时)或应用服务器资源耗尽(CPU峰值达90%以上)导致服务不可用。传统人工干预方式平均故障恢复时间长达47分钟,这对连续生产场景构成了严…...
DeepSeek-V3-250324: AI模型新突破,性能超越GPT-4.5
DeepSeek 于 3 月 25 日宣布完成 V3 模型的小版本升级,推出 DeepSeek-V3-250324 版本。新版本在推理能力、代码生成、中文写作及多模态任务上实现显著优化,尤其在数学和代码类评测中得分超越 GPT-4.5,引发行业高度关注。 DeepSeek-V3-250324…...
OSPF邻居状态机
OSPF(Open Shortest Path First)协议的邻接关系状态机描述了两台OSPF路由器之间建立和维护邻接关系的过程。以下是每个状态的简要描述: Down State(关闭状态) 描述:这是OSPF邻接关系的初始状态,…...
使用tensorflow实现线性回归
目录 前言使用TensorFlow实现算法的基本套路:实战 前言 实现一个算法主要从以下三步入手: 找到这个算法的预测函数, 比如线性回归的预测函数形式为:y wx b, 找到这个算法的损失函数 , 比如线性回归算法的损失函数为最小二乘法 找到让损失函数求得最小值的时候的系数, 这时一…...
CF每日5题Day4(1400)
好困,感觉很累,今天想赶紧写完题早睡。睡眠不足感觉做题都慢了。 1- 1761C 构造 void solve(){int n;cin>>n;vector<vector<int>>a(n1);forr(i,1,n){//保证每个集合不同a[i].push_back(i);}forr(i,1,n){string s;cin>>s;forr(…...
Vala 编程语言教程-继承
继承 在 Vala 中,一个类可以继承自 一个或零个 其他类。尽管实际开发中通常继承一个类(不同于 Java 等语言的隐式继承机制),但 Vala 并不强制要求必须继承。 当定义继承自其他类的子类时,子类的实例与父…...
CLion下载安装(Windows11)
目录 CLion工具下载安装其他 CLion CLion-2024.1.4.exe 工具 系统:Windows 11 下载 1.通过百度网盘分享的文件:CLion-2024.1.4.exe 链接:https://pan.baidu.com/s/1-zH0rZPCZtQ60IqdHA7Cew?pwdux5a 提取码:ux5a 安装 打开…...
QEMU源码全解析 —— 块设备虚拟化(12)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(11) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! QEMU初始化阶段的块设备虚拟化 从模板生成类和类的实例化 本回继续解析QEMU类Java反…...
如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志
一、首先按照以下 指引 中的 第1、2步骤,安装一下 AGDE ,AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension(AGDE)对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前,记得…...
Z字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你的输出需要从左往右…...
跟着尚硅谷学vue-day1
前言:企业多用vue3,但是考虑到时间较充足,先学vue2,学vue3较为方便。 1.vue是什么? 一套用于构建用户界面的渐进式Javascript 框架 构建用户界面:数据->界面 渐进式:Vue可以自底向上逐层的应用 简单应用: 只需一个轻量小…...
平板实现 adb connect 连接的步骤
1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...
VUE3+TypeScript项目,使用html2Canvas+jspdf生成PDF并实现--分页--页眉--页尾
使用html2CanvasJsPDF生成pdf,并实现分页添加页眉页尾 1.封装方法htmlToPdfPage.ts /**path: src/utils/htmlToPdfPage.tsname: 导出页面为PDF格式 并添加页眉页尾 **/ /*** 封装思路* 1.将页面根据A4大小分隔边距,避免内容被中间截断* 所有元素层级不要…...
windows第十八章 菜单、工具栏、状态栏
文章目录 创建框架窗口菜单菜单的风格通过资源创建菜单菜单的各种使用通过代码创建菜单在鼠标位置右键弹出菜单 CMenu常用函数介绍工具栏方式一,从资源创建工具栏方式二,代码创建 状态栏状态栏基础创建状态栏 创建框架窗口 手动创建一个空项目ÿ…...
C语言中的位域:节省内存的标志位管理技术
位域(Bit-field) 是 C 语言中的一种特性,允许在结构体(struct)中定义占用特定位数的成员变量。通过位域,可以更精细地控制内存的使用,尤其是在需要存储多个布尔值或小范围整数时,可以…...
单端信号差分信号
单端信号和差分信号是电路中常见的两种信号传输方式,它们在具体的应用场景和特点上有着明显的区别。下面就来详细说明一下单端信号和差分信号的区别。 首先,单端信号是指信号通过一个信号线传输,通常一个信号线携带一个信号。这种传输方式适…...
数据设计(范式、步骤)
文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式,指导如何设计一个关系型数据库。 1NF: 关系表的每个字段,都应该是不可再分的,——保证原子性。 字…...
Linux 中查看文件大小方法
目录 方法一:ls -l 输出的第五列方法二:du 命令的输出信息方法三:stat -c %s 的输出 方法一:ls -l 输出的第五列 ls 是列出指定目录下文件列表的命令,通过 -l 选项可以显示文件的属性信息,第五列显示的就是…...
SEO(搜索引擎优化)详解
SEO(搜索引擎优化)详解 SEO是Search Engine Optimization的缩写,中文称为"搜索引擎优化"。它是指通过一系列技术和方法,提高网站在搜索引擎自然(非付费)搜索结果中的排名,从而获得更…...
软考-高项,知识点一览十二 质量管理
十二 质量管理 项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求,以满足干系人目标的各个过程。 项目质量管理需要兼顾项目管理与项目可交付成果两个方面,它适用于所有项目,无论项目的可付成果具有何种特性。 管…...
Docker 设置国内镜像源
Windows 和 macOS 用户 1、一般使用Docker Desktop软件,在 Docker Desktop 的图形界面中完成镜像源的更换操作。具体步骤如下: 打开 Docker Desktop 后,在菜单栏依次点击 Settings -> Docker Engine。此时会弹出一个 JSON 编辑框…...
探秘Transformer系列之(19)----FlashAttention V2 及升级版本
探秘Transformer系列之(19)----FlashAttention V2 及升级版本 文章目录 探秘Transformer系列之(19)----FlashAttention V2 及升级版本0x00 概述0x01 FlashAttention V21.1 动机1.2 方案1.2.1 减少冗余计算1.2.2 增加并行1.2.3 调整…...
《白帽子讲 Web 安全》之跨站请求伪造
引言 在数字化时代,网络已深度融入人们生活的方方面面,Web 应用如雨后春笋般蓬勃发展,为人们提供着便捷高效的服务。然而,繁荣的背后却潜藏着诸多安全隐患,跨站请求伪造(CSRF)便是其中极为隐蔽…...
C++20:make_shared_for_overwrite与make_unique_for_overwrite
文章目录 一、背景与动机二、std::make_shared_for_overwrite2.1 语法与用法2.2 优势 三、std::make_unique_for_overwrite3.1 语法与用法3.2 优势 四、应用场景4.1 高性能计算4.2 大型对象管理4.3 实时系统 五、总结 C20 引入了两个新的标准库函数: std::make_sha…...
北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
改进奇偶矢量法的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)安全性的核心技术。针对传统奇偶矢量法在噪声敏感性、多故障隔离能力上的缺陷,本文提出一种基于加权奇偶空间与动态阈值的改进算法。通过引入观测值权重矩阵重…...
【React】基础版React + Redux实现教程,自定义redux库,Redux Toolkit教程
本项目是一个在react中,使用 redux 管理状态的基础版实现教程,用简单的案例练习redux的使用,旨在帮助学习 redux 的状态管理机制,包括 store、action、reducer、dispatch 等核心概念。 项目地址:https://github.com/Yv…...
onlyoffice实现office文件在线编辑保存
一、简介 onlyoffice是开源的在线文档编辑软件,支持主流的office格式,可实现文档在线编辑保存,多人协作编辑等场景,是目前我用过的功能最完善且强大的在线office编辑软件; 二、安装onlyoffice 这里仅介绍docker安装 简单运行查看sudo docker run -i -t -d -p 80:80 --…...
Transformer革命:人工智能如何突破语言理解的边界
Transformer革命:人工智能如何突破语言理解的边界? 当你在手机输入法中打出"苹果"时,系统是否知道你要输入水果还是手机品牌?这个看似简单的选择,背后隐藏着自然语言处理领域二十年来最深刻的变革。2017年谷…...
禅道品牌全面战略升级:开创项目管理国产化替代新格局
2025年,禅道软件完成企业品牌战略深度升级。此次升级,从产品力、服务力到生态圈构建等方面进行了全面优化,以更智慧的解决方案、更开放的生态布局,更安全的国产化解决方案,助力企业实现从“工具应用”到“价值创造”的…...