搭建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:WorkCodeGosrc estproto> 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.proto
syntax = “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 是编译器,用于将…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_write_stderr函数
定义 在ngx_log.h 中 static ngx_inline void ngx_write_stderr(char *text) {(void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text)); } 在开发软件时,尤其是像 Nginx 这样复杂的服务器软件,开发者需要一种方法来输出调试信息或者错误信息。这段代码…...
使用requestAnimationFrame减少浏览器重绘
文章目录 介绍使用使用rAF前使用rAF后 介绍 在屏幕中,浏览器通常都以60FPS(1/60 s)每帧更新屏幕,但是当前端绑定了一些高频事件,如鼠标移动,屏幕滚动、触摸滑动等时,在一帧的周期内,…...
autMan奥特曼机器人-对接deepseek教程
一、安装插件ChatGPT 符合openai api协议的大模型均可使用此插件,包括chatgpt-4/chatgpt-3.5-turbo,可自定义服务地址和模型,指令:gpt,要求Python3.7以上,使用官方库https://github.com/openai/openai-pyt…...
一个精简完整的全栈电商平台采用现代化技术栈和安全架构
以下是一个精简但完整的全栈电商平台实现,采用现代化技术栈和安全架构: 架构设计 前端:SvelteKit + TypeScript (SSR/SSG) 后端:Go 1.21 + Fiber框架 数据库:MySQL 8.0 + Redis 7.0 安全:Cloudflare WAF + JWT+HTTPOnly+Secure Cookie 部署:Docker Swarm + Traefik (自…...
数据分析:企业数字化转型的金钥匙
引言:数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下,有研究表明,只有不到30%的企业能够充分利用手中掌握的数据,这是否让人深思?数据已然成为企业最为宝贵的资产之一。然而,企业是否真正准备好从数…...
MySQL中datetime类型23:59:59变成下一天的00:00:00
1. 现象 公司项目中有一个统计的业务需求,需要记录数据的开始和结束时间点,对应的是MySQL表中的datetime类型。结束时间是当天的23:59:59,但是java程序中是对的时间,但是Mybatis-plus入库了之后查看数据库却变成第二天的00:00:00&…...
玩转Docker | 使用Docker部署httpd服务
玩转Docker | 使用Docker部署httpd服务 前言一、准备工作环境确认检查操作系统准备网站目录和配置文件二、拉取httpd镜像三、运行httpd容器运行容器命令检查容器状态四、验证httpd服务浏览器访问测试错误排查五、容器管理与维护查看容器状态停止和启动容器更新网站内容和配置六…...
Vue 双向数据绑定的原理
Vue 的双向数据绑定是其核心特性之一,它可以让视图与数据保持同步,简化了开发者在 DOM 操作上的工作。Vue 的双向数据绑定通过 响应式系统 和 DOM 事件监听 来实现,当数据发生变化时,视图会自动更新;当视图中的元素&am…...
Spring Web MVC项目的创建及使用
一、什么是Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构…...
32.日常算法
1.最大子数组和 题目来源 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,…...
MySQL的底层原理与架构
前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知,Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的,下面将主要…...
python Excel 表读取合并单元格以及清除空格符
读取合并单元格并保留合并信息 读取合并单元格并保留合并信息清除各单元格的空格和换行符,并去除列名中的空格和换行符 读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题&…...
Node.js 实现简单爬虫
介绍 爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 本文将使用 Nodejs 编写一个简单的爬虫脚本,爬取一个美食网站,获取菜品的标题和图片链接,并以表格的形式输出。 准备工作 1、初始化项目 首先࿰…...
【Pytorch】nn.RNN、nn.LSTM 和 nn.GRU的输入和输出形状
nn.RNN、nn.LSTM 和 nn.GRU的输入和输出形状 输入形状通用输入参数特殊情况(LSTM) 输出形状nn.RNN 和 nn.GRUnn.LSTM 代码示例 输入形状 通用输入参数 这三个模块通常接收以下两种形式的输入: 输入序列:形状为 (seq_len, batch…...
代码随想录算法训练营第三十一天| 回溯算法04
491. 递增子序列 题目: 代码随想录 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 这题需要注意的点: 1. path长度在2以上才放入最终结果 2. 需要记录已经使用过的数字&am…...
2024.1版android studio创建Java语言项目+上传gitee
1.在gitee上创建仓库 Gitee 创建仓库并邀请成员指南_gitee创建仓库邀请成员-CSDN博客 见1 2.新建android studio项目 3.在Android studio配置gitee Android Studio提交代码到gitee仓库_android log in to gitee-CSDN博客 其中的一二步 p.s.添加gitee账户选择password时&a…...
React 打印插件 -- react-to-print
一、安装依赖 npm install react-to-print 二、使用 import { useReactToPrint } from "react-to-print"; import React, { useRef, forwardRef } from react;const Content () > {const contentRef useRef(null);const reactToPrintFn useReactToPrint({ c…...
opentelemetry-collector 配置elasticsearch
一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …...
SQL Server 数据库迁移到 MySQL 的完整指南
文章目录 引言一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据 二、迁移工具的选择2.1 使用 MySQL Workbench2.2 使用第三方工具2.3 手动迁移 三、迁移步骤3.1 导出 SQL Server 数据库结构3.2 转换数据类型和语法3.3 导入 MySQL 数据库3.4 迁移数据3.5 迁移存…...
C# SQlite使用流程
前言 不是 MySQL 用不起,而是 SQLite 更有性价比,绝大多数的应用 SQLite 都可以满足。 SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎,它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机…...
MySQL数据库 (三)- 函数/约束/多表查询/事务
目录 一 函数 (一 字符串函数 (二 数值函数 (三 日期函数 (四 流程函数 二 约束 (一 概述 (二 约束演示 (三 外键约束 三 多表查询 (一 多表关系 1 一对多(多对一) 2 多对多 3 一对一 (二 多表查询概述 (三 内连接 1 查询语法 2 代码实…...
【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试
《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权(Broken object-level authorization)1.5 破防的属性级授权&a…...
攻防世界baigeiRSA
打开题目附件 import libnum from Crypto.Util import number from secret import flagsize 128 e 65537 p number.getPrime(size) q number.getPrime(size) n p*qm libnum.s2n(flag) c pow(m, e, n)print(n %d % n) print(c %d % c)n 8850300144784503160345704866…...
12.7 LangChain代理系统Agents深度解析:构建自主决策的智能体应用
LangChain代理系统Agents深度解析:构建自主决策的智能体应用 一、代理系统的核心价值 代理系统是大模型应用的决策中枢,通过动态工具调度和任务分解,突破传统链式流程的三大局限: 动态规划:根据实时反馈调整执行路径工具集成:无缝对接500+外部系统API认知迭代:通过记忆…...
解释一下数据库中的事务隔离级别,在 Java 中如何通过 JDBC设置事务隔离级别?
数据库中的事务隔离级别是用于控制并发事务之间相互影响的一种机制。 它定义了事务之间的可见性和影响范围,常见的隔离级别包括: 读未提交(Read Uncommitted):最低的隔离级别,事务中的修改即使没有提交也…...
[NKU]C++安装环境 VScode
bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂!!大学生及初学初学C/C进!!!_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 2安装插件 2.1 C/C 2.2 C/C Compile run 2.3 better C Syntax 查看已…...
Node.js 环境配置
什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境,它允许你在服务器端运行 JavaScript。传统上,JavaScript 主要用于浏览器中的前端开发,而 Node.js 使得 JavaScript 也能够在服务器上执行,…...
1Panel应用推荐:WordPress开源博客软件和内容管理系统
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...
C++:string类的模拟实现
目录 1.引言 2.C模拟实现 2.1模拟实现构造函数 1)直接构造 2)拷贝构造 2.2模拟实现析构函数 2.3模拟实现其他常规函数 1)c_str函数 2)size函数 3)begin/end函数 4)reserve函数 5)re…...

![[图片]](https://i-blog.csdnimg.cn/direct/d0fa041bd80b4f31ad8ef47cdd212c03.png)



