grpc-Tutorial.md
gRPC 教程
本教程针对希望学习如何使用 gRPC 构建和部署高效、可扩展的微服务的开发者。通过阅读本教程,了解 gRPC 的基本概念、如何在 Go 语言中实现 gRPC 服务,以及如何进行客户端和服务器之间的通信。寻找一个高性能、跨语言、开放源代码的远程过程调用 (RPC) 框架,gRPC 是一个理想的选择。
教程概览
在本教程中,学习如何:
- 设计和定义 gRPC 服务
- 在 Go 语言中实现 gRPC 服务器和客户端
- 使用 Protocol Buffers 进行数据序列化
在开始之前
确保安装了以下必备软件和工具:
- Go 语言环境(至少 Go 1.15)
- Protocol Buffers 编译器 (
protoc
) - gRPC Go 语言库
以下知识或经验:
- 基本的 Go 语言编程知识
- 对 RPC 和客户端-服务器架构有基本的了解
第一部分:定义和实现 gRPC 服务 {id=”grpc_1”}
学习如何定义 gRPC 服务和在 Go 中实现这些服务。
定义服务和消息格式。在
service.proto
文件中编写以下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19syntax = "proto3";
package tutorial;
// 定义 Greeter 服务
service Greeter {
// 发送问候
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// HelloRequest 消息定义
message HelloRequest {
string name = 1;
}
// HelloReply 消息定义
message HelloReply {
string message = 1;
}使用 Protocol Buffers 编译器生成 Go 代码。在终端执行:
1
protoc --go_out=. --go-grpc_out=. service.proto
实现 gRPC 服务器。创建
server.go
并添加以下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "path/to/your/service"
)
type server struct {
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
第二部分:创建 gRPC 客户端
学习如何创建 gRPC 客户端来调用服务器。
创建
client.go
并添加以下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28package main
import (
"context"
"log"
"time"
"google.golang.org/grpc"
pb "path/to/your/service"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
name := "world"
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}运行服务器和客户端,验证通信是否成功。
所学到的内容 {id=”what-learned”}
通过完成这个教程,已经成功地定义了一个简单的 gRPC 服务,实现了服务端和客户端,并在本地进行了测试。还学习了如何使用 Protocol Buffers 来定义数据格式和服务接口。
grpc-Tutorial.md
https://abrance.github.io/2024/09/04/project/sr/golang技术分享/grpc-Tutorial/