grpc是一套由谷歌Google公司开发并开源的RPC(远程过程调用)框架,特点是突破了语言限制,任何语言均可无障碍调用,提高了网络应用开发效率。
目前该框架的最新使用版本为 proto3 (protocol buffers)。
1. protobuf 安装
参考网站: gRPC - go
1.1 安装 protoc 编译器
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
1.2 获取grpc包
go get google.golang.org/grpc
若无 go mod
则会安装到 $GOPATH/src
下
2. 创建 XXX.proto 文件编译生成 go 代码
2.2 创建目录如下
2.2 创建 XXX.proto 文件
// /pb/hello_grpc.proto 事例
syntax = "proto3"; // 语法格式 proto3
package hello_grpc; // 包名
option go_package="./;hello_grpc"; // 指定 "包路径(从mod下开始写);别名"
// 请求包
message Req {
string message = 1;
}
// 响应包
message Res {
string message = 1;
}
// 服务函数
service HelloGRPC {
rpc SayHi(Req) returns (Res);
}
2.3 创建脚本编译 XXX.proto 文件生成 go 代码
protoc --go_out=[XXX.pb.go文件生成路径] --go_opt=paths=source_relative --go-grpc_out=[XXX_grpc.pb.go文件生成路径] --go-grpc_opt=paths=source_relative [XXX.proto文件所在路径]
Windows 系统可创建 .bat
脚本文件运行,Linux / Mac 系统可创建 .sh
脚本文件运行。
3. 创建服务端 Server 和客户端 Client 调用 gRPC
3.1 服务端 Server 代码
// server/main.go
package main
// 1. 创建server结构体 继承grpc的server (需要引入包)
type server struct {
hello_grpc.UnimplementedHelloGRPCServer
}
// 2. 重写 grpc 中定义的方法
func (s *server) SayHi(context context.Context, req *Req) (*Res, error) {
message := req.GetMessage()
fmt.Println(message)
return &hello_grpc.Res{Message: message + " 请求的响应"}, nil
}
// 3. 在main函数中注册服务
func main() {
// 3.1 获取监听器
lis, err := net.Listen("tcp", ":8888")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 3.2 新建一个grpc服务器
s := grpc.NewServer()
// 3.3 注册服务
hello_grpc.RegisterHelloGRPCServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
// 3.4 启动服务
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
官方 server
事例: 官方 server
启动 server
,等待客户端 client
的请求。
3.2 客户端 Client 代码
// client/main.go
package main
// 直接创建连接 调用grpc服务 (需要引包)
func main() {
// 1. 创建连接 conn (指定安全性)
conn, err := grpc.Dial("localhost:8888", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
// 2. 创建grpc客户端 用于调用服务
client := hello_grpc.NewHelloGRPCClient(conn)
// 3. 调用服务
res, err := client.SayHi(context.Background(), &hello_grpc.Req{Message: "我从客户端来"})
if err != nil {
log.Fatalf("error: %v", err)
return
}
fmt.Println(res.GetMessage())
}
官方 client
事例:官方 client
启动 client
,向 server
发起请求。