安装
安装protobuf
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
命令执行会在GOPATH/bin目录下自动生成protoc-gen-go.exe可执行文件;
另外还需要一个proto.exe可执行文件,可以从https://github.com/google/protobuf/releases自行下载,同样放到GOPATH/bin目录下;
安装gRPC
go get -u google.golang.org/grpc
实例
目录结构
编写.proto文件
syntax = "proto3"; // proto版本
package love; // 指定包名,默认go中包名也是这个
option go_package = "love"; // 指定go包名
// 定义Love服务
service Love {
// 定义Confession方法
rpc Confession(Request) returns (Response) {}
}
// 请求
message Request {
string name = 1;
}
// 响应
message Response {
string result = 1;
}
编译生成.pb.go文件
$ cd test/gRPC/proto/love
# 编译love.proto
$ protoc -I . --go_out=plugins=grpc:. ./love.proto
实现服务端接口
package main
import (
"context"
"google.golang.org/grpc"
"log"
"net"
"test/gRPC/proto/love"
)
// 定义Love服务
type Love struct {
}
// 实现Love服务接口
func (l *Love) Confession(ctx context.Context, request *love.Request) (*love.Response, error) {
resp := &love.Response{}
resp.Result = "I love you " + request.Name
return resp, nil
}
func main() {
// 监听8888端口
listen, err := net.Listen("tcp", ":8888")
if err != nil {
log.Fatal(err)
}
// 实例化grpc server
s := grpc.NewServer()
// 注册Love服务
love.RegisterLoveServer(s, new(Love))
log.Println("Listen on 127.0.0.1:8888...")
s.Serve(listen)
}
实现客户端调用
package main
import (
"context"
"google.golang.org/grpc"
"log"
"test/gRPC/proto/love"
)
func main() {
// 连接grpc服务
conn, err := grpc.Dial(":8888", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
// 很关键
defer conn.Close()
// 初始化客户端
c := love.NewLoveClient(conn)
// 发起请求
response, err := c.Confession(context.Background(), &love.Request{Name: "BaoBao"})
if err != nil {
log.Fatal(err)
}
log.Println(response.Result)
}
运行结果
公众号:李田路口