下载grpc包
go get google.golang.org/grpc
下载protoc命令包:https://github.com/protocolbuffers/protobuf/releases,随便安装在那个路径都行,把protoc.exe文件的路径放在系统环境变量上,这样在IDE的控制台才能执行protoc命令。
安装依赖项
- 1 代码生成工具: protoc-gen-go
- 2 由于前面已经安装grpc包了,这里就不用go get命令,直接go install 安装就行。
go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
上面步骤做完后,会在GOPATH目录下生成2个文件
创建一个 models.proto文件
syntax="proto3";
package grpc;
option go_package = ".;grpc";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
生成bp.go文件 '.' 代表当下文件
控制台执行命令 :
protoc --go_out=. *.proto
protoc --go-grpc_out=. *.proto
protoc 参数解析
- 1 protoc --go_out=path field (path 为输出的目录,field 为要解析的proto文件)
- 2 message 是protobuf最基本的数据单元,类似go里的结构体的存在.
- 3 service 定义服务处理函数的
service Search{
rpc SayHello (HelloRequest) returns (HelloReply);
}
Demo 示例
- 1 服务端
import (
"context"
grpcdemo "google.golang.org/grpc"
"net"
)
type Server struct{}
func (s *Server) SayHello(ctx context.Context, request *HelloRequest) (*HelloReply, error) {
res := &HelloReply{
Message: "hello___" + request.Name,
}
return res, nil
}
func main() {
g := grpcdemo.NewServer()
RegisterGreeterServer(g, &Server{})
lis, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
panic("监听错误:" + err.Error())
}
err = g.Serve(lis)
if err != nil {
panic("启动错误:" + err.Error())
}
}
- 2 客户端
func clientRpc(body map[string]string) (*HelloReply, error) {
conn, err := grpc.Dial("127.0.0.1:8888", grpc.WithInsecure())
if err != nil {
return nil, err
}
defer conn.Close()
rpc := NewGreeterClient(conn)
response, err := rpc.SayHello(context.Background(), &HelloRequest{Name: body["name"]})
if err != nil {
return nil, err
}
return response, nil
}
func main() {
body := make(map[string]string)
body["name"] = "红楼梦~"
response, err := clientRpc(body)
if err != nil {
fmt.Println("rpc调用失败:", err)
return
}
fmt.Println("服务端返回的响应__:", response.Message)
}
-
3 启动服务端后再启动客户端代码:
版本包的坑
1 github.com/golang/protobuf/protoc-gen-go 旧版本包
2 google.golang.org/protobuf/cmd/protoc-gen-go 谷歌接管后的新包
3 它们之间生成的命令行是不一样的,生成后的文件也不一样
4 protoc --go_out=plugins=grpc:. helloworld.proto 这个命令是github版本包的生成命令
5 如果报"protoc-gen-go-grpc: Plugin failed with status code 1." 该命令不是本包的命令,是由于前面 go install 的时候没有安装好依赖项!
在proto文件里的message每个字段都有唯一的编号标识符
- 1 【1-15】范围内只占用一个字节
- 2 【16-2047】之内的标识符占用2个字节
- 3 更多细节请看官网文档:https://developers.google.com/protocol-buffers/docs/proto3#simple