gRPC使用流程

proto文件 在项目根目录下,创建pb_file/agent.proto文件。 syntax = "proto3"; option go_package = ".;pb_file"; // agent/pb_file 两部分,第一部分生成的代码路径,第二部分是所属的包名 // 格式也可以是 agent;pb_file package pb_file; service AgentService { rpc Ping (PingInfo) returns (PingResponse); } message PingInfo { string User = 1; } message PingResponse { bool Success = 1; } // 在 gRPC 的 Protocol Buffers(protobuf)定义文件(.proto 文件)中, // 数字标识符(tag)用于标识字段的唯一标识符。它们是非负整数,可以在字段定义中指定。 // 通常情况下,我们会从 1 开始为字段分配数字标识符,并按照定义顺序逐个递增。 // 这样做的好处是,可以使消息的结构更加清晰,易于维护和扩展。 // 在将来,如果需要向消息中添加新的字段,可以向现有定义的字段之间插入新的字段,而不必破坏现有的客户端和服务器代码。 编译go代码 安装工具 go get -u google.golang.org/grpc go get -u github.com/golang/protobuf/protoc-gen-go 在项目根目录下,执行命令,生成对应的go代码 protoc --proto_path=pb_file pb_file/agent.proto --go-grpc_out=./pb_file --go_out=./pb_file 此时项目结构为: 🕙[ 08:58:32 ] ➜ tree . . |-- README.md |-- go.mod |-- go.sum |-- ...
2023年10月04日

GOPATH、GoModules

go env命令,可以查询到GO相关的环境变量 在 Golang 中,有两个概念非常容易弄错,第一个就是 GoPath,第二个则是 GoModule,特别是随着Go版本的更新,好多文档没有及时更新,导致初学者对两者模糊不清,一头雾水。 什么是 GoPath GoPath 是 Golang 的工作空间,所有的 Go 文件,都需要放在 GoPath 下的 src 目录下才能够编译运行,所以我提议不要直接配置全局的 GoPath 目录,否则会非常难以管理所有的 Golang 项目。 我们在项目中使用第三方类库的时候,使用go get命令去下载安装的第三方类库的包,而拉取下来的包就会直接下载到 GoPath 目录下的 src 中。GOPATH本身是不区分项目的,代码中任何import的路径均从GOPATH为根目录开始; 不区分依赖项版本 当有多个项目时,不同项目对于依赖库的版本需求不一致时,无法在一个GOPATH下面放置不同版本的依赖项。典型的例子:当有多项目时候,A项目依赖C 1.0.0,B项目依赖C 2.0.0,由于没有依赖项版本的概念,C 1.0.0和C 2.0.0无法同时在GOPATH下共存,解决办法是分别为A项目和B项目设置GOPATH,将不同版本的C源代码放在两个GOPATH中,彼此独立(编译时切换),或者C 1.0.0和C 2.0.0两个版本更改包名。无论哪种解决方法,都需要人工判断更正,不具备便利性。 并且不同的 GoPath 都需要下载依赖,那么磁盘中重复的依赖就会非常多,会占用大量的磁盘空间。 依赖项列表无法数据化 在项目中没有任何语义化的数据可以知道当前项目的所有依赖项,需要手动找出所有依赖。对项目而言,需要将所有的依赖项全部放入源代码控制中。如果剔除某个依赖,需要在源代码中手工确认某个依赖是否剔除。 为了解决这所有的问题,Golang 最终引入了 GoModule 的概念。 什么是 GoModule GoModule 是 Golang 在 1.11 版本初步引入的概念,在 1.12 版本中正是开始使用,所以如果需要使用 GoModule,那么需要保证你的 Golang 的版本在 1.12 或以上。 另外需要说一下,Golang1.11 和 1.12 版本虽然已经引入了 GoModule 的概念,但是 GoModule 是默认不开启的,如果需要开启,那么需要配置一个环境变量:GO111MODULE=on,默认是off。 而在 Golang1.13 及以上的版本中,GoModule 的默认配置为 auto,即 GoModule 会通过你的目录下是否有 go.mod 文件来判断是否开启 GoModule。所以 Golang1.13 + 的版本中我们就不需要配置 GO111MODULE 属性了。 那么究竟什么是 GoModule? Go Modules是语义化版本管理的依赖项的包管理工具;它解决了GOPATH存在的缺陷,最重要的是,它是Go官方出品。 说得直白一下,GoModule 就是一个用来取代 GoPath 的 Golang ...
2023年10月04日