目录
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/2 和 Protocol Buffers 的高性能RPC框架,核心构成如下:
协议分层
- 传输层:基于 HTTP/2,支持多路复用、双向流、头部压缩。
- 数据编码层:使用 Protocol Buffers(二进制序列化协议),高效压缩数据。
- 接口定义层:通过
.proto
文件定义服务接口和消息结构。 - 通信模式:
-
- 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代码(需安装 protoc
和 grpc-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 {// 创建服务端,监听端口 50051Server 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 {@Overridepublic 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();}
}
运行流程
- 启动服务端:运行
GreeterServer
,监听端口 50051。 - 启动客户端:运行
GreeterClient
,发送请求并打印结果。 - 输出结果:
Server reply: Hello Alice
关键机制
- HTTP/2 多路复用:多个请求共享一个TCP连接,降低延迟。
- Protobuf 序列化:二进制格式,体积小、解析快。
- 代码生成:根据
.proto
自动生成客户端和服务端代码,减少手写逻辑。
对比 REST API
场景 | gRPC 方案 | REST 方案 |
实时聊天 | 双向流式 | 轮询或 WebSocket |
批量文件上传 | 客户端流式 | 分块上传 |
大规模微服务通信 | 高效二进制协议 | JSON over HTTP/1.1 |