使用 gRPC 和 Protocol Buffers 的 Go 示例:
1. 定义 .proto 文件
首先定义一个简单的 Greeter 服务,提供一个 SayHello 方法,接收 HelloRequest 和返回 HelloResponse:
go
syntax = "proto3";
package greeting;
// 定义请求消息类型
message HelloRequest {
string name = 1;
}
// 定义响应消息类型
message HelloResponse {
string message = 1;
}
// 定义服务
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
2. 生成 Go 代码
.proto 文件保存为 greeting.proto,使用 protoc 命令生成 Go 代码:
bash
protoc --go_out=. --go-grpc_out=. greeting.proto
这将生成两个文件:
greeting.pb.go:包含消息类型。
greeting_grpc.pb.go:包含服务定义和客户端、服务器代码。
3. 实现 gRPC 服务器
使用生成的 Go 代码实现 gRPC 服务器端,处理请求。
go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"log"
"net"
"path/greeting" // 导入生成的 Go 包
)
type server struct {
greeting.UnimplementedGreeterServer
}
// 实现 SayHello 方法
func (s *server) SayHello(ctx context.Context, req *greeting.HelloRequest) (*greeting.HelloResponse, error) {
return &greeting.HelloResponse{
Message: "Hello, " + req.Name + "!",
}, nil
}
func main() {
// 创建 gRPC 服务器
grpcServer := grpc.NewServer()
// 注册 Greeter 服务
greeting.RegisterGreeterServer(grpcServer, &server{})
// 启动监听
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 启动服务器
fmt.Println("Server listening on port 50051...")
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
4. 实现 gRPC 客户端
客户端使用 gRPC 向服务器发起请求。
go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"log"
"path/greeting" // 导入生成的 Go 包
)
func main() {
// 创建 gRPC 客户端连接
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
// 创建 Greeter 客户端存根
client := greeting.NewGreeterClient(conn)
// 发送请求
req := &greeting.HelloRequest{Name: "Alice"}
res, err := client.SayHello(context.Background(), req)
if err != nil {
log.Fatalf("could not greet: %v", err)
}
// 输出响应
fmt.Println("Greeter response:", res.GetMessage())
}
5. 运行示例
启动服务器:
bash
go run server.go
服务器将监听 50051 端口。
启动客户端:
bash
go run client.go
客户端向服务器发送请求,服务器返回问候信息。
输出示例:
bash
Server listening on port 50051...
Greeter response: Hello, Alice!
总结
使用 Protocol Buffers 定义消息类型和服务接口。
通过 protoc 编译器生成 Go 代码。
通过 gRPC 框架实现服务器和客户端,并进行通信。
这样,Go 的 gRPC 服务就可以通过 Protocol Buffers 实现高效的远程过程调用。