使用 golang 实现 gRPC 服务非常简单,只需要遵循以下步骤:
- 定义 proto 文件
首先,定义一个 .proto
文件,描述 gRPC API。这个文件可以包含多个服务和方法,类似于 HTTP 的路由和 API。
例如,下面是一个简单的示例:
syntax = "proto3";
package greeting;
service GreetingService {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
- 生成 gRPC 代码
使用 protoc
工具将定义的.proto
文件编译成 Go 代码:
$ protoc --go_out=plugins=grpc:. *.proto
生成的 Go 代码将包含 gRPC 服务和客户端的接口。在本示例中,生成的代码将包含 GreetingService
服务接口和 SayHello
方法。
- 实现 gRPC 服务端
在 Go 中实现 gRPC 服务端非常简单。我们只需要实现生成的接口中定义的方法即可。
type server struct {
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: fmt.Sprintf("Hello, %s!", req.Name)}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreetingServiceServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
在这个示例中,我们实现了 SayHello
方法,并将其注册到 gRPC 服务上。
- 实现 gRPC 客户端
实现 gRPC 客户端也非常简单。我们只需要创建一个连接并使用生成的接口来调用服务方法即可。
func main() {
conn, err := grpc.Dial(":50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreetingServiceClient(conn)
resp, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "World"})
if err != nil {
log.Fatalf("error: %v", err)
}
log.Printf("response: %s", resp.Message)
}
在本示例中,我们创建了一个连接并使用 GreetingServiceClient
接口中的 SayHello
方法来调用服务。