gRPC 是由 Google 于 2015 年开源的远程过程调用(RPC)框架,基于 HTTP/2 协议和 Protocol Buffers 序列化协议。gRPC 提供 高性能、跨语言、双向流 的通信能力,是微服务通信的核心技术之一。
gRPC 的核心定位是 高性能的跨语言 RPC 框架。它提供了:
// hello.proto
syntax = "proto3";
// 定义服务
service Greeter {
// 简单 RPC
rpc SayHello (HelloRequest) returns (HelloReply) {}
// 服务端流
rpc ServerStreaming (HelloRequest) returns (stream HelloReply) {}
// 客户端流
rpc ClientStreaming (stream HelloRequest) returns (HelloReply) {}
// 双向流
rpc BidirectionalStream (stream HelloRequest) returns (stream HelloReply) {}
}
// 定义消息
message HelloRequest {
string name = 1;
int32 age = 2;
}
message HelloReply {
string message = 1;
}
# 安装 protoc 和 gRPC 插件
pip install grpcio-tools
# 生成 Python 代码
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto
# 生成 Go 代码
protoc --go_out=. --go-grpc_out=. hello.proto
# 生成 Java 代码
protoc --java_out=. --grpc-java_out=. hello.proto
# 生成 C# 代码
protoc --csharp_out=. --grpc_out=. hello.proto
// go server
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "path/to/hello" // 生成的 protobuf 代码
)
// 服务器结构
type server struct {
pb.UnimplementedGreeterServer
}
// 实现 SayHello 方法
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("收到请求: %s (age: %d)", req.Name, req.Age)
return &pb.HelloReply{
Message: "Hello, " + req.Name + "! 你 " + string(req.Age) + " 岁了",
}, nil
}
func main() {
// 监听端口
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("监听失败: %v", err)
}
// 创建 gRPC 服务器
s := grpc.NewServer()
// 注册服务
pb.RegisterGreeterServer(s, &server{})
log.Println("gRPC 服务器启动在 :50051")
if err := s.Serve(lis); err != nil {
log.Fatalf("启动失败: %v", err)
}
}
// go client
package main
import (
"context"
"log"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
pb "path/to/hello"
)
func main() {
// 建立连接
conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("连接失败: %v", err)
}
defer conn.Close()
// 创建客户端
client := pb.NewGreeterClient(conn)
// 发起请求
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
resp, err := client.SayHello(ctx, &pb.HelloRequest{
Name: "Alice",
Age: 30,
})
if err != nil {
log.Fatalf("请求失败: %v", err)
}
log.Printf("收到响应: %s", resp.Message)
}
# python server
import grpc
from concurrent import futures
import hello_pb2
import hello_pb2_grpc
class GreeterServicer(hello_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
print(f"收到请求: {request.name} (age: {request.age})")
return hello_pb2.HelloReply(
message=f"Hello, {request.name}! 你 {request.age} 岁了"
)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server)
server.add_insecure_port("[::]:50051")
server.start()
print("gRPC 服务器启动在 :50051")
server.wait_for_termination()
if __name__ == "__main__":
serve()
# python client
import grpc
import hello_pb2
import hello_pb2_grpc
def run():
with grpc.insecure_channel("localhost:50051") as channel:
stub = hello_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(
hello_pb2.HelloRequest(name="Alice", age=30)
)
print(f"收到响应: {response.message}")
if __name__ == "__main__":
run()
// proto 定义
service Greeter {
rpc ServerStreaming (HelloRequest) returns (stream HelloReply) {}
}
// Go 服务端实现
func (s *server) ServerStreaming(req *pb.HelloRequest, stream pb.Greeter_ServerStreamingServer) error {
for i := 0; i < 10; i++ {
if err := stream.Send(&pb.HelloReply{
Message: fmt.Sprintf("消息 %d: Hello, %s!", i, req.Name),
}); err != nil {
return err
}
time.Sleep(1 * time.Second)
}
return nil
}
// Go 客户端
func clientStream() {
stream, err := client.ServerStreaming(ctx, &pb.HelloRequest{Name: "Alice"})
if err != nil {
log.Fatal(err)
}
for {
resp, err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
log.Printf("收到: %s", resp.Message)
}
}
// Spring Boot gRPC 配置
@Configuration
public class GrpcConfig {
@Bean
public GrpcServerFactoryBean grpcServerFactoryBean() {
return new GrpcServerFactoryBean();
}
@Bean
public Server grpcServer(GrpcServerFactoryBean factory) {
return factory.createServer();
}
}
// gRPC 服务实现
@GrpcService
public class GreeterService extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver responseObserver) {
HelloReply reply = HelloReply.newBuilder()
.setMessage("Hello, " + request.getName() + "!")
.build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
| 对比项 | gRPC | REST | GraphQL |
|---|---|---|---|
| 协议 | HTTP/2 | HTTP/1.1 | HTTP/1.1 |
| 数据格式 | Protobuf(二进制) | JSON | JSON |
| 性能 | 极高 | 一般 | 一般 |
| 双向流 | ✅ 原生 | ❌ | ❌(需 WebSocket) |
| 类型安全 | ✅ 强类型 | ❌ | ✅ 强类型 |
| 浏览器支持 | 需 gRPC-Web | ✅ 原生 | ✅ 原生 |
| 学习曲线 | 中等 | 平缓 | 中等 |
| 适用场景 | 微服务内部 | 公开 API | 复杂查询 |
Protocol Buffers 语法、gRPC 核心概念、四种通信模式
服务端/客户端开发、流处理、错误处理、超时和重试
拦截器、负载均衡、服务发现、TLS/SSL、认证授权
微服务架构、gRPC Gateway、gRPC-Web、生产部署
gRPC 是微服务通信的"高速公路"。
它用 HTTP/2、Protobuf、双向流 提供了比 REST 快 3-10 倍的高性能通信。gRPC 是云原生微服务架构的核心通信协议。
"gRPC 让服务间通信快如闪电。" ⚡