持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
安装 Protocol Buffers v3
- 下载Protocol
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.zip
- 解压并安装protocol
unzip protobuf-all-3.5.1.zip
cd protobuf-3.5.1/
./configure
make
make install
- 验证是否安装成功
protoc --version
创建Go项目,并编写proto
- 创建一个grpc-example项目
$ mkdir grpc-example
$ go mod init grpc-example
- 安装grpc依赖
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
- 编写
hello_grpc.proto
文件 项目目录如下:
- proto
|- hello_grpc.proto
syntax = "proto3";
package say_hello;
option go_package="/say_hello";
service SayHelloService {
rpc SayHello(SayHelloRequest) returns (SayHelloResponse) {}
}
message SayHelloRequest {
string request = 1;
}
message SayHelloResponse {
string response = 1;
}
执行protoc --go_out=plugins=grpc:. *.proto
生成代码,生成后的项目结构如下
实现接口
type SayHelloServiceImpl struct {
}
func (SayHelloServiceImpl) SayHello(ctx context.Context, req *say_hello.SayHelloRequest) (resp *say_hello.SayHelloResponse, err error) {
resp = &say_hello.SayHelloResponse{}
if req.Name == "" {
return nil, errors.New("req name is invalid")
}
resp.HelloResponse = fmt.Sprintf("hello %s ~", req.Name)
return
}
启动server
var port = 8888
func main() {
server := grpc.NewServer()
say_hello.RegisterSayHelloServiceServer(server, new(SayHelloServiceImpl))
listen, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
panic(err)
}
if err := server.Serve(listen); err != nil {
panic(err)
}
}
client测试
var serverPort = 8888
func TestSayHello(t *testing.T) {
conn, err := grpc.Dial(fmt.Sprintf(":%d", serverPort), grpc.WithInsecure())
if err != nil {
t.Fatal(err)
}
defer conn.Close()
client := say_hello.NewSayHelloServiceClient(conn)
req := &say_hello.SayHelloRequest{
Name: "Tom",
}
resp, err := client.SayHello(context.Background(), req)
if err != nil {
t.Fatal(err)
}
t.Logf("resp: %s", resp.HelloResponse)
}
先启动server端,后指定客户端代码,终端会打印resp: hello Tom ~
验证成功。