这篇文章介绍了如何在Go中使用gRPC。首先,它解释了如何在.proto文件中定义服务,并使用protocol buffer编译器生成客户端和服务端代码。然后,它详细介绍了如何安装gRPC包,设置环境变量,以及如何创建gRPC服务器和客户端。最后,它提供了一个完整的gRPC示例代码,并提供了代码的GitHub链接。
相关定义
- 在
.proto
文件中定义一个服务。 - 使用protocol buffer编译器生成客户端和服务端代码。
- 使用gRPC的Go API为你的服务写一个客户端和服务器。
安装grpc包
go get google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
设置环境变量
export PATH=$(go env GOPATH)/bin:$PATH
Server
目录结构
grpc-server/
├── go.mod
├── go.sum
├── grpc-server.iml
├── proto
│ ├── demo.pb.go
│ └── demo.proto
├── server.go
└── service
└── get_data.go
定义proto文件
syntax = "proto3";
package proto;
option go_package = ".;proto";
service Demo {
rpc GetData(DemoReq) returns (DemoRsp){}
}
message DemoReq {
string a = 1; // 请求参数a
}
message DemoRsp{
string rel = 1; // 返回参数值
}
生成pb.go文件
protoc --go_out=plugins=grpc,paths=source_relative:. *.proto
demo.pb.go
文件生成
server.go
package main
import (
"fmt"
"google.golang.org/grpc"
"grpc-server/proto"
"grpc-server/service"
"log"
"net"
)
const grpcPort = 6655
func main() {
l, err := net.Listen("tcp", fmt.Sprintf(":%d", grpcPort))
if err != nil {
log.Fatal(err)
}
g := grpc.NewServer()
//注册server,使用service.go文件中的Demo方法
proto.RegisterDemoServer(g, &service.Demo{})
if err = g.Serve(l); err != nil {
log.Fatal(err)
}
}
service.go
package service
import (
"context"
"grpc-server/proto"
)
type Demo struct {
}
// 方法实现,直接把请求参数返回
func (c Demo) GetData(ctx context.Context, msg *proto.DemoReq) (*proto.DemoRsp, error) {
params := msg.A
return &proto.DemoRsp{
Rel: params,
}, nil
}
client
目录结构
grpc-client/
├── client.go
├── go.mod
├── go.sum
└── proto
├── demo.pb.go
└── demo.proto
文件拷贝
将Server
服务生成的demo.pb.go
文件拷贝到Client
目录中。
client.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpc-client/proto"
)
const (
grpcAddr = "127.0.0.1:6655"
)
func main() {
c, err := grpc.Dial(grpcAddr, grpc.WithInsecure())
if err != nil {
panic(c)
}
// 发送grpc请求 请求参数为123
rsp, err := proto.NewDemoClient(c).
GetData(context.Background(), &proto.DemoReq{
A: "123",
})
// 打印返回的值
fmt.Println(rsp)
}