gRPC详解

一句话理解

gRPC 是一种高性能、跨语言的远程过程调用(RPC)框架,基于 HTTP/2 和 Protocol Buffers 开发,支持流式通信和双向通信,适合现代微服务架构。


一、gRPC 的基本原理

gRPC = Protocol Buffers(数据序列化) + HTTP/2(高效传输) + RPC(远程调用)

  • 客户端 调用本地生成的代理方法(Stub)
  • 由 gRPC 框架将调用转为网络请求(HTTP/2 + protobuf)
  • 服务端 接收请求、反序列化、执行对应方法、返回结果

二、gRPC 架构图

[Client App]
     │
 [Client Stub]
     │
[HTTP/2 + Protobuf]
     │
 [Server Stub]
     │
[Service Implementation]

三、gRPC 的核心特性

特性描述
高性能基于 HTTP/2 + Protobuf,效率远高于 JSON/REST
多语言支持Java, Go, Python, C++, Node.js 等十几种语言
HTTP/2 支持多路复用、流控、头部压缩
流式通信支持 单向流、双向流,适合实时系统
双向通信客户端和服务端可以同时发送消息
代码自动生成通过 .proto 文件生成客户端和服务端代码
TLS 加密支持安全通信内置

四、gRPC 通信模式(4种)

模式描述
1️⃣ Unary(普通 RPC)一请求 → 一响应(类似 HTTP 请求)
2️⃣ Server Streaming一请求 → 多响应(服务端不断推送)
3️⃣ Client Streaming多请求 → 一响应(客户端连续发送)
4️⃣ Bidirectional Stream多请求 ↔ 多响应(双向实时通信)

五、示例:gRPC 使用流程(Java)

1. 编写 Proto 文件(hello.proto

syntax = "proto3";

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

2. 使用 protoc 编译生成代码

protoc --java_out=. --grpc-java_out=. hello.proto

3. 实现服务端逻辑

public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase {
    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
        HelloResponse resp = HelloResponse.newBuilder()
            .setMessage("Hello " + req.getName())
            .build();
        responseObserver.onNext(resp);
        responseObserver.onCompleted();
    }
}

4. 启动服务端

Server server = ServerBuilder.forPort(50051)
    .addService(new HelloServiceImpl())
    .build()
    .start();

5. 客户端调用

ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
    .usePlaintext()
    .build();

HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(channel);
HelloResponse response = stub.sayHello(HelloRequest.newBuilder().setName("Alice").build());
System.out.println(response.getMessage());

六、gRPC 与 RESTful 对比

对比点gRPCRESTful(传统 HTTP API)
协议HTTP/2HTTP/1.1
数据格式Protobuf(二进制)JSON(文本)
性能一般
开发效率自动生成客户端/服务端代码手写 HTTP 请求解析
浏览器支持❌(需要 gRPC-Web 适配)✅ 原生支持
流式传输✅(Server/Client/Bidi)❌ 仅支持一次请求响应
可读性差(Protobuf不可读)好(JSON 可读)

七、gRPC 常见使用场景

场景是否适合
微服务之间高性能通信✅ 非常适合
实时推送、流式传输(如聊天)✅ 极其适合
跨语言服务调用✅ 完美支持
Web 浏览器直接调用服务❌(需要 grpc-web 代理)
公共 RESTful API 接口❌(gRPC 不够通用)

八、安全与扩展

  • 支持 TLS 双向认证
  • 支持拦截器、认证授权、压缩等机制
  • 配合 gRPC Gateway 可转换为 REST API
  • Envoy、Istio、Kubernetes 集成良好(Service Mesh)

九、常用工具和生态

工具用途
protoc编译 proto 文件
grpc-javaJava 实现 gRPC 框架
grpc-gateway把 gRPC 映射成 RESTful API
grpc-web让浏览器可以使用 gRPC
Envoy支持 gRPC 的 API 网关和反向代理

总结一句话

gRPC 是 Google 推出的高性能、跨平台、支持流式通信的现代 RPC 框架,非常适合微服务间调用、实时推送、IoT 等场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值