搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
参考文章:
- 安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
一、简单介绍
本文开发环境,均为 windows 环境,mac 环境其实也类似 ~
① 编译proto文件,相关插件 简单介绍:
- protoc 是编译器,用于将.proto文件编译成代码;
- protoc-gen-go 是一个插件,用于生成Go语言的数据结构代码;
- protoc-gen-go-grpc 是另一个插件,用于生成Go语言的gRPC服务代码。这三个工具共同支持在Go语言环境中使用protobuf和gRPC。
命令示例:protoc --go_out=. --go-grpc_out=. *.proto
在编译.proto
文件时,go_out
和go-grpc_out
这两个参数分别会调用以下文件:
go_out
:这个参数会调用protoc-gen-go
插件。protoc-gen-go
插件的主要作用是将.proto
文件转换为Go语言的代码。生成的文件通常包括消息(message)和枚举(enum)类型的定义,以及序列化和反序列化的方法。go-grpc_out
:这个参数会调用protoc-gen-go-grpc
插件。protoc-gen-go-grpc
插件的主要作用是将.proto
文件中的gRPC服务定义转换为Go语言的代码。生成的文件通常包括gRPC服务接口和客户端存根(client
stub)的定义。 这两个插件通常一起使用,以便在编译.proto
文件时生成完整的Go代码,包括消息类型和gRPC服务接口。
② go get 和 go install 命令的使用场景:
- 当你需要获取一个包的源代码并可能需要对其进行修改时,使用
go get
。- 当你需要编译并安装一个包,以便使用它的可执行文件或库文件时,使用
go install
。
环境:
- go版本:go1.19(注意:go版本过低,可能导致 go install 安装会报错,下面有介绍)
二、安装
建议:虽然有三种方法(github直接下载二进制,使用 go install 安装,手动 git clone 代码并安装),但不同插件安装方法略有不同。
protoc 和 protoc-gen-go 等二进制插件可以通过github来直接下载,而 protoc-gen-go-grpc 则需要通过 go install 安装。
方法一:github直接下载,各插件对应的二进制安装包
参考:安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
步骤:github下载对应插件的压缩包,再解压,放在 $GOPATH/bin
目录下即可(需提前配好Go相关环境变量)
protoc 安装:
https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.4(如下图示例:可按需选择对应版本)
解压后,可得到对应系统的可执行文件,如:protoc.exe,将其放在$GOPATH/bin
目录下即可。
检查是否安装成功:protoc --version
protoc-gen-go 安装:
https://github.com/protocolbuffers/protobuf-go/tags
解压后,可得到对应系统的可执行文件,如:protoc-gen-go.exe,将其放在$GOPATH/bin
目录下即可。
检查是否安装成功:protoc-gen-go --version
protoc-gen-go-grpc 安装:
比较特殊,无法直接通过github下载二进制,建议使用 go install 命令安装,也就是方法二:
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0
最终可得:protoc-gen-go-grpc.exe,将其放在$GOPATH/bin
目录下即可。
检查是否安装成功:protoc-gen-go-grpc --version
方法二:使用Go模块管理工具 (一步到位,但有些依赖可能无法顺利下载,考虑设置GOPROXY)
参考:安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
- 安装 protoc
# 根据自己电脑系统,设置对应的GOOS
# windows
go env -w GOOS=windows(设置完之后,记得还原)
# linux
go env -w GOOS=linux(设置完之后,记得还原)# 二进制 下载链接(可能无法通过go install 安装,直接去github下载二进制即可):
https://github.com/protocolbuffers/protobuf/tags
# 检查是否安装成功
protoc --version
- 安装 protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0
# 检查是否安装成功
protoc-gen-go --version# 如果下载失败,可以考虑开启代理
go env -w GOPROXY=https://goproxy.cn,direct
如果 go install 报错如下图,可能是因为你的 go 版本过低导致,可以考虑升级 go 版本,比如升级到 go1.19。
- 报错:package google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0: can only use
path@version syntax with ‘go get’
- 解决:升级 go 版本:https://golang.google.cn/dl/
- 安装 protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0
// 检查是否安装成功
protoc-gen-go-grpc --version
所有插件安装完后,效果如下:
方法三:手动编译源代码(不推荐,较麻烦,需额外下载源码 编译&安装)
参考:windows安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
步骤:
- 下载项目源码:
git clone xxx ...
- 进入项目并安装:执行
go install .
,编译&安装包,生成可执行二进制文件
三、编译 .proto 文件
proto安装好后,尝试编译你定义好的 .proto 文件,命令如下:
protoc --go_out=. --go-grpc_out=. *.proto
--go_out=.
其中的.
是说你要编译的 .proto 文件目录为当前目录,按需修改--go-grpc_out=.
,其中的.
是说你生成 .pb.go 文件的目录,按需修改*.proto
,其中的*
是说编译当前目录下的所有 .proto 文件,也可以单独指定为 xxx.proto 文件
四、错误问题&解决
protoc命令执行过程中,可能会遇到如下错误:
PS D:\Work\Code\Go\src\test\proto> protoc --go_out=.
–go-grpc_out=plugins=grpc:. xxx.proto protoc-gen-go: unable to determine Go import path for “xxx.proto”Please specify either:
• a “go_package” option in the .proto source file, or
• a “M” argument on the command line.
解决方法:
参考:protoc-gen-go: unable to determine Go import path for “*.proto“问题解决-CSDN博客
- 在你的 .proto 文件中,添加如下代码
option go_package = "./";
,具体path可能不同,如图所示:
// helloworld.protosyntax = "proto3";package helloworld;
option go_package = "./";// 定义请求消息
message HelloRequest {string name = 1;
}// 定义响应消息
message HelloReply {string message = 1;
}// 定义服务
service Greeter {// 定义SayHello方法rpc SayHello (HelloRequest) returns (HelloReply);
}
最终效果:
相关文章:

搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
参考文章: 安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客 一、简单介绍 本文开发环境,均为 windows 环境,mac 环境其实也类似 ~ ① 编译proto文件,相关插件 简单介绍: protoc 是编译器,用于将…...
Spring Boot 核心理解-自动装配
自动装配 spring boot的自动装配(auto configuration)是通过spring framework的依赖注入(dependency injection, DI)和配置类的组合来实现的。 spring boot 的自动装配机制可以简化应用的配置过程,是开发者不再需要手…...
go 中指针的执行效率比较
package main import ("fmt""time" ) type Books struct {title stringauthor stringsubject stringbook_id int } func main() {start : time.Now() // 记录开始时间var Book1 Books /* 声明 Book1 为 Books 类型 */var Book2 Books /* 声明…...

单链表的经典算法OJ
目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…...

视频网站开发:Spring Boot框架的高效实现
5 系统实现 5.1用户信息管理 管理员管理用户信息,可以添加,修改,删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享,可以添加,修改,删除视频分…...

【前端】如何制作一个自己的网站(11)
接上文。 除了前面的颜色样式外,字体样式和文本样式也是网页设计中的重要组成部分。 合适的字体和文本排版,不仅可以使页面更加美观,也可以提升用户体验。接下来,我们先来看看CSS如何设置字体样式。 字体样式 同时设置了字体样…...
【Conda】提高 Conda 下载速度与兼容性的完美指南
这里写目录标题 引言1. Conda 官方源1.1 常用官方源1.2 源的选择1.3 源的作用 2. 设置 Conda 源2.1 查看当前配置2.2 添加新的源2.3 设置源的优先级2.4 移除源2.5 示例:设置使用 conda-forge 3. 使用中国镜像源3.1 常用中国镜像源3.2 设置中国镜像源3.3 验证镜像源设…...
【Flutter】页面布局:层叠布局(Stack、Positioned)
在 Flutter 中,布局系统提供了多种方式来管理 UI 元素的排列方式。其中,Stack 和 Positioned 是非常重要的布局组件,允许开发者将子组件按层叠方式(即堆叠)布局,使得组件可以相互重叠。通过使用 Stack 和 P…...

SpringBoot实现的汽车票在线预订系统
2相关技术 2.1 MySQL 数据库 MySQL 是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非…...

集合框架14:TreeSet概述、TreeSet使用、Comparator接口及举例
视频链接:13.29 TreeSet概述_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p29 1、TreeSet概述 基于排列顺序实现元素不重复;实现了Sort…...
uniapp获取底部导航tabbar的高度(H5)
uniapp获取底部导航tabbar的高度(H5) <view :style"bottom: tabBarHeight px;"> </view>tabBarHeight: 0, // 底部tabBar高度, h5// #ifdef H5 getTabBarHeight(){const systemInfo uni.getSystemInfoSync()this.t…...

接口测试 —— 如何测试加密接口?
接口加密是指在网络传输过程中,将数据进行加密,以保护数据的安全性。接口加密可以采用多种加密算法,如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。以下是一些详细的测试方法和注意事项: 接口加密字…...
033 商品搜索
文章目录 SearchController.javaPage.javaSpuInfoServiceImpl.javaSpuInfoService.javaCubemallSearchApplication.javasearch.htmlpom.xml 功能分析 页面回显的数据: searchMap keywords:搜索的关键词 brand:过滤条件-品牌 category&…...
身份证二要素实名认证接口-身份证核验接口-身份证实名API
接口简介:企业三要素验证,输入公司名称、统一社会信用代码、法人姓名验证是否一致 接口地址:https://www.wapi.cn/api_detail/62/169.html 在线核验:https://www.wapi.cn/icardauth.html 网站地址:https://www.wapi.cn…...

一次恶意程序分析
首先F12shift查看字符表 字符表发现可疑字符串 双击进入 再tab 进入这里 推测为main函数 可见一些可疑的api FindResourceW推测该木马使用了资源加载 VirtualAlloc申请内存 然后sub_1400796E0 有 dwSize 参数 推测为 拷贝内存 memcpy类似函数 、 然后sub_140078CB0函数 跟进函…...

Javaweb基础-vue
Vue.js Vue是一套用于构建用户界面的渐进式框架。 起步 引入vue <head><script src"static/js/vue2.6.12.min.js"></script> </head> 创建vue应用 <body> <div id"index"><p>{{message}}</p> </div>…...

2. MySQL数据库基础
一、数据库的操作 1. 显示当前的数据库 SHOW DATABASES;2. 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification...];//create_specification包括:[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_n…...

java集合进阶篇-《泛型》
个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、泛型的简要概述 三、泛型的基本概念 类型参数: 通配符: 边界: 使用泛型的好处: 四、泛型类 五、泛型方法 六、思考 七、疑惑 一、前言 泛型对于我来说又…...

pytorh学习笔记——cifar10(三)模仿VGGNet创建卷积网络
VGG16是由牛津大学视觉几何组(Visual Geometry Group)提出的一种深度卷积神经网络模型。 VGGNet 探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了 16~19 层深的卷积神经网络,同时拓展性又很强,迁移到其它图片…...

题目:连续子序列
解题思路: 首先,不能使用暴力枚举,时间为O(n2),超时。以下为正确做法: 假设找到一段区间(其和>m),如上图黄色部分,那么该区间加上i后面的元素形成的新区间和都>m&a…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
软件工程教学评价
王海林老师您好。 您的《软件工程》课程成功地将宏观的理论与具体的实践相结合。上半学期的理论教学中,您通过丰富的实例,将“高内聚低耦合”、SOLID原则等抽象概念解释得十分透彻,让这些理论不再是停留在纸面的名词,而是可以指导…...

Gitlab + Jenkins 实现 CICD
CICD 是持续集成(Continuous Integration, CI)和持续交付/部署(Continuous Delivery/Deployment, CD)的缩写,是现代软件开发中的一种自动化流程实践。下面介绍 Web 项目如何在代码提交到 Gitlab 后,自动发布…...

成工fpga(知识星球号)——精品来袭
(如需要相关的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!) 《孩子都能学会的FPGA》系列是成工完成的第一个系列,也有一年多的时…...