(一)环境搭建
1.安装protoc工具
地址:https://github.com/protocolbuffers/protobuf/releases
找到需要的版本,windows的下载protoc-3.12.4-win64.zip(版本可自行选择)
或protoc-3.12.4-win32.zip(版本可自行选择),找个地方解压,然后将bin加入path
2.安装protoc-gen-go 插件
地址:https://github.com/protocolbuffers/protobuf-go
下载成功后,然后进入 protobuf-go\cmd\protoc-gen-go 目录
执行go install ,此时protoc-gen-go已经安装在gopath/bin 目录下了
3.安装protoc-gen-go-grpc 插件
地址:https://github.com/grpc/grpc-go
下载成功后,进入grpc-go\cmd\protoc-gen-go-grpc目录
执行go install 此时protoc-gen-go-grpc已经安装在gopath/bin 目录下了
至此环境搭建已经成功了,需要注意的是,本人已将gopath加入path环境变量,如果不加入的话,可以自行将相关插件加入path
(二)入门
1.搭建server端
找个地方建个server文件夹(不要放在gopath下面)
进入server目录执行go mod init server (建立module)
在server目录下面建个pb文件夹(此文件夹放.proto文件)
在pb文件夹下面建个arith.proto文件,内容如下:
syntax = "proto3";
package pb;
option go_package = ".;pb";
message ArithRequest {
double num1 = 1;
double num2 = 2;
}
message ArithResponse {
double result = 1;
}
service Arith {
rpc multiply (ArithRequest) returns (ArithResponse);
rpc divide (ArithRequest) returns (ArithResponse);
}
在pb目录下执行
protoc --go_out=. --plugin=grpc .\arith.proto
protoc --go-grpc_out=requireUnimplementedServers=false:. .\arith.proto
以上两条是根据proto文件自动生成go文件,至于proto的书写规则,去网上看看就知道了
回到server目录下,建个server.go文件,内容如下:
package main
import (
"context"
"errors"
"log"
"net"
"server/pb"
"google.golang.org/grpc"
)
type Arith struct{}
//乘法
func (m *Arith) Multiply(ctx context.Context, req *pb.ArithRequest) (resp *pb.ArithResponse, err error) {
resp = new(pb.ArithResponse)
resp.Result = req.Num1 * req.Num2
return resp, nil
}
// 除法
func (m *Arith) Divide(ctx context.Context, req *pb.ArithRequest) (resp *pb.ArithResponse, err error) {
resp = new(pb.ArithResponse)
if req.Num2 == 0 {
return nil, errors.New("the dividend is 0")
}
resp.Result = req.Num1 / req.Num2
return resp, nil
}
func main() {
lis, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
log.Fatal("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterArithServer(s, &Arith{})
log.Println("proto server start")
err = s.Serve(lis)
if err != nil {
log.Fatal(err)
}
}
在server目录下执行 go run server.go,服务端就建立起来了
2.搭建client客户端
建个client文件夹,进入client目录执行 go mod init client,建立pb文件夹,进入pb目录,将server>pb>arith.proto文件拷贝至此,然后执行
protoc --go_out=. --plugin=grpc .\arith.proto
protoc --go-grpc_out=requireUnimplementedServers=false:. .\arith.proto
然后在client目录下面新建client.go文件,内容如下:
package main
import (
"context"
"log"
"time"
pb "client/pb"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:8888", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewArithClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.Multiply(ctx, &pb.ArithRequest{Num1: 1.0, Num2: 2.0})
if err != nil {
log.Fatal(err)
}
log.Printf("result: %f", r.Result)
ctx2, cancel2 := context.WithTimeout(context.Background(), time.Second)
defer cancel2()
r, err = c.Divide(ctx2, &pb.ArithRequest{Num1: 1.0, Num2: 2.0})
if err != nil {
log.Fatal(err)
}
log.Printf("result: %f", r.Result)
}
然后执行 go run client.go,就会得到结果:
2020/08/04 18:34:41 result: 2.000000
2020/08/04 18:34:41 result: 0.500000