gRPC 入门
微服务间通信,gRPC 是 Go 生态的主流选择:基于 HTTP/2、Protobuf,强类型、高性能。
1. 核心概念
- Protocol Buffers:接口契约与序列化格式
- .proto 文件:定义 service 与 message
- 代码生成:
protoc生成 Go 的客户端或服务端桩代码 - 四种调用方式:一元、服务端流、客户端流、双向流
2. 定义契约
syntax = "proto3";
package api;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 2; }ℹ️为什么用 gRPC 而非 REST
Protobuf 二进制比 JSON 小、快;强类型契约让改接口有编译期保障;天然支持流式。
3. 实现服务端
type server struct{ pb.UnimplementedGreeterServer }
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "你好, " + req.Name}, nil
}
func main() {
lis, _ := net.Listen("tcp", ":50051")
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
s.Serve(lis)
}4. 调用客户端
conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())
defer conn.Close()
c := pb.NewGreeterClient(conn)
r, _ := c.SayHello(context.Background(), &pb.HelloRequest{Name: "Alice"})
fmt.Println(r.Message)💡别忘了 Context
gRPC 调用第一个参数就是 ctx,用它做超时与取消:grpc.Dial 后配合 context.WithTimeout 避免永久阻塞。
5. 流式调用
rpc Chat(stream Msg) returns (stream Msg) 可双向收发,适合聊天、日志推送等场景。
小结
- gRPC 等于 HTTP/2 加 Protobuf,强类型、高性能
.proto定义 service 与 message,protoc生成桩代码- 四种模式:一元、服务端流、客户端流、双向流
- 服务端实现接口并
Register,客户端Dial后调用 - 调用务必传
ctx控制超时与取消