rpc入门笔记0x01
syntax = "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name = 1; // name表示名称,编号是1
}
生成python文件
安装grpcio和grpcio-tools库
pip install grpcio #安装grpc
pip install grpcio-tools #安装grpc tools
生成proto的python文件
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. helloworld.proto
python -m grpc_tools.protoc:使用grpc_tools包中的protoc命令进行代码生成。--python_out=.:指定生成的Python代码的存放位置为当前目录。--grpc_python_out=.:指定生成的gRPC代码的存放位置为当前目录。-I.:指定搜索.proto文件的路径为当前目录
总结起来,该命令的作用是将当前目录下的helloworld.proto文件生成对应的Python代码,并将生成的代码存放在当前目录中
python使用grpc
syntax = "proto3";// The greeting service definition.
service Greeter {// Sends a greeting 下面就是暴露出来的一些方法rpc SayHello (HelloRequest) returns (HelloReply) {} // 定义返回什么类型就要返回什么类型rpc SayHelloStreamReply (HelloRequest) returns (stream HelloReply) {}rpc SayHelloBidiStream (stream HelloRequest) returns (stream HelloReply) {}
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}
生成出来的文件就直接使用他
go使用grpc
生成指令:
#好像是版本不兼容了 protoc -I . helloworld.proto --go_out=plugins=grpc:.
protoc -I . --go_out=. --go-grpc_out=. ./hello.proto
样例:
syntax = "proto3";
option go_package = ".;proto"; // 这个是必须加的// The greeting service definition.
service Greeter {// Sends a greeting 下面就是暴露出来的一些方法rpc SayHello (HelloRequest) returns (HelloReply) {} // 定义返回什么类型就要返回什么类型
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}
https://blog.csdn.net/neve_give_up_dan/article/details/126920398
https://github.com/grpc/grpc-go/issues/3794
https://blog.csdn.net/Mirale/article/details/122736894
UnimplementedXxxServer的作用:https://blog.csdn.net/Canon_in_D_Major/article/details/108135724
https://zhuanlan.zhihu.com/p/660634947
流模式
grpc的流模式主要有三种:
- 客户端流模式
- 服务端流模式
- 双向流模式
proto文件:stream_proto.proto
syntax = "proto3";option go_package = ".;proto";service Greeter {// 服务端流模式:客户端是流,服务端不是流rpc GetStream(StreamReqData) returns (stream StreamResData); // 服务端流模式rpc PostStream(stream StreamReqData) returns (StreamResData); // 客户端流模式rpc AllStream(stream StreamReqData) returns (stream StreamResData); // 双向流模式
}message StreamReqData{string data = 1;
}message StreamResData{string data = 1;
}
server.go
package mainimport ("GoRpc_quick/stream_grpc_test/proto""fmt""google.golang.org/grpc""net""sync""time"
)const PORT = ":8080"type server struct {proto.UnimplementedGreeterServer
}// 服务端流模式
func (s *server) GetStream(req *proto.StreamReqData, streamServer proto.Greeter_GetStreamServer) error {i := 0for true {streamServer.Send(&proto.StreamResData{Data: fmt.Sprintf("%v\n + %v", time.Now().Unix(), req.Data),})time.Sleep(time.Second)if i++; i > 10 {break}}return nil
}// 客户端流模式
func (s *server) PostStream(streamServer proto.Greeter_PostStreamServer) error {for {recv, err := streamServer.Recv()if err != nil {fmt.Println(err)break}fmt.Println(recv.Data)}return nil
}// 双向流模式
func (s *server) AllStream(streamServer proto.Greeter_AllStreamServer) error {wg := sync.WaitGroup{}wg.Add(2)go func() { // 负责receivedefer wg.Done()for {recv, _ := streamServer.Recv()fmt.Println("收到客户端消息:", recv.Data)}}()go func() {defer wg.Done()for i := 0; i < 10; i++ {streamServer.Send(&proto.StreamResData{Data: "我是服务器"})time.Sleep(time.Second)}}()wg.Wait()return nil
}func main() {listener, err := net.Listen("tcp", PORT)if err != nil {panic(err)}s := grpc.NewServer()proto.RegisterGreeterServer(s, &server{})err = s.Serve(listener)if err != nil {panic("failed to start grpc")}
}
client.go
package mainimport ("GoRpc_quick/stream_grpc_test/proto""context""fmt""google.golang.org/grpc""sync""time"
)func main() {conn, err := grpc.Dial("localhost:8080", grpc.WithInsecure())if err != nil {panic(err)}defer conn.Close()// 服务端流模式(客户端接收流)c := proto.NewGreeterClient(conn)stream, _ := c.GetStream(context.Background(), &proto.StreamReqData{Data: "alice"})for {recv, err := stream.Recv() // 实际上就是socket编程if err != nil {fmt.Println(err.Error())break}fmt.Println(recv)}// 客户端流模式,客户端发送流postStream, err := c.PostStream(context.Background())for i := 0; i < 10; i++ {_ = postStream.Send(&proto.StreamReqData{Data: fmt.Sprintf("客户端流模式 + %d", i)})time.Sleep(time.Second)}// 双向流模式allStream, _ := c.AllStream(context.Background())wg := sync.WaitGroup{}wg.Add(2)go func() { // 负责receivedefer wg.Done()for {recv, _ := allStream.Recv()fmt.Println("收到服务器消息:", recv.Data)}}()go func() {defer wg.Done()for i := 0; i < 10; i++ {allStream.Send(&proto.StreamReqData{Data: "我是客户端"})time.Sleep(time.Second)}}()wg.Wait()}
相关文章:
rpc入门笔记0x01
syntax "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name 1; // name表示名称,编号是1 }生成python文件 安装grpcio和grpcio-tools库 pip install grpcio #安装grpc pip install grpcio-tools #安装grpc tools生成…...
web - Tomcat服务器
文章目录 目录 文章目录 前言 一 . CS和BS的异同 二 . 什么是Tomcat 二 . Tomcat安装 四 . Tomcat目录结构 bin目录: 用于存放二进制的可执行文件 config目录 server.xml:配置整个服务器信息。例如修改端口号。默认HTTP请求的端口号是:8080 lib目录 log…...
后端接口返回常见的状态码
2开头 (请求成功)表示成功处理了请求的状态代码 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 201 (已创建) 请求成功并且服务器创建了新的资源。 202 …...
50.MongoDB快速入门实战
MongoDB概念 MongoDB是一个文档数据库(以 JSON 为数据模型),由C语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。 原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务&#x…...
一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版
Guitar Pro 8 .1.1for Mac 中文破解版是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧,重现喜爱的歌曲或陪伴自己。可以帮助我们进行吉他的学习、绘谱与创作,它包含了几乎所有的吉他现有指法及音色,在做弹拨…...
图论基础和表示
一、概念及其介绍 图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge&a…...
STM32 音频ADC转wav格式
STM32 音频ADC DAC测试方法_stm32 adc 音频-CSDN博客 STM32--vs1053 WAV录音实现(保存在SD卡)_vs1053 多字节读取-CSDN博客 单片机内部AD实现录音wav文件_adc语音信号采样_天外飞仙CUG的博客-CSDN博客 PCM编码格式_pcm格式-CSDN博客 用ADC编码PCM数据…...
面试中经常问道的问题二
深入理解前端跨域方法和原理 前言 受浏览器同源策略的限制,本域的js不能操作其他域的页面对象(比如DOM)。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。所以我们要通过一些方法使本域的js能够操作其他域的页面对象或者使…...
SQL UPDATE 语句(更新表中的记录)
SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 还可以使用AND或OR运算符组合多个条件。 SQL UPDATE 语法 具有WHERE子句的UPDATE查询的基本语法如下所示: UPDATE table_name SET column1 value1, column2 value2, ... WHERE conditi…...
js节流和防抖
节流(throttle)和防抖(debounce)是为了解决函数频繁触发而引发性能问题的两种优化方法。 节流: 指定一个时间间隔,在时间间隔内只执行一次函数,即在一段时间内,多次触发函数只执行一…...
权限系统设计(转载)
1 为什么需要权限管理 2 权限模型 2.1 权限设计 2.2 为什么需要角色 2.3 权限模型的演进 2.4 用户划分 2.5 理想的RBAC模型 3 权限系统表设计 3.1 标准RBAC模型表设计 3.2 理想RBAC模型表设计 4 结语 1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们&a…...
【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)
文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…...
Dockerfile文件自动化生成R4L镜像
Dockerfile文件自动化生成R4L镜像的步骤 1、安装Docker:2、使用Dockerfile一键生成镜像:3、查看生成的Docker镜像:4、删除Docker镜像:5、生成Docker容器:6、查看容器7、删除容器 1、安装Docker: curl -fsS…...
基于SSM的居家养老系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
[C#基础训练]FoodRobot食品管理部分代码-2
参考代码: using System; using System.Collections.Generic;namespace FoodRobotDemo {public class FoodInfo{ public string Name { get; set; } public int Id { get; set; } public int Count { get; set; }}public class FoodRobot{private …...
docker部署rabbitmq的坑
背景 今天用docker部署rabbitmq,启动都一起正常,但是当访问15672端口时,不能加载出页面。 排查 1.防火墙是否开启 ufw status2.ip是否能ping通 ping 192.168.x.x3.检查docker日志 docker psdocker logs -f 容器id4.进入容器,…...
【python VS vba(系列2)】 python和vba读写EXCEL文件的方式比较 (建设ing)
目录 1 用VBA读写EXCEL文件 1.1 用VBA读写,本工作簿workbook里的特定sheet的特定内容 1.1.1 EXCEL表内内容访问 1.1.2 注意点 1.1.3 代码 1.2 用VBA读写本工作簿workbook里的所有sheet的内容 1.2.1 麻烦之处 1.2.2 方法,如何指定EXCEL里的内容…...
小程序 swiper滑动 层叠滑动效果
整个红色区域为可滑动区域,数字1区域为展示区域,数字2为下一个展示模块 <scroll-view class"h_scroll_horizontal" enhanced"ture" bind:touchend"touchEnd" bind:touchstart"touchStart"><view clas…...
【20年VIO梳理】
19-20年VIO 梳理 1. 开源代码介绍: DSM2. FMD Stereo SLAM:融合MVG和直接方法,实现准确,快速的双目SLAM3. 基于VINS-Mono开发的SPVIS4. 改进:一种基于光流的动态环境移动机器人定位方案5. PVIO:基于先验平面约束的高效…...
Java Object类详解
Object 是 java 类库中的一个特殊类,也是所有类的父类。也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。因此,以下两个类表示的含…...
基于Yolov5的交通标志检测与识别系统(含源码与数据集)
基于yolov5的交通标志检测和识别 含源码和数据集 识别指示标志、禁止标志、警告标志上次周末跟发小自驾去郊区露营,高速上刚加速到120没十分钟,导航就“叮铃哐当”喊“前方200米限速80”,我俩慌慌张张踩刹车差点被后车闪灯骂娘——后来才发现…...
UE5 开发神器:蓝图节点预设插件 — 支持多节点打组 / 快捷键 / 拖拽插入 / 材质编辑器
插件名称:UPNodePresets 插件包含以下功能 Action Palette 搜索:右键空白处搜索预设名称,回车即插入快捷键插入:按住数字键 0~9 鼠标左键点击任意位置,瞬间插入(Blueprint / Material 独立绑定ÿ…...
PP-DocLayoutV3实战教程:解决OCR漏检/错序问题的布局预处理方案
PP-DocLayoutV3实战教程:解决OCR漏检/错序问题的布局预处理方案 1. 引言:为什么需要专业的文档布局分析? 你有没有遇到过这样的情况:用OCR工具识别扫描文档时,文字顺序乱七八糟,标题被误认为正文…...
零root权限+40%成本下降!OpenClaw Podman容器化部署全攻略,AWS Graviton+ECR打造AI Agent生产环境
本文已收录于《OpenClaw 实战指南》专栏,所有方案均经过AWS生产环境反复验证,覆盖从环境初始化到高可用集群部署全流程,附可直接复制的标准化部署脚本、Dockerfile模板、IAM权限配置与高频踩坑解决方案,适合AI Agent开发者、DevOp…...
品牌想被AI推荐,必须满足这3个条件
我们团队去年给一家智能家居客户做GEO交付,第一个月内容铺了三千篇,数据后台一打开,引用率不到1.7%。客户电话直接打过来问:“你们是不是把同一篇文章,用AI换了个说法发了三千遍?”这就是很多营销服务公司踩…...
OpenArk:你的Windows系统深度安全分析利器
OpenArk:你的Windows系统深度安全分析利器 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk 你是否曾经面对系统异常却无从下手?是否担心恶意软件…...
Windows下OpenClaw全攻略:Qwen3.5-9B-AWQ-4bit接入与避坑指南
Windows下OpenClaw全攻略:Qwen3.5-9B-AWQ-4bit接入与避坑指南 1. 为什么选择OpenClawQwen3.5组合? 去年我在处理大量图片素材归档时,发现手动分类效率极低。直到尝试将OpenClaw与Qwen3.5-9B-AWQ-4bit镜像结合,才真正体会到本地A…...
NoSleep防休眠工具:让系统持续运行的轻量级解决方案
NoSleep防休眠工具:让系统持续运行的轻量级解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 在现代工作环境中,电脑意外休眠常常成为工作流程的…...
C 里面如何使用链表 list
1. 学生时代, 那会学习 C 数据结构, 比较简单 struct person {int id;char name[641];struct person * next; }; 类似上面这样, 需要什么依赖 next 指针来回调整, 然后手工 print F5 去 debug 熬. 2. 刚工作青年时代, 主要花活, 随大流类似 #pragma once#include "stru…...
深度解析:数据挖掘核心任务与实战应用场景
深度解析:数据挖掘核心任务与实战应用场景前言一、数据挖掘核心定义二、数据挖掘标准执行流程(CRISP-DM 流程图)流程节点说明:三、数据挖掘的主要任务(6大核心分类)1. 分类分析:预测已知类别2. …...
