目录

1. gRPC协议介绍及构成

协议分层

协议关键字段

2. 示例:Greeter 服务

步骤1:定义 .proto 文件

步骤2:生成代码

3. Java代码示例

依赖配置(Maven pom.xml)

服务端实现

客户端实现

运行流程

关键机制

对比 REST API


官网:https://grpc.io/


1. gRPC协议介绍及构成

gRPC(Google Remote Procedure Call)是基于 HTTP/2Protocol Buffers 的高性能RPC框架,核心构成如下:

协议分层
  1. 传输层:基于 HTTP/2,支持多路复用、双向流、头部压缩。
  2. 数据编码层:使用 Protocol Buffers(二进制序列化协议),高效压缩数据。
  3. 接口定义层:通过 .proto 文件定义服务接口和消息结构。
  4. 通信模式
    • Unary RPC:单次请求-响应。
    • Server Streaming:服务端返回流式响应。
    • Client Streaming:客户端发送流式请求。
    • Bidirectional Streaming:双向流式通信。
协议关键字段
  • HTTP/2 请求头
    • :method:固定为 POST
    • :path:标识服务方法,格式为 /包名.服务名/方法名(如 /example.Greeter/SayHello)。
    • content-type:固定为 application/grpc+proto
  • Trailer 头:用于传递状态码(如 grpc-status)和错误信息。

2. 示例:Greeter 服务

步骤1:定义 .proto 文件
syntax = "proto3";
package example;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string reply = 1;
}
步骤2:生成代码

使用 protoc 生成Java代码(需安装 protocgrpc-java插件):

protoc --java_out=./src/main/java --grpc-java_out=./src/main/java greeter.proto

生成的文件包括:

  • HelloRequest.java / HelloResponse.java:消息类。
  • GreeterGrpc.java:包含服务端接口和客户端存根。

3. Java代码示例

依赖配置(Maven pom.xml
<dependencies>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty</artifactId>
        <version>1.50.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-protobuf</artifactId>
        <version>1.50.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-stub</artifactId>
        <version>1.50.0</version>
    </dependency>
</dependencies>
<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.7.0</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.6.1</version>
            <configuration>
                <protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.50.0:exe:${os.detected.classifier}</pluginArtifact>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
服务端实现
import io.grpc.Server;
import io.grpc.ServerBuilder;
import example.GreeterGrpc;
import example.HelloRequest;
import example.HelloResponse;

public class GreeterServer {
    public static void main(String[] args) throws Exception {
        // 创建服务端,监听端口 50051
        Server server = ServerBuilder.forPort(50051)
                .addService(new GreeterImpl())
                .build()
                .start();

        System.out.println("Server started on port 50051");
        server.awaitTermination();
    }

    // 实现服务接口
    static class GreeterImpl extends GreeterGrpc.GreeterImplBase {
        @Override
        public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
            // 处理请求并返回响应
            String reply = "Hello " + request.getName();
            HelloResponse response = HelloResponse.newBuilder().setReply(reply).build();
            responseObserver.onNext(response);
            responseObserver.onCompleted();
        }
    }
}
客户端实现
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import example.GreeterGrpc;
import example.HelloRequest;
import example.HelloResponse;

public class GreeterClient {
    public static void main(String[] args) {
        // 创建到服务端的通道
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
                .usePlaintext() // 简化示例,禁用TLS
                .build();

        // 创建客户端存根
        GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);

        // 发送请求并接收响应
        HelloRequest request = HelloRequest.newBuilder().setName("Alice").build();
        HelloResponse response = stub.sayHello(request);

        System.out.println("Server reply: " + response.getReply());

        // 关闭通道
        channel.shutdown();
    }
}

运行流程

  1. 启动服务端:运行 GreeterServer,监听端口 50051。
  2. 启动客户端:运行 GreeterClient,发送请求并打印结果。
  3. 输出结果
Server reply: Hello Alice

关键机制

  • HTTP/2 多路复用:多个请求共享一个TCP连接,降低延迟。
  • Protobuf 序列化:二进制格式,体积小、解析快。
  • 代码生成:根据 .proto 自动生成客户端和服务端代码,减少手写逻辑。

对比 REST API

场景

gRPC 方案

REST 方案

实时聊天

双向流式

轮询或 WebSocket

批量文件上传

客户端流式

分块上传

大规模微服务通信

高效二进制协议

JSON over HTTP/1.1

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐