Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java grpc调用


在 Java 中使用 gRPC 进行调用有几种不同的方式,我会为你介绍其中的两种主要方式:使用原生的 gRPC 库和使用 Spring Boot 集成的方式。这两种方式都需要你定义 gRPC 的服务和消息,并生成相应的客户端代码。接下来,我会为你详细介绍这两种方式的步骤流程,以及每种方式所需的依赖坐标和示例代码。

方式 1:使用原生 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>

方式 2:使用 Spring Boot 集成

步骤流程:

创建 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 调用方式。你可以根据项目需求选择其中一种方式。记得根据示例代码中的包名和类名进行适当的调整,以匹配你的项目结构。

在Java中使用gRPC连接池的目的是为了提高性能和资源利用率,特别是在频繁的RPC调用场景下。示例代码:在Maven中添加依赖:在Grad ...
在Java中使用gRPC进行文件上传通常需要以下步骤:定义gRPC服务和消息:首先,您需要在.以下是一个示例实现:启动gRPC服务器:在主类 ...
在Java中进行异步调用有多种方式,我将为您介绍几种常见的实现方式,包括使用Java原生的方式以及一些常用的第三方库。示例代码:Maven依 ...
在Java中进行异步调用方法有多种方式,我将为您介绍几种常见的实现方式,包括使用原生Java、Java线程池、CompletableFutu ...
在Java中,JNI(JavaNativeInterface)用于在Java代码中调用本地(Native)代码,通常是C或C++代码。jav ...