Golang protobuf

news2024/11/26 13:33:49

文章目录

        • protobuf 和 grpc 的区别
        • 下载工具 protoc
        • 为什么要使用 protoc
        • protoc 基本语法
          • 基础用法
          • 结构体声明
          • protoc生成结构体
          • 服务声明
          • 生成服务
          • 使用生成的服务端
          • 使用生成的客户端

protobuf 和 grpc 的区别

grpc 是开源的rpc框架
protobuf是编码协议

下载工具 protoc

https://github.com/protocolbuffers/protobuf/releases

从上面选择匹配的版本,我暂时使用的windows64

下载解压后,将可执行文件 protoc.exe 加入环境变量中去

protoc --version 查看是否配置完成

在这里插入图片描述

为什么要使用 protoc

protoc + protoc-gen-go  能根据 .proto 文件生成go的代码,我们只要关心业务逻辑的实现即可

protoc-gen-go 通过  go get github.com/golang/protobuf/protoc-gen-go 安装

protoc 基本语法

基础用法
固定版本语法写法,现在使用proto3

go_package 指定生成的文件存储位置和文件package名称,注意文件存储位置必须包含"/"
//固定版本语法写法,现在使用proto3
syntax="proto3";

//go_package 指定生成的文件存储位置和文件package名称,注意文件存储位置必须包含"/"
option go_package = "./;demopb";
结构体声明
结构体声明使用message,message中变量类型写在前面,名称在后面。 = number 代表参数接受顺序(是按照顺序赋值)
//结构体声明使用message,message中变量类型写在前面,名称在后面。 = number 代表参数接受顺序(是按照顺序赋值)
message DemoRequest {
   string name = 1;
   int64 age = 2;
}

message DemoResponse{
  string data = 1;
}
protoc生成结构体
 -I 输入位置 --go_out=:输出位置
# -I 输入位置 --go_out=:输出位置

# 将当前目录下的demo.proto 生成代码放在 当前目录下
protoc -I . stream.proto --go_out=:.
服务声明
服务使用 service 声明,其中方法以rpc标记,入参和出参为message定义的结构体
service Demo {
  rpc Talk(DemoRequest) returns (DemoResponse);
}
生成服务
# 将当前目录下demo.protoc 生成结构体和grpc服务
protoc -I . stream.proto --go_out=plugins=grpc:.
使用生成的服务端
使用前确保已经有grpc,没有通过 go get google.golang.org/grpc 安装

grpc.NewServer 创建grpc服务者

向服务者中注册服务,注册方法已经由protoc生成好了。方法名=Register + proto中rpc声明的方法名称 + server,将实现服务的struct传入即可(duck typing)

通过服务者的Serve(conn) 启动服务
package main

import (
	demopb "Study/Three/Pro"
	"context"
	"fmt"
	"google.golang.org/grpc"
	"net"
)

type DemoServer struct {
}

func (s DemoServer) Talk(ctx context.Context, request *demopb.DemoRequest) (*demopb.DemoResponse, error) {
	return &demopb.DemoResponse{
		Data: fmt.Sprintf("我叫%s,今年%d岁", request.Name, request.Age),
	}, nil
}

func main() {
	//grpc.NewServer 创建grpc服务者
	server := grpc.NewServer()
	//向服务者中注册服务,注册方法已经由protoc生成好了。方法名=Register + proto中rpc声明的方法名称 + server,将实现服务的struct传入即可(duck typing)
	demopb.RegisterDemoServer(server, &DemoServer{})
	listen, _ := net.Listen("tcp", ":8083")
	//通过服务者的Serve(conn) 启动服务
	server.Serve(listen)
}

使用生成的客户端
通过grpc.Dial拨号得到conn

调用 protoc生成的创建客户端方法(方法名 = New + proto中声明的rpc方法名 + Client)

调用客户端的方法,传入指定的类型的入参,获取返回的结果
package main

import (
	demopb "Study/Three/Pro"
	"context"
	"fmt"
	"google.golang.org/grpc"
)

func main() {
	//通过grpc.Dial拨号得到conn
	dial, _ := grpc.Dial(":8083", grpc.WithInsecure())
	//调用 protoc生成的创建客户端方法(方法名 = New + proto中声明的rpc方法名 + Client)
	client := demopb.NewDemoClient(dial)
	//调用客户端的方法,传入指定的类型的入参,获取返回的结果
	talk, _ := client.Talk(context.Background(), &demopb.DemoRequest{
		Name: "kiki",
		Age:  18,
	})

	fmt.Println(talk.Data)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工神经网络/ANN简介

目录 前言 1.什么是训练集、测试集和验证集? 2.人工神经网络和 生物神经元结构对应的理解 3.什么是梯度下降法,在神经网络上如何用于调节权重? 4.为什么神经网络要进行归一化处理? 5.激活函数的形式: 6.NN分类 …

序列模型(自回归模型,马尔可夫模型,因果关系)

李沐老师《动手学深度学习 PyTorch版》课程,小破站也有视频51 序列模型【动手学深度学习v2】_哔哩哔哩_bilibili 主要参考8.1. 序列模型 — 动手学深度学习 2.0.0 documentation 目录 1.基本原理 1.1自回归模型 1.2马尔可夫模型 1.3因果关系 2.训练 3.预测 4…

CMake中link_directories/target_link_directories的使用

CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for libraries),其格式如下: link_directories([AFTER|BEFORE] directory1 [directory2 ...]) 添加路径使链接器应在其中搜索库。提供给…

【云计算与大数据技术】数据分片哈希算法、路由算法、复制算法的讲解(图文解释 超详细)

一、大数据的存储问题 随着结构化数据量和非结构化数据量的不断增长,以及分析数据来源的多样化,之前的存储系统设计已经无法满足大数据应用的需求,对于大数据的存储,存在以下几个不容忽视的问题 容量 - “大容量”通常是指可达P…

Python+Qt相片更换背景颜色窗体程序

程序示例精选 PythonQt相片更换背景颜色窗体程序 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 QTPython是非常经典的窗体编程组合,功能完善,可视化界面美观易维护,这篇博…

fpga实操训练(按键输入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在fpga上面进行按键的输入,要比stm32编写按键输入要容易的多。这里面最主要的工作就是把led输出和按键输入绑定在一起。当然&#xff0…

MySQL MVCC

1.隔离级别 1.1.理论 1.1.1.序列化(SERIALIZABLE) 如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离; 1.1.2.可重复读(REPEATABLE READ,MySQL默认的隔离级别) 在可重复读在这一隔离级别上,事务不会被看成是一…

代码随想录刷题记录 day42 打家劫舍 1 2 3

代码随想录刷题记录 day42 打家劫舍 1 2 3 参考:代码随想录 198. 打家劫舍 思想 1.dp[i]表示偷取[0,i]房间内获取的最高的金额 2.递推公式 偷取第i号房间时的价值 dp[i]dp[i-2]nums[i]; 不偷取第i号房间时的价值 dp[i]dp[i-1] 所以递推公式 dp[i]Math.max(d…

【Linux】一文简单了解操作系统在硬件中的作用,解析操作系统是做什么的?

目录前言一.操作系统的介绍二.计算机软件体系结构接口各层接口三.操作系统做什么1.不要让CPU打盹多道程序分时系统多任务系统2.设备驱动操作系统对软硬件进行合理的管理,以达到为上层用户提供良好的,稳定的,安全的运行环境的目的!…

AppScan使用教程

一、安装 IBM AppScan 该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界。Rational AppScan 可自动化 Web 应用的安全漏洞评估工作,能扫描和检测所有常见的 Web 应用安全漏洞,例如 SQL 注入(SQL-i…

多时点DID实证流程笔记(Aggregate Effects from Public Works: Evidence from India)

文章、数据及stata代码来源: 链接:https://pan.baidu.com/s/1nBvlYGXkV7ednEx93ge1ZQ 提取码:vs5q本文进行的平行趋势检验、异质性检验均与大部分中文文献的处理方式不同,以及Bacon分解的方法对交叠did的潜在偏误进行诊断的做法也是比较新颖的。另外&a…

林业数字孪生打造实时树木“管家”

数字孪生是物联网、人工智能、虚拟现实、云计算等技术高度融合的综合性集成技术,主要目的是进行数字模型的智能分析、预测,为实体提供决策支持。林业数字孪生应用是智慧林业的具体实现手段,服务于智慧林草的业务需求,从而实现实体…

C语言#include的用法详解(文件包含命令)

#include叫做文件包含命令,用来引入对应的头文件(.h文件)。#include 也是C语言预处理命令的一种。 #include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件&…

AI-多模态-2021:FILIP【一种基于交互的细粒度图文预训练模型】

前言 FILIP(Fine-grained Interactive Language-Image Pretrain)是一种基于交互的细粒度图文预训练模型,用于解决图文双塔匹配模型中的细粒度匹配问题。本文对该论文进行阅读笔记, 论文:https://arxiv.org/abs/2111.…

【C#基础教程】第二十章、事件

目录 事件 1.事件 2.扩展EventArgs类 事件 1.事件 事件的组成:事件由事件发布者和事件订阅者组成。事件内包含一个私有委托。 当事件发布时,事件发布者会发布消息、而事件订阅者会接受到事件已发生的通知,并作出相应的处理。 其中&#xf…

计算机研究生就业方向之考编

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么,如果你只是转码,那么你不一定要考研,至少以下几个职位研究生是没有啥优势的: 1,软件测试工程师(培训一下就行) 2,前…

MyBatis的缓存机制

文章目录1 MyBatis的一级缓存1.1 演示1.2 使一级缓存失效的四种情况2 MyBatis的二级缓存2.1 演示2.2 使二级缓存失效的情况:2.3 二级缓存的相关配置(了解即可)3 MyBatis缓存查询的顺序1 MyBatis的一级缓存 一级缓存是SqlSession级别的&#…

【vue加载16秒优化到2秒】Vue3加载慢的性能优化,打包后页面静态资源chunk-vendors文件过大加载慢响应慢

【写在前面】基于自己之前做vue3项目的时候发现了一个致命的问题,项目部署好了,但是加载起来反应慢半天,控制台一看才发现,有个chunk-vendors的js文件加载了十几秒,这无非是页面体验差到爆炸。今天就针对打包后静态资源…

【密码学基础】混淆电路(Garbled Circuit)

1 概念 混淆电路是一种密码学协议,以实现安全多方计算(MPC)。场景是当多个通信方需要共同输入数据,然后通过同一个函数计算出一个结果,但是,各个通信方都不允许其他人知道自己的输入是什么。混淆电路就能很…

MySQL错误码大全

MySQL的所有错误码可以从MySQL官网查看。 1.MySQL地址 首页网址 2.文档地址 以此点击如下标志。 MySQL8.0文档地址 3.错误码地址 服务码官网地址 点进去之后,可以看到: 分为三大类: Server Error Message ReferenceClient Error Mes…