在 Java 中使用 gRPC 进行调用有几种不同的方式,我会为你介绍其中的两种主要方式:使用原生的 gRPC 库和使用 Spring Boot 集成的方式。这两种方式都需要你定义 gRPC 的服务和消息,并生成相应的客户端代码。接下来,我会为你详细介绍这两种方式的步骤流程,以及每种方式所需的依赖坐标和示例代码。
步骤流程:
定义 gRPC 服务和消息: 首先,你需要创建一个 .proto
文件来定义你的服务和消息。这个文件描述了服务的方法和消息的结构。
syntax = "proto3";
package com.example.grpc;
service MyService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string greeting = 1;
}
生成代码: 使用 Protocol Buffers 的编译器 protoc
来生成 Java 代码。
protoc --java_out=./src/main/java ./path/to/your/proto/file.proto
实现服务逻辑: 在服务端实现定义的 gRPC 服务。
public class MyServiceImplementation extends MyServiceGrpc.MyServiceImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
String name = request.getName();
String greeting = "Hello, " + name;
HelloResponse response = HelloResponse.newBuilder().setGreeting(greeting).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
创建 gRPC 服务器: 创建一个 gRPC 服务器并将你的服务实现添加到其中。
public class GrpcServer {
public static void main(String[] args) throws IOException, InterruptedException {
int port = 50051;
Server server = ServerBuilder.forPort(port)
.addService(new MyServiceImplementation())
.build();
server.start();
server.awaitTermination();
}
}
创建 gRPC 客户端: 使用生成的客户端代码调用 gRPC 服务。
public class GrpcClient {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
MyServiceBlockingStub blockingStub = MyServiceGrpc.newBlockingStub(channel);
HelloRequest request = HelloRequest.newBuilder().setName("Alice").build();
HelloResponse response = blockingStub.sayHello(request);
System.out.println("Response: " + response.getGreeting());
channel.shutdown();
}
}
Maven 依赖坐标:
在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>1.40.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.17.3</version>
</dependency>
步骤流程:
创建 Spring Boot 项目: 使用 Spring Initializr 创建一个新的 Spring Boot 项目,并添加 gRPC Spring Boot Starter 作为依赖。
定义 gRPC 服务和消息: 同样,你需要在项目中定义 .proto
文件来描述服务和消息。
syntax = "proto3";
package com.example.grpc;
service MyService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string greeting = 1;
}
生成代码: gRPC Spring Boot Starter 会自动帮你生成代码,你不需要手动执行 protoc
。
实现服务逻辑: 创建一个 Spring Bean 来实现你的 gRPC 服务。
@GrpcService
public class MyGrpcService extends MyServiceGrpc.MyServiceImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
String name = request.getName();
String greeting = "Hello, " + name;
HelloResponse response = HelloResponse.newBuilder().setGreeting(greeting).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
创建 gRPC 客户端: 在需要调用 gRPC 服务的地方注入 MyServiceGrpc.MyServiceBlockingStub
并进行调用。
@Service
public class GrpcClientService {
@GrpcClient("my-grpc-server")
private MyServiceGrpc.MyServiceBlockingStub blockingStub;
public String sendMessage(String name) {
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloResponse response = blockingStub.sayHello(request);
return response.getGreeting();
}
}
Maven 依赖坐标:
在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.12.0.RELEASE</version>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>2.12.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.17.3</version>
</dependency>
这里提供了两种主要的 gRPC 调用方式。你可以根据项目需求选择其中一种方式。记得根据示例代码中的包名和类名进行适当的调整,以匹配你的项目结构。