Go-gRPC-Example 项目教程
1. 项目的目录结构及介绍
go-grpc-example/
├── client/
│ ├── client.go
│ └── client_test.go
├── proto/
│ ├── hello.pb.go
│ ├── hello.proto
│ └── hello_grpc.pb.go
├── server/
│ ├── server.go
│ └── server_test.go
├── .gitignore
├── go.mod
├── go.sum
└── README.md
目录结构介绍
-
client/: 包含客户端代码和测试文件。
client.go
: 客户端主程序。client_test.go
: 客户端测试文件。
-
proto/: 包含协议缓冲区文件和生成的Go代码。
hello.pb.go
: 生成的协议缓冲区Go代码。hello.proto
: 协议缓冲区定义文件。hello_grpc.pb.go
: 生成的gRPC Go代码。
-
server/: 包含服务器代码和测试文件。
server.go
: 服务器主程序。server_test.go
: 服务器测试文件。
-
.gitignore: Git忽略文件配置。
-
go.mod: Go模块文件。
-
go.sum: Go模块校验文件。
-
README.md: 项目说明文档。
2. 项目的启动文件介绍
服务器启动文件
server/server.go
是服务器的主启动文件。以下是关键代码片段:
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "github.com/Bingjian-Zhu/go-grpc-example/proto"
)
type server struct {
pb.UnimplementedHelloServiceServer
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
log.Printf("Received: %v", in.GetName())
return &pb.HelloResponse{Message: "Hello " + in.GetName()}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterHelloServiceServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
客户端启动文件
client/client.go
是客户端的主启动文件。以下是关键代码片段:
package main
import (
"context"
"log"
"time"
"google.golang.org/grpc"
pb "github.com/Bingjian-Zhu/go-grpc-example/proto"
)
const (
address = "localhost:50051"
)
func main() {
conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewHelloServiceClient(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.GetMessage())
}
3. 项目的配置文件介绍
go.mod
go.mod
文件定义了Go模块的依赖关系。以下是示例内容:
module github.com/Bingjian-Zhu/go-grpc-example
go 1.16
require (