gRPC协议
gRPC(Google Remote Procedure Call)是基于。生成Java代码(需安装。轮询或 WebSocket。
·
目录
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 {
// 创建服务端,监听端口 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();
}
}
运行流程
- 启动服务端:运行
GreeterServer,监听端口 50051。 - 启动客户端:运行
GreeterClient,发送请求并打印结果。 - 输出结果:
Server reply: Hello Alice
关键机制
- HTTP/2 多路复用:多个请求共享一个TCP连接,降低延迟。
- Protobuf 序列化:二进制格式,体积小、解析快。
- 代码生成:根据
.proto自动生成客户端和服务端代码,减少手写逻辑。
对比 REST API
|
场景 |
gRPC 方案 |
REST 方案 |
|
实时聊天 |
双向流式 |
轮询或 WebSocket |
|
批量文件上传 |
客户端流式 |
分块上传 |
|
大规模微服务通信 |
高效二进制协议 |
JSON over HTTP/1.1 |
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)