Window环境下使用go编译grpc最新教程

网上的grpc教程都或多或少有些老或者有些问题,导致最后执行生成文件时会报很多错。这里给出个人实践出可执行的编译命令与碰到的报错与解决方法。(ps:本文代码按照煎鱼的教程编写:4.2 gRPC Client and Server - 跟煎鱼学 Go (gitbook.io))

最后看了官网,果然只有官网的教程不会太老导致不可用。

  • 项目目录结构
grpc_test
├─client
|   └─main
|      └─client.go
└─proto
|   |─grpc
|   └─search.proto
└─server└─main└─server.go
  • 下载protoc不做介绍请自行下载

    下载后执行protoc --version

    输出类似以下信息则安装成功,否则卸载重新安装

    libprotoc 25.1
    
  • 下载go编译proto插件

    下面的命令已废弃!不要使用

    go get -u github.com/golang/protobuf/protoc-gen-go
    

    请使用下面命令!

    go get -u google.golang.org/grpc
    go install google.golang.org/protobuf/cmd/protoc-gen-go
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
    

    观察GOPATH目录的bin下有两个文件

    在这里插入图片描述

  • 编写search.proto文件

    syntax = "proto3";package proto;service SearchService {rpc Search(SearchRequest) returns (SearchResponse) {}
    }message SearchRequest {string request = 1;
    }message SearchResponse {string response = 1;
    }
    
  • 执行编译命令

    $ protoc --go_out=plugins=grpc:. *.proto
    

以上是煎鱼的grpc教程,可能由于版本或者环境导致现在并不能使用了,下面列出我遇到的报错以及如何解决

  • 报错一:插件旧库已废弃,且安装新库命令由于本地go tool版本不匹配安装失败

    执行下面命令报错该库已经废弃

    go get -u github.com/golang/protobuf/protoc-gen-go
    

    执行下面命令时报错tool的版本不对

    go install google.golang.org/protobuf/cmd/protoc-gen-go
    

    报错信息

    compile: version "go1.20.13" does not match go tool version "go1.21.6"
    

    该报错导致插件下载失败,网上说是升级版本时以前的库没删干净,但是我并没用找到以前的库。所以我全部重新安装了最近的1.22

    • 首先把GOPATH下三个文件夹里文件全部删除

    • 把GOROOT里文件全部删除

    • 去官网重新下载Windows版本的1.22的zip文件解压到我的GOROOT里(ps:安装新版本后本地执行go version可能还是以前的版本,不用担心,这是本地环境的缓存,重启一下再go version就好,就像linux里修改环境文件都要sourse一下才能使用)

      重新执行插件安装命令,执行成功!

  • 报错二:执行编译命令失败

    执行下面编译命令时报错

    $ protoc --go_out=plugins=grpc:. *.proto
    

    报错

    'protoc-gen-go' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    --go_out: protoc-gen-go: Plugin failed with status code 1.
    

    原因:该命令不可用或者本地插件环境未配置好

    下面把GOPATH的bin目录下新下载的文件安装到GOROOT下bin中解决!

    在这里插入图片描述

    我本地GOROOT的文件夹是go

    在这里插入图片描述

  • 报错三:输出参数不对

    --proto_path passed empty directory name.  (Use "." for current directory.)
    

    这是proto3后来规定文件中必须要配置go_package参数,在文件中配置加上此参数以解决(protoc 3.10 版本后可能会报此错误)

    syntax = "proto3";package proto;option go_package = "/grpc;proto";service SearchService {rpc Search(SearchRequest) returns (SearchResponse) {}
    }message SearchRequest {string request = 1;
    }message SearchResponse {string response = 1;
    }
    

    option go_package = “/grpc;proto”;

    分号前是输出的 .pb.go 文件的路径,路径不存在会自动创建

    分号后是输入的 .pb.go 文件的包名

    最后进入proto目录并执行下面命令,grpc目录下会自动生成编译文件(ps:grpc目录自己创建,不建议生成编译go文件在proto中,因为grpc的缺陷是后面修改proto文件都需要重新编译生成go文件,若proto文件写错了会覆盖原来好的文件。建议生成在别的目录下确认不误后再投入使用)

    另外煎鱼的教程可能版本只能生成一个go文件,代码也不对了。请使用下面命令!

    protoc --go_out=. --go-grpc_out=. search.proto
    
    • 煎鱼的代码可能也是不能用了,我重写了一下,加上timeoutcontext的超时关闭逻辑,测试后可以正常运行

    client.go

    package mainimport ("context""fmt""log""time""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_test/proto/grpc"proto "grpc_test/proto/grpc"
    )const address = "127.0.0.1:9001"func getGrpcConn(address string) (*grpc.ClientConn, *proto.SearchServiceClient, *context.CancelFunc, error) {ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)// timeoutcontex用于超时自动关闭// grpc.WithBlock()用于配置gRPC客户端连接阻塞并等待连接建立或失败后再返回// 在需要确保连接就绪后再继续执行后续代码的场景中很有用// grpc现在强制要求设置TLS,withinsurance已经废弃conn, err := grpc.DialContext(ctx, address, grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {msg := fmt.Sprintf("did not connect to %v error %v", address, err)log.Println(msg)}client := proto.NewSearchServiceClient(conn)return conn, &client, &cancel, err
    }func main() {conn, client, _, _ := getGrpcConn(address)defer conn.Close()// Contact the server and print out its response.ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()// 使用服务端函数resp, err := (*client).Search(ctx, &pb.SearchRequest{Request: "gRPC"})if err != nil {log.Fatalf("client.Search err: %v", err)}log.Printf("resp: %s", resp.GetResponse())
    }
    

    server.go

    package mainimport ("context""fmt""log""net""google.golang.org/grpc"pb "grpc_test/proto/grpc")type SearchService struct {pb.UnimplementedSearchServiceServer
    }func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) {fmt.Println("sever serching")return &pb.SearchResponse{Response: r.GetRequest() + " Server"}, nil
    }const PORT = "9001"func main() {// 获取grpc服务端(被调用方)server := grpc.NewServer()// 服务端映射到结构体SearchService{}(注册)pb.RegisterSearchServiceServer(server, &SearchService{})// 建立tcp端口监听lis, err := net.Listen("tcp", ":"+PORT)if err != nil {log.Fatalf("net.Listen err: %v", err)}// 服务端监听tcp连接if err := server.Serve(lis); err != nil {log.Fatalf("net.Listen err: %v", err)}
    }
    

    有兴趣的可以看看rpc的设计原理,其实大多应用在使用时就可以反映出大致原理,rpc的设计框架也是,从网络传输协议,序列化协议,消息编码协议三层设计,另外加上函数注册和参数注册的逻辑。利用tcp或者http建立连接,传输编码后的请求参数,将参数解码后在本地找到对应函数,本地执行对应函数并填充回包,再把回包编码通过网络连接返回。即在网络连接上实现双方无感知调用对方函数。

    参考文件

    记不得了,全网教程几乎都看了,参考太多了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不到1s生成mesh! 高效文生3D框架AToM

论文题目: AToM: Amortized Text-to-Mesh using 2D Diffusion 论文链接: https://arxiv.org/abs/2402.00867 项目主页: AToM: Amortized Text-to-Mesh using 2D Diffusion 随着AIGC的爆火,生成式人工智能在3D领域也实现了非常显著…

Windows系统安装Flink及实现MySQL之间数据同步

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink的设计目标是在所有常见的集群环境中运行,并以内存执行速度和任意规模来执行计算。它支持高吞吐、低延迟、高性能的流处理,并且是一个面向流处理和批处理…

基于matlab的密度散点图绘制

1. 什么是密度散点图? 密度散点图就是在普通散点图的基础上,基于样本点一定范围的样本数计算该样本点的密度,以不同的颜色来显示样本点密度的大小,这样能够直观的显示出数据的空间聚集情况,如下图分别是二维和三维密度…

###C语言程序设计-----C语言学习(11)#数据的存储和基本数据类型

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 数据的存储 1.整型数据的存储 计算机处理的所有信息都以二进制形式表示…

Nginx实战:1-安装搭建

目录 前言 一、yum安装 二、编译安装 1.下载安装包 2.解压 3.生成makefile文件 4.编译 5.安装执行 6.执行命令软连接 7.Nginx命令 前言 nginx的安装有两种方式: 1、yum安装:安装快速,但是无法在安装的时候带上想要的第三方包 2、…

windowsserver 2016 PostgreSQL9.6.3-2升级解决其安全漏洞问题

PostgreSQL 身份验证绕过漏洞(CVE-2017-7546) PostgreSQL 输入验证错误漏洞(CVE-2019-10211) PostgreSQL adminpack扩展安全漏洞(CVE-2018-1115) PostgreSQL 输入验证错误漏洞(CVE-2021-32027) PostgreSQL SQL注入漏洞(CVE-2019-10208) PostgreSQL 安全漏洞(CVE-2018-1058) …

DolphinScheduler-3.2.0 集群搭建

本篇文章主要记录DolphinScheduler-3.2.0 集群部署流程。 注:参考文档: DolphinScheduler-3.2.0生产集群高可用搭建_dophinscheduler3.2.0 使用说明-CSDN博客文章浏览阅读1.1k次,点赞25次,收藏23次。DolphinScheduler-3.2.0生产…

NGINX upstream、stream、四/七层负载均衡以及案例示例

文章目录 前言1. 四/七层负载均衡1.1 开放式系统互联模型 —— OSI1.2 四/七层负载均衡 2. Nginx七层负载均衡2.1 upstream指令2.2 server指令和负载均衡状态与策略2.2.1 负载均衡状态2.2.2 负载均衡策略 2.3 案例 3. Nginx四层负载均衡的指令3.1 stream3.2 upstream指令3.3 四…

基于SpringBoot+Vue的服装销售商城系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

【知识整理】接手新技术团队、管理团队

引言 针对目前公司三大技术中心的不断升级,技术管理岗位要求越来越高,且团队人员特别是管理岗位的选择任命更是重中之重,下面针对接手新的技术团队做简要整理; 一、实践操作 1、前期准备 1、熟悉情况: 熟悉人员&am…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

如何入门AI Agent?

随着chatgpt问世,大模型已经在加速各行各业的变革,这是我之前对AI Agent行业的粗浅判断。 下面给大家介绍一下如何制作AI Agent,我会用我开发的全赞AI为例子进行简要的介绍,下面是一种工具型AI Agent的框架图 这是一个大量使用工具…

docker复习笔记01(小滴课堂)安装+部署mysql

查看内核版本。 关闭防火墙: 查看docker版本: 下载阿里yum源: 再看一下yum版本都有哪些: 我们可以看的docker-ce了。 安装它: 设置docker服务开机启动: 更新日志文件: 启动docker: …

LLM之LangChain(七)| 使用LangChain,LangSmith实现Prompt工程ToT

如下图所示,LLM仍然是自治代理的backbone,可以通过给LLM增加以下模块来增强LLM功能: Prompter AgentChecker ModuleMemory moduleToT controller 当解决具体问题时,这些模块与LLM进行多轮对话。这是基于LLM的自治代理的典型情况,…

15.3 Redis入门(❤❤❤❤)

15.3 Redis入门❤❤❤❤ 1. redis简介与配置1.1 简介1.2 Windows安装1.3 Linux安装1.4 守护进程方式启动1.5 客户端启动与使用1.6 指定生成日志 2. 使用2.1 客户端redis使用命令2.2 redis存储的数据类型1. String字符串类型2. Hash键值类型3. List列表类型4. Set与Zset集合类型…

JVM-双亲委派机制

双亲委派机制定义 双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过, 再由顶向下进行加载。 详细流程 每个类加载器都有一个父类加载器。父类加载器的关系如下,启动类加载器没有父类加载器&am…

基于springboot + Thymeleaf + vue开发的 个人博客,含前后端

作者:ChenZhen 本人不常看网站消息,有问题通过下面的方式联系: 邮箱:1583296383qq.comvx: ChenZhen_7 我的个人博客地址:https://www.chenzhen.space/🌐 版权:本文为博主的原创文章&#xff…

【深度学习】实验7布置,图像超分辨

清华大学驭风计划 因为篇幅原因实验答案分开上传, 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 &#xff1…

Python爬虫——请求库安装

目录 1.打开Anaconda Prompt 创建环境2.安装resuests3.验证是否安装成功4.安装Selenium5.安装ChromeDriver5.1获取chrom的版本5.1.1点击浏览器右上三个点5.1.2点击设置5.1.3下拉菜单,点击最后关于Chrome,获得其版本 5.2 打开网址 [chromedriver](https:/…