Grpc&&protocol buffer
关于下载:首先下载一个protobuf
- 对于mac系统就
brew install protobuf
就可以了。然后可以protoc --version
看下安装的版本号,默认按最新版。 - 如果想手动按就去官网下载
https://github.com/protocolbuffers/protobuf/releases
下载go语言的proto插件
- protoc -h 看到没有 --go_out 就没法生成go的pb.proto代码,所以需要下载 go的插件-----执行下面命令,从源端下载
go get -u -v github.com/golang/protobuf/protoc-gen-go
下载grpc
go get -u google.golang.org/grpc
- 如果用go module的话 ,如下引入,可以改成想要的版本
require (
google.golang.org/grpc v1.33.1
google.golang.org/protobuf v1.25.0
)
###根据proto生成 pb.go
先展示一下目录结构
$ tree
.
├── README.md
├── client.go
├── db
│ └── mongo
│ └── pool.go
├── go.mod
├── go.sum
├── grpc
│ ├── user
│ │ └── user.pb.go
│ └── user.proto
├── server.go
└── service
└── userservice.go
其中user.proto如下所示
syntax = "proto3";
// user 包
package user;
// 指定 go 的包路径及包名
// option go_package="github.com/isMe/grpcdemo.git/grpc/user;user";
// User 服务及服务接口的定义
service User {
rpc UserIndex(UserIndexRequest) returns (UserIndexResponse) {}
rpc UserId(UserIdRequest) returns (UserIdResponse){}
rpc UserDelete(UserDeleteRequest) returns (UserDeleteResponse) {}
rpc UserInsert(UserInsertRequest) returns (UserInsertResponse){}
}
// 枚举类型
enum EnumUserSex {
SEX_FEMALE = 0; // 枚举类型必须以 0 起始
SEX_MALE = 1;
}
// 用户实体模型
message UserEntity {
string name = 1;
int32 age = 2;
repeated string hobby = 3;
EnumUserSex sex = 4;
}
// User 服务的各个接口的请求/响应结构
message UserIndexRequest {
int32 page = 1;
int32 pageSize = 2;
}
message UserIndexResponse {
int32 err = 1;
string msg = 2;
// 返回一个 UserEntity 对象的列表数据
repeated UserEntity data = 3;
}
message UserIdRequest {
int64 id = 1;
}
message UserIdResponse {
int32 err = 1;
string msg = 2;
UserEntity data = 3;
}
message UserDeleteRequest {
int64 id = 1;
}
message UserDeleteResponse {
int32 err = 1;
string msg = 2;
}
message UserInsertRequest {
UserEntity data = 1;
}
message UserInsertResponse {
int32 err = 1;
string msg = 2;
}
- 生成pb.go 在grpc目录下执行
protoc --proto_path=. --go_out=plugins=grpc:./user user.proto
- –proto_path是proto文件所在位置
- –go_out这个是go的输出,要加上grpc插件
- 最后跟上要编译的proto文件
以上操作已经把API都创建好了,接下来只需要写impl实现的server端就行了,如果另一端调用只需创建该API服务的grpcClient即可。代码库如下,把server和client run一下就行了。
我把整个demo的grpc服务放到GitHub上面了,可以点击>>>> 下载源码
https://github.com/StrandingHeart/GrpcDemo