gRPC(Google Remote Procedure Call)是一个由Google开发的开源高性能远程过程调用框架,它基于HTTP/2协议和Protocol Buffers(Protobuf)序列化格式。gRPC允许客户端直接调用不同机器上的服务方法,就像调用本地对象一样简单。
首先,在pom.xml
文件中添加gRPC相关的依赖项:
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</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>
创建一个.proto
文件来定义服务接口和消息类型。例如:
syntax = "proto3";
option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
使用protoc
编译器生成Java代码:
protoc --java_out=./src/main/java ./src/main/proto/helloworld.proto
编写服务端逻辑,继承生成的抽象类并实现具体方法:
import io.grpc.Server;
import io.grpc.ServerBuilder;
public class HelloWorldServer {
public static void main(String[] args) throws Exception {
Server server = ServerBuilder.forPort(8080)
.addService(new GreeterImpl())
.build()
.start();
System.out.println("Server started, listening on " + 8080);
server.awaitTermination();
}
static class GreeterImpl extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest req, io.grpc.stub.StreamObserver<HelloReply> responseObserver) {
String message = "Hello, " + req.getName();
HelloReply reply = HelloReply.newBuilder().setMessage(message).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
}
编写客户端代码以调用服务端方法:
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
public class HelloWorldClient {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
.usePlaintext()
.build();
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
HelloRequest request = HelloRequest.newBuilder().setName("World").build();
HelloReply response = stub.sayHello(request);
System.out.println("Response: " + response.getMessage());
channel.shutdown();
}
}