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

rpc和proto

rpc全称远程过程控制,说白了是一种对信息发送和接收的规则编写方法,来自google,这些规则会以protobuf代码存到proto文件里。我以autoGen中agent_worker.proto为例,大概长这样

syntax = "proto3";package agents;option csharp_namespace = "Microsoft.AutoGen.Protobuf";import "cloudevent.proto";
import "google/protobuf/any.proto";message AgentId {string type = 1;string key = 2;
}message Payload {string data_type = 1;string data_content_type = 2;bytes data = 3;
}message RpcRequest {string request_id = 1;optional AgentId source = 2;AgentId target = 3;string method = 4;Payload payload = 5;map<string, string> metadata = 6;
}message RpcResponse {string request_id = 1;Payload payload = 2;string error = 3;map<string, string> metadata = 4;
}message RegisterAgentTypeRequest {string type = 1;
}message RegisterAgentTypeResponse {
}message TypeSubscription {string topic_type = 1;string agent_type = 2;
}message TypePrefixSubscription {string topic_type_prefix = 1;string agent_type = 2;
}message Subscription {string id = 1;oneof subscription {TypeSubscription typeSubscription = 2;TypePrefixSubscription typePrefixSubscription = 3;}
}message AddSubscriptionRequest {Subscription subscription = 1;
}message AddSubscriptionResponse {
}message RemoveSubscriptionRequest {string id = 1;
}message RemoveSubscriptionResponse {
}message GetSubscriptionsRequest {}
message GetSubscriptionsResponse {repeated Subscription subscriptions = 1;
}message Message {oneof message {RpcRequest request = 1;RpcResponse response = 2;io.cloudevents.v1.CloudEvent cloudEvent = 3;}
}message SaveStateRequest {AgentId agentId = 1;
}message SaveStateResponse {string state = 1;optional string error = 2;
}message LoadStateRequest {AgentId agentId = 1;string state = 2;
}
message LoadStateResponse {optional string error = 1;
}message ControlMessage {// A response message should have the same id as the request messagestring rpc_id = 1;// This is either:// agentid=AGENT_ID// clientid=CLIENT_IDstring destination = 2;// This is either:// agentid=AGENT_ID// clientid=CLIENT_ID// Empty string means the message is a responseoptional string respond_to = 3;// One of://     SaveStateRequest saveStateRequest = 2;//     SaveStateResponse saveStateResponse = 3;//     LoadStateRequest loadStateRequest = 4;//     LoadStateResponse loadStateResponse = 5;google.protobuf.Any rpcMessage = 4;
}service AgentRpc {rpc OpenChannel (stream Message) returns (stream Message);rpc OpenControlChannel (stream ControlMessage) returns (stream ControlMessage);rpc RegisterAgent(RegisterAgentTypeRequest) returns (RegisterAgentTypeResponse);rpc AddSubscription(AddSubscriptionRequest) returns (AddSubscriptionResponse);rpc RemoveSubscription(RemoveSubscriptionRequest) returns (RemoveSubscriptionResponse);rpc GetSubscriptions(GetSubscriptionsRequest) returns (GetSubscriptionsResponse);
}

为什么要用protobuf定义rpc呢?首先,rpc是一种比http和restapi更轻量的协议,应该都知道http要有http头,header,rpc采用更紧凑的编码方式,具体我也不懂,反正它的协议叫做gRPC。然后,为了让rpc流行起来,需要一个在各种语言中都能被使用的方法,protobuf作为一种中间语言,在编写后可以被编译成各种语言的版本,然后供各语言的代码调用,这个编译器叫protoc,c是complier。

你可以简单地把proto代码看作是对数据结构的定义,就像python的dataclass一样。有几个字段需要解释:
oneof:它里面会包含多个变量名,在你实例化对应数据类时,只能出现其中一个变量,其他的不可用。
map:看作dict。
repeat:看作list。
packed:是跟在某些数据类型的变量后面的定义,用于注明这些值是否需要精简地序列化,proto3里默认开启。
enum Status:定义一个枚举数据类型Status。像python一样,Status会定义一个名字并附上具体的值,之后可以用Status定义其他变量的类型。
message:定义发送的信息的数据结构。
数据类型:在变量名前面注明,可以是某个定义完的数据结构,和python一样。
变量 = 数字:数字是编号,用于数据在序列化和反序列化时作标记和识别。因此,它可以不是顺序的,可以随便定义(但是最好别这样做)。
service:与message平级,用于定义一个服务所提供的所有rpc服务。
rpc:注明这是一个rpc服务,将注明发送和接收的message样式。
stream:注明这是一个流式传输。如果不是流式传输,rpc服务只会做到“客户端发送message,服务端返回对应的message”,就像一个request一样。
nest message:它只是一种嵌套形式,在message里定义一个message,毕竟message也是一个变量类型。
reserved:可以用来预留编号和变量名。
DynamicMessage:它用来支持动态解析,在不知道来犯的message类型时,对方可能同时传过来一个proto文件的descriptor文件,用它来动态解析message。

protobuf已经到protobuf3了,之前所有参数都可以注明可选or必选,现在都是可选。

相关文章:

rpc和proto

rpc全称远程过程控制&#xff0c;说白了是一种对信息发送和接收的规则编写方法&#xff0c;来自google&#xff0c;这些规则会以protobuf代码存到proto文件里。我以autoGen中agent_worker.proto为例&#xff0c;大概长这样 syntax "proto3";package agents;option …...

OPENGLPG第九版学习 -颜色、像素和片元 PART1

文章目录 4.1 基本颜色理论4.2 缓存及其用途颜色缓存深度缓存 / z缓存 / z-buffer模板缓存 4.2.1 缓存的清除4.2.2 缓存的掩码 4.3 颜色与OpenGL4.3.1 颜色的表达与OpenGL4.3.2 平滑数据插值 4.4 片元的测试与操作4.4.1 剪切测试4.4.2 多重采样的片元操作4.4.3 模板测试模板查询…...

【js逆向】某精灵网

地址&#xff1a;aHR0cHM6Ly93d3cuamluZ2xpbmdzaHVqdS5jb20vYXJ0aWNsZXM f12查看数据包&#xff0c;下面这个不是&#xff0c;你得到的是你的用户信息&#xff0c;需要点击第2页才会显示数据接口 查看载荷 查看预览数据&#xff0c;发现是加密的 查看启动器&#xff0c;看到 Pr…...

自然语言处理:高斯混合模型

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的高斯混合模型。 在自然语言处理这个充满挑战与机遇的领域&#xff0c;我们常常面临海量且复杂的文本数据。如何从这些数据中挖掘出有价值的信息&#xff0c;对文本进行有…...

RISC-V汇编学习(三)—— RV指令集

有了前两节对于RISC-V汇编、寄存器、汇编语法等的认识&#xff0c;本节开始介绍RISC-V指令集和伪指令。 前面说了RISC-V的模块化特点&#xff0c;是以RV32I为作为ISA的核心模块&#xff0c;其他都是要基于此为基础&#xff0c;可以这样认为&#xff1a;RISC-V ISA 基本整数指…...

OpenCV连续数字识别—可运行验证

前言 ​ 文章开始&#xff0c;瞎说一点其他的东西&#xff0c;真的是很离谱&#xff0c;找了至少两三个小时&#xff0c;就一个简单的需求&#xff1a; 1、利用OpenCV 在Windows进行抓图 2、利用OpenCV 进行连续数字的检测。 3、使用C&#xff0c;Qt 3、将检测的结果显示出来 …...

Python中与字符串操作相关的30个常用函数及其示例

以下是Python中与字符串操作相关的30个常用函数及其示例&#xff1a; 1. str.capitalize() 将字符串的第一个字符大写&#xff0c;其余字符小写。 s "hello world" print(s.capitalize()) # 输出: Hello world2. str.lower() 将字符串中的所有字符转换为小写。…...

007-Property在C++中的实现与应用

Property在C中的实现与应用 以下是在C中实现属性(Property)的完整实现方案&#xff0c;结合模板技术和运算符重载实现类型安全的属性访问&#xff0c;支持独立模块化封装&#xff1a; #include <iostream> #include <functional>template<typename HostType, t…...

【实战篇】【DeepSeek 全攻略:从入门到进阶,再到高级应用】

凌晨三点,某程序员在Stack Overflow上发出灵魂拷问:“为什么我的DeepSeek会把财务报表生成成修仙小说?” 这个魔性的AI工具,今天我们就来场从开机键到改造人类文明的硬核教学。(文末含高危操作集锦,未成年人请在师父陪同下观看) 一、萌新村任务:把你的电脑变成炼丹炉 …...

clickhouse属于国产吗

《ClickHouse&#xff1a;探索其背景与国内的应用实例》 当我们谈论数据库技术时&#xff0c;ClickHouse是一个绕不开的话题。很多人可能会好奇&#xff0c;ClickHouse是否属于国产软件呢&#xff1f;答案是&#xff0c;虽然ClickHouse最初并非在中国开发&#xff0c;但这款列…...

ESP32 UART select解析json数据,上位机控制LED灯实验

前言&#xff1a; 本实验的目的主要是通过上位机通过UART来控制ESP32端的LED的点亮以及熄灭&#xff0c;整个项目逻辑比较简单&#xff0c;整体架构如下&#xff1a; 上位机(PC)主要是跑在PC端的一个软件&#xff0c;主要作用包含&#xff1a; 1&#xff09;串口相关配置&…...

K8S 集群搭建——cri-dockerd版

目录 一、工作准备 1.配置主机名 2.配置hosts解析 3.配置免密登录&#xff08;只需要在master上操作&#xff09; 4.时间同步&#xff08;每台节点都要做&#xff0c;必做&#xff0c;否则可能会因为时间不同步导致集群初始化失败&#xff09; 5.关闭系统防火墙 6.配置…...

基于Python的电商销售数据分析与可视化系统实

一、系统架构设计 1.1系统流程图 #mermaid-svg-Pdo9oZWrVHNuOoTT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Pdo9oZWrVHNuOoTT .error-icon{fill:#552222;}#mermaid-svg-Pdo9oZWrVHNuOoTT .error-text{fill:#5…...

学习笔记:Python网络编程初探之基本概念(一)

一、网络目的 让你设备上的数据和其他设备上进行共享&#xff0c;使用网络能够把多方链接在一起&#xff0c;然后可以进行数据传递。 网络编程就是&#xff0c;让在不同的电脑上的软件能够进行数据传递&#xff0c;即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…...

高效处理 List<T> 集合:更新、查找与优化技巧

引言 在日常开发中,List<T> 是我们最常用的数据结构之一。无论是批量更新数据、查找特定项还是进行复杂的集合操作,掌握 List<T> 的高级用法可以显著提高代码的效率和可读性。本文将详细介绍如何使用 List<T> 进行批量更新、查找匹配项以及优化性能的方法…...

HTML5(Web前端开发笔记第一期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 三件套标签标题标签段落标签文本格式化标签图像标签超链接标签锚点链接默认链接地址 音频标签视频标签 HTML基本骨架综合案例->个人简介列表表格表单input标签单选框radio上传…...

Windows控制台函数:标准输入输出流交互函数GetStdHandle()

目录 什么是 GetStdHandle&#xff1f; 它长什么样&#xff1f; 怎么用它&#xff1f; 它跟 std::cout 有什么不一样&#xff1f; GetStdHandle 是一个 Windows API 函数&#xff0c;用于获取标准输入、标准输出或标准错误设备的句柄。它定义在 Windows 的核心头文件 <…...

Vue3 中 Computed 用法

Computed 又被称作计算属性&#xff0c;用于动态的根据某个值或某些值的变化&#xff0c;来产生对应的变化&#xff0c;computed 具有缓存性&#xff0c;当无关值变化时&#xff0c;不会引起 computed 声明值的变化。 产生一个新的变量并挂载到 vue 实例上去。 vue3 中 的 com…...

常见的三种锁

一、互斥锁 互斥锁 Mutex 保证在任意时刻只有一个线程能够进入被保护的临界区。当一个线程获取到互斥锁后&#xff0c;其他线程若要进入临界区就会被阻塞&#xff0c;直到该线程释放锁。 互斥锁是一种阻塞锁&#xff0c;当线程无法获取到锁时&#xff0c;会进入阻塞状态。 应…...

离线文本转语音库pyttsx3(目前接触到的声音效果最好的,基本上拿来就能用)

在现代应用程序中&#xff0c;文本转语音&#xff08;Text-to-Speech, TTS&#xff09;技术越来越受到重视。无论是为视力障碍人士提供帮助&#xff0c;还是为教育和娱乐应用增添趣味&#xff0c;TTS 都能发挥重要作用。今天&#xff0c;我们将介绍一个简单易用的 Python 库——…...

开源动作捕捉与3D数据采集:FreeMoCap如何颠覆传统动捕方案

开源动作捕捉与3D数据采集&#xff1a;FreeMoCap如何颠覆传统动捕方案 【免费下载链接】freemocap Free Motion Capture for Everyone &#x1f480;✨ 项目地址: https://gitcode.com/GitHub_Trending/fr/freemocap 在游戏开发、动画制作和运动科学研究领域&#xff0c…...

GIL已死,GIL万岁?——2024大厂Python并发岗面试题库首发(含性能压测对比数据)

第一章&#xff1a;GIL已死&#xff0c;GIL万岁&#xff1f;——2024大厂Python并发岗面试题库首发&#xff08;含性能压测对比数据&#xff09;一道高频真题&#xff1a;为什么 asyncio.run() 启动的协程无法被 multiprocessing.Process 并发执行&#xff1f; 该问题直指 Pyth…...

Windows下OpenClaw实战:30分钟接入Qwen3.5-4B-Claude模型

Windows下OpenClaw实战&#xff1a;30分钟接入Qwen3.5-4B-Claude模型 1. 为什么选择WindowsOpenClaw组合 去年我在尝试自动化办公流程时&#xff0c;发现很多AI工具对Windows支持并不友好。直到遇到OpenClaw&#xff0c;这个开源的智能体框架让我眼前一亮——它不仅能像人类一…...

OpenClaw成本优化方案:ollama GLM-4.7-Flash自建模型接口实践

OpenClaw成本优化方案&#xff1a;ollama GLM-4.7-Flash自建模型接口实践 1. 为什么需要关注OpenClaw的token消耗问题 第一次用OpenClaw完成自动化周报任务时&#xff0c;我盯着账单倒吸一口凉气——生成三份周报竟然消耗了接近15万token。这让我意识到&#xff0c;如果不解决…...

Leptin30;YQQVLTSLPSQNVLQIANDLENLRDLLHLL (mouse)

一、基本信息名称&#xff1a; Leptin30&#xff08;小鼠源瘦素功能片段肽&#xff09;单字母序列&#xff1a; YQQVLTSLPSQNVLQIANDLENLRDLLHLL三字母序列&#xff1a; Tyr-Gln-Gln-Val-Leu-Thr-Ser-Leu-Pro-Ser-Gln-Asn-Val-Leu-Gln-Ile-Ala-Asn-Asp-Leu-Glu-Asn-Leu-Arg-Asp…...

SEO_资深运营的SEO外链建设核心技巧

<h2>SEO外链建设&#xff1a;资深运营的核心技巧解析</h2> <p>在当今数字营销的竞争激烈环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;外链建设是提升网站排名的关键因素之一。资深运营者在这一领域已经积累了丰富的经验&#xff0c;他们不仅仅…...

新手必看!用Simulink搭建ANPC三电平逆变器的SPWM仿真模型(附完整模型文件)

从零构建ANPC三电平逆变器的SPWM仿真模型&#xff1a;Simulink实战指南 在电力电子领域&#xff0c;多电平逆变器因其优异的输出波形质量和较低的开关损耗而备受关注。其中&#xff0c;有源中点箝位型&#xff08;ANPC&#xff09;三电平逆变器凭借其独特的拓扑结构和控制灵活性…...

学习如何聚合零样本大型语言模型代理以进行企业披露分类

摘要本文研究一个轻量级训练聚合器是否能够将多样化的零样本大语言模型判断整合为更强的下游信号&#xff0c;用于公司披露分类。零样本大语言模型无需针对特定任务进行微调即可阅读披露文本&#xff0c;但其预测结果常因提示词、推理方式和模型家族的不同而存在差异。我采用一…...

Realistic Vision V5.1 虚拟摄影棚实战:利用GitHub管理自定义模型与脚本

Realistic Vision V5.1 虚拟摄影棚实战&#xff1a;利用GitHub管理自定义模型与脚本 你是不是也遇到过这样的烦恼&#xff1f;好不容易在本地电脑上&#xff0c;用Realistic Vision V5.1模型调出了一套完美的参数组合&#xff0c;生成的人像照片质感堪比专业影棚。结果换台电脑…...

Keil5主题配色进阶:不只是好看,更要好用!详解如何区分函数、变量、宏定义的颜色

Keil5主题配色进阶&#xff1a;不只是好看&#xff0c;更要好用&#xff01;详解如何区分函数、变量、宏定义的颜色 作为一名嵌入式开发者&#xff0c;每天面对Keil5的默认编辑器界面&#xff0c;你是否也感到视觉疲劳&#xff1f;那些单调的配色不仅影响编码心情&#xff0c;更…...