首页 > 其他分享 >golang之gRPC

golang之gRPC

时间:2023-10-10 17:14:49浏览次数:36  
标签:protoc protobuf gRPC golang grpc go -- message

相关链接:

grpc:

https://grpc.io/docs/languages/go/quickstart/

 

protobuf:

https://protobuf.dev/programming-guides/proto3/

 

protobuf语法:

 

示例:

syntax = "proto3";


// 声明请求参数
message SearchRequest {
  string query = 1;
  int32 page = 2;
  int32 page_size = 3;
}

 

说明:

  1. 声明proto文件使用的语法版本,目前是proto2 和proto3, 如果不声明的话, 他会默认使用protocol2,并且语法声明必须是在非空格的第一行
  2. 声明数据使用message,里面定义参数的类型,名称,索引位置(注意从1开始), 以分号结尾
  3. 索引的取值范围为:1 ~ 536,870,911
  4. 索引的值必须保证唯一性

 

枚举类型:

enum Status {
  STATUS_UNSPECIFIED = 0;
  STATUS_OK = 1;
  STATUS_FAIL = 2;
}

 

通过enum关键字定义枚举类型,

  1. 枚举是一个Int32类型
  2. 第一个枚举类必须从0开始,可以使用XXX_UNSPECIFIED作为占位符
  3. 不推荐出现负数

 

 

 

字段标签:

optional:

 

  • FileOptions —— 文件级别
  • MessageOptions —— 消息级别
  • FieldOptions —— 字段级别
  • ServiceOptions —— service级别
  • MethodOptions —— method级别

 

 

repeated:只有标量,枚举,message类型可以被修饰使用

标识被重复人一次(包括0次),可标识当前修饰类型的变长数组

// repeated
message RepeatedMessage {
    repeated SearchRequest requests = 1;
    repeated Status status = 2;
    repeated int32 number = 3;
}

 

 

 

map:

message MapMessage{
    map<string, string> message = 1;
    map<string, SearchRequest> request = 2;
}

 

 

any:

any类型可以包含一个不需要指定类型的任意的序列化消息。要使用any类型,需要import google/protobuf/any.proto。any类型字段的encode/decode交由各语言的运行时各自实现,例如在Go语言中可以这样读写any类型的字段:

 

...
import "google/protobuf/any.proto";
...
message AnyMessage {
    string message = 1;
    google.protobuf.Any details = 2;
}
...

 

 

oneof

 

 

 

 

 

 

Protocol buffer compiler安装

 

【源码】

自定义安装->linux/mac

# 1.卸载老版编译器
apt remove protobuf-compiler
# 2.下载并解压
wget https://github.com/protocolbuffers/protobuf/releases/download/v23.0/protoc-23.0-linux-x86_64.zip
unzip protoc-23.0-linux-x86_64.zip -d protoc-23.0
# 3.设置环境变量
export PATH="$PATH:/usr/local/src/protoc-23.0/bin"

# 4.测试
protoc --version
# libprotoc 23.0

 

window需要到github上下载压缩包到本地并将bin目录下的protoc.exe文件加入环境变量即可

https://github.com/protocolbuffers/protobuf/releases/tag/v23.4

 

 

 

Go 支持

# 1.安装
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

# 2.添加环境变量
export PATH="$PATH:$(go env GOPATH)/bin"

 

 

相关命令:

# 根据.proto文件,生成xxx.pb.go 和 xxx_grpc.pb.go
protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto


protoc -I=pb \
  --go_out=pb --go_opt=paths=source_relative \
  --go-grpc_out=pb --go-grpc_opt=paths=source_relative \
pb/addsrv.proto

 

标签:protoc,protobuf,gRPC,golang,grpc,go,--,message
From: https://www.cnblogs.com/xingxia/p/golang_grpc_protobuf.html

相关文章

  • Golang chan 的实现原理
    Golangchan的实现原理Go语言中的chan(通道)是一种用于在不同的goroutines之间进行通信和同步的重要机制。chan的实现原理涉及到Go语言的运行时系统和底层的数据结构。以下是chan的主要实现原理:底层数据结构:chan的底层数据结构是一个用于存储数据的环形队列(circularqueue)或链......
  • golang map/sync.map 实现
    mapGo中的map是一种高效的散列表(hashtable)实现,它的底层实现细节包括以下重要方面:哈希表(HashTable):map的底层数据结构是一个哈希表。哈希表是一个数组,每个元素都是一个哈希桶,用于存储键值对。哈希函数(HashFunction):Go使用哈希函数将键映射到哈希桶。这个哈希函数是内......
  • 解决 golang 中 grep console 插件不生效问题
    日志多了以后不好找,idea中的神奇grepconsole在goland竟然不好使了,一番查找下,找到了一个解决方案cmd+shift+a找到Registry找到go.run.processes.with.pty,改为false大功告成原贴:https://github.com/krasa/GrepConsole/issues/175......
  • Golang 使用SQLX实现可选条件查询
    packagemainimport( "fmt" "log" _"github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx")typeCityQuerystruct{ querystring optscityQueryOptions params[]any}typecityQueryOptionsstruct{......
  • golang 使用gomail.v2发送电子邮件
    1packageemail23import(4"errors"5"gopkg.in/gomail.v2"6)78vardialer*gomail.Dialer910funcReset(hoststring,portint,username,passwordstring){11dialer=gomail.NewDialer(host,port,usern......
  • Golang HOT100 做题记录
     LeetCode热题100  1.两数之和题目大意:给出一个数字的数[]num,一个目标值target。在数组中,找出两数之和为目标值的下标,任意输出一个答案。例子:num[]={0,2,3,4,2},target=4,输出:[]int{0,3}注意点:1.不能重复,如上不能为[]int{1,1},2.注意数组中重复数字处理 ......
  • GoLang context包
    初始化一个context如果确定是开头则用Background,如果不确定则用ToDocontext包核心API有四个1.context.WithValue设置键值对,并且返回一个新的context实例2.context.WithCancel3.context.WithDeadline4.context.WithTimeout三者都返回一个可取消的context实例和取消函数,WithTi......
  • golang实现一个简单的文件浏览下载功能代码示例
    想省事用Claude(一个依托chatgpt的AI)生成一段golang的文件浏览下载示例,结果给生成的代码大概是这样的(省去了无关部分,主要部分如下):http.HandleFunc("/*",downloadFile)http.HandleFunc("/",showFileList)测试之后,结果发现每次都会走到“/”下去,无论如何都不会......
  • 使用jprofiler 14 查看dremio 的grpc 调用
    我以前也写过使用就profiler分析dremio调用链的,jprofiler14支持独立的grpc功能节点了,可以方便我们了解dremio内部grpc的调用机制环境配置这个就比较简单了,具体可以参考我以前写的文章(包含了基于agent模式以及attach模式的)参考效果  参考资料https://www.ej-tec......
  • Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《StrimziKafkaBridge(桥接)实战》的第三篇,前文咱们掌握了StrimziKafkaBridge的基本功能:基于http提供各种kafka消息的服务此刻,如果想通过http接口调......