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全称远程过程控制,说白了是一种对信息发送和接收的规则编写方法,来自google,这些规则会以protobuf代码存到proto文件里。我以autoGen中agent_worker.proto为例,大概长这样 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逆向】某精灵网
地址:aHR0cHM6Ly93d3cuamluZ2xpbmdzaHVqdS5jb20vYXJ0aWNsZXM f12查看数据包,下面这个不是,你得到的是你的用户信息,需要点击第2页才会显示数据接口 查看载荷 查看预览数据,发现是加密的 查看启动器,看到 Pr…...
自然语言处理:高斯混合模型
介绍 大家好,博主又来给大家分享知识了,今天给大家分享的内容是自然语言处理中的高斯混合模型。 在自然语言处理这个充满挑战与机遇的领域,我们常常面临海量且复杂的文本数据。如何从这些数据中挖掘出有价值的信息,对文本进行有…...
RISC-V汇编学习(三)—— RV指令集
有了前两节对于RISC-V汇编、寄存器、汇编语法等的认识,本节开始介绍RISC-V指令集和伪指令。 前面说了RISC-V的模块化特点,是以RV32I为作为ISA的核心模块,其他都是要基于此为基础,可以这样认为:RISC-V ISA 基本整数指…...
OpenCV连续数字识别—可运行验证
前言 文章开始,瞎说一点其他的东西,真的是很离谱,找了至少两三个小时,就一个简单的需求: 1、利用OpenCV 在Windows进行抓图 2、利用OpenCV 进行连续数字的检测。 3、使用C,Qt 3、将检测的结果显示出来 …...
Python中与字符串操作相关的30个常用函数及其示例
以下是Python中与字符串操作相关的30个常用函数及其示例: 1. str.capitalize() 将字符串的第一个字符大写,其余字符小写。 s "hello world" print(s.capitalize()) # 输出: Hello world2. str.lower() 将字符串中的所有字符转换为小写。…...
007-Property在C++中的实现与应用
Property在C中的实现与应用 以下是在C中实现属性(Property)的完整实现方案,结合模板技术和运算符重载实现类型安全的属性访问,支持独立模块化封装: #include <iostream> #include <functional>template<typename HostType, t…...
【实战篇】【DeepSeek 全攻略:从入门到进阶,再到高级应用】
凌晨三点,某程序员在Stack Overflow上发出灵魂拷问:“为什么我的DeepSeek会把财务报表生成成修仙小说?” 这个魔性的AI工具,今天我们就来场从开机键到改造人类文明的硬核教学。(文末含高危操作集锦,未成年人请在师父陪同下观看) 一、萌新村任务:把你的电脑变成炼丹炉 …...
clickhouse属于国产吗
《ClickHouse:探索其背景与国内的应用实例》 当我们谈论数据库技术时,ClickHouse是一个绕不开的话题。很多人可能会好奇,ClickHouse是否属于国产软件呢?答案是,虽然ClickHouse最初并非在中国开发,但这款列…...
ESP32 UART select解析json数据,上位机控制LED灯实验
前言: 本实验的目的主要是通过上位机通过UART来控制ESP32端的LED的点亮以及熄灭,整个项目逻辑比较简单,整体架构如下: 上位机(PC)主要是跑在PC端的一个软件,主要作用包含: 1)串口相关配置&…...
K8S 集群搭建——cri-dockerd版
目录 一、工作准备 1.配置主机名 2.配置hosts解析 3.配置免密登录(只需要在master上操作) 4.时间同步(每台节点都要做,必做,否则可能会因为时间不同步导致集群初始化失败) 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网络编程初探之基本概念(一)
一、网络目的 让你设备上的数据和其他设备上进行共享,使用网络能够把多方链接在一起,然后可以进行数据传递。 网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…...
高效处理 List<T> 集合:更新、查找与优化技巧
引言 在日常开发中,List<T> 是我们最常用的数据结构之一。无论是批量更新数据、查找特定项还是进行复杂的集合操作,掌握 List<T> 的高级用法可以显著提高代码的效率和可读性。本文将详细介绍如何使用 List<T> 进行批量更新、查找匹配项以及优化性能的方法…...
HTML5(Web前端开发笔记第一期)
p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 三件套标签标题标签段落标签文本格式化标签图像标签超链接标签锚点链接默认链接地址 音频标签视频标签 HTML基本骨架综合案例->个人简介列表表格表单input标签单选框radio上传…...
Windows控制台函数:标准输入输出流交互函数GetStdHandle()
目录 什么是 GetStdHandle? 它长什么样? 怎么用它? 它跟 std::cout 有什么不一样? GetStdHandle 是一个 Windows API 函数,用于获取标准输入、标准输出或标准错误设备的句柄。它定义在 Windows 的核心头文件 <…...
Vue3 中 Computed 用法
Computed 又被称作计算属性,用于动态的根据某个值或某些值的变化,来产生对应的变化,computed 具有缓存性,当无关值变化时,不会引起 computed 声明值的变化。 产生一个新的变量并挂载到 vue 实例上去。 vue3 中 的 com…...
常见的三种锁
一、互斥锁 互斥锁 Mutex 保证在任意时刻只有一个线程能够进入被保护的临界区。当一个线程获取到互斥锁后,其他线程若要进入临界区就会被阻塞,直到该线程释放锁。 互斥锁是一种阻塞锁,当线程无法获取到锁时,会进入阻塞状态。 应…...
离线文本转语音库pyttsx3(目前接触到的声音效果最好的,基本上拿来就能用)
在现代应用程序中,文本转语音(Text-to-Speech, TTS)技术越来越受到重视。无论是为视力障碍人士提供帮助,还是为教育和娱乐应用增添趣味,TTS 都能发挥重要作用。今天,我们将介绍一个简单易用的 Python 库——…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
