返回主页 学习路径
gRPC
高性能 · 跨语言 · 双向流
gRPC 是由 Google 于 2015 年开源的远程过程调用(RPC)框架,基于 HTTP/2 协议和 Protocol Buffers 序列化协议。gRPC 提供高性能、跨语言、双向流的通信能力,是微服务通信、云原生架构的核心技术之一。gRPC 支持 10+ 种编程语言,被 Netflix、Uber、Square、阿里巴巴等众多公司采用,是 RESTful API 的有力竞争者。
高性能 RPC 框架 · Google 出品
📅 诞生时间2015年 · Google
🧩 类型RPC 框架 · 远程调用
📊 数据格式Protocol Buffers
⚡性能
9/10
📦生态
8/10
🧠易用
6/10
🚀扩展性
8/10

📑 本文目录

📌 第一部分:gRPC 概览与定位

1.1 定义与全称

gRPC 是由 Google 于 2015 年开源的远程过程调用(RPC)框架,基于 HTTP/2 协议和 Protocol Buffers 序列化协议。gRPC 提供 高性能、跨语言、双向流 的通信能力,是微服务通信的核心技术之一。

1.2 核心定位

gRPC 的核心定位是 高性能的跨语言 RPC 框架。它提供了:

1.3 主要应用领域

1.4 知名案例


⚙️ 第二部分:核心概念

2.1 Protocol Buffers(Protobuf)

// 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;
}

2.2 gRPC 四种通信模式


⚙️ 第三部分:代码实现

3.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

3.2 Go 服务端实现

// 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)
    }
}

3.3 Go 客户端实现

// 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)
}

3.4 Python 服务端实现

# 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()

3.5 Python 客户端实现

# 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()

3.6 服务端流示例

// 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)
    }
}

3.7 Java Spring Boot 集成

// 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 vs REST vs GraphQL

对比项 gRPC REST GraphQL
协议HTTP/2HTTP/1.1HTTP/1.1
数据格式Protobuf(二进制)JSONJSON
性能极高一般一般
双向流✅ 原生❌(需 WebSocket)
类型安全✅ 强类型✅ 强类型
浏览器支持需 gRPC-Web✅ 原生✅ 原生
学习曲线中等平缓中等
适用场景微服务内部公开 API复杂查询

🧠 第五部分:学习建议

1
基础入门

Protocol Buffers 语法、gRPC 核心概念、四种通信模式

2
核心进阶

服务端/客户端开发、流处理、错误处理、超时和重试

3
高级特性

拦截器、负载均衡、服务发现、TLS/SSL、认证授权

4
实战应用

微服务架构、gRPC Gateway、gRPC-Web、生产部署

推荐学习资源


🎯 总结升华

gRPC 是微服务通信的"高速公路"。

它用 HTTP/2、Protobuf、双向流 提供了比 REST 快 3-10 倍的高性能通信。gRPC 是云原生微服务架构的核心通信协议。

"gRPC 让服务间通信快如闪电。" ⚡

🔖 相关标签
#RPC #微服务 #HTTP/2 #Protobuf #双向流 #高性能 #云原生
📄 本文档为 gRPC 完整白皮书 · 最后更新于 2026年06月28日