gRPC调用坎坷历程记录
gRPC服务的架构图 RPC调用总的来说就是客户端调用存根的代码,然后存根代码和RPC库实现通信,服务端的存根收到了信息后交给具体的服务进行处理,之后再原路返回就完了。 这里附上一篇关于gRPC讲解的博客园的文章 Proto文件代码生成 项目的前后端都是使用的gRPC进行通信,都需要使用protoc编译器把之前定义好的proto文件进行编译生成对应的代码进行调用。 问题1 timestamp.proto文件找不到 timestamp.proto是google的一个时间戳的包,因为在我们自己的proto文件中使用到了google.protobuf.Timestamp,在proeo文件的最上方也要导入对应的proto文件import "google/protobuf/timestamp.proto"; 我记得在下载protoc编译器的时候,压缩包下面就有一个include文件夹,其中就包含有timestamp.proto文件 问题2 go代码生成对应的包名和位置对不上 项目的后端采用的是go,想要把proto文件编译成golang的代码。这就需要在proto文件中加上go_package的字段,比如: syntax = "proto3"; package rpc.auth; option go_package = "github.com/BigNoseCattyHome/aorb/backend/rpc/auth;auth"; import "google/protobuf/timestamp.proto"; // 定义消息,用于请求和响应结构 message LoginRequest { string username = 1; // 用户名/用户ID string password = 2; // 密码的md5摘要 string device_id = 3; // 设备ID google.protobuf.Timestamp timestamp = 4; // 时间戳 string nonce = 5; // 随机数 } 然后在使用protoc编译的时候,在命令行中也要加上go的一些选项,比如: protoc --go_out=. person.proto // 找到当前目录下的person.proto并生成go的代码,输出到当前目录(.) 但是又有了一个问题就是在该文件夹下面,会生成你的包名go_package的层级目录,最后才是你的最终代码。但是我想让proto文件直接生成在一个固定的文件夹位置,并且没有那么多的层级文件夹。 然后发现了有一个命令选项是--go_opt=paths=source_relative,使得生成的Go代码文件的路径与对应的.proto文件的路径保持一致 问题3 dart代码生成的时候老是存在找不到pb.xx 后来上google和stackoverflow看了半天,发现结果是依赖版本的问题,把protobuf的依赖版本从^2....