使用maven创建一个Java grpc Demo

本文介绍在Windows 10环境下,使用IDEA、Maven创建一个Java gRPC示例的过程,包括在pom文件中添加依赖、编写proto文件、编译proto文件以及客户端和服务端代码实现。此外,还涉及protobuf与JSON互转,解决proto文件依赖问题,以及处理含有bytes类型数据的json转换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用maven创建一个Java grpc Demo

环境:win10 1903 + idea2019.1 + jdk1.8
综述:

  • 使用maven创建grpc demo
  • protobuf 和 json 互转
  • json中bytes数据的使用

在pom文件中添加依赖

在idea中新建一个空的maven项目,然后在pom文件中添加grpc相关依赖项,然后idea会弹窗提示依赖包导入方式,选自动导入

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
    <!-- 添加grpc相关依赖包 -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-protobuf</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-stub</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-all</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

<!-- proto自动生成java文件所需的编译插件 -->
<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.4.1.Final</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.5.0</version>
            <configuration>
                <protocArtifact>com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}</protocArtifact>
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier}</pluginArtifact>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

编写proto文件

这个demo使用两个proto文件:service_api.proto和service.proto,service_api.proto里定义两个message,rpc服务定义在service.proto中,两个文件的内容分别如下:
service_api.proto

//指定proto3格式
syntax = "proto3";

//一些生成代码的设置
option java_multiple_files = false;//以非外部类模式生成
option java_package = "com.service.test";//所在包名
//option java_outer_classname = "Grpc";//最外层类名称

package com.service.test;

message UnaryRequest{
    string serviceName = 1;
    string methodName = 2;
    bytes data = 3;
    string request_id = 4;//参数默认都为可选,如果没有赋值,那么接口中不会出现该参数,不会默认为null之类的
}
message UnaryResponse{
    string serviceName = 1;
    string methodName = 2;
    bytes data = 3;
    string request_id = 4;
}

service.proto

//指定proto3格式
syntax = "proto3";

//一些生成代码的设置
option java_multiple_files = false;//以非外部类模式生成
option java_package = "com.service.test";//所在包名
//option jav
### Java gRPC 实现示例 以下是基于提供的引用以及 gRPC 官方文档的知识,展示如何通过 Java 编写一个简单的 gRPC 示例。 #### 1. 创建项目并引入依赖 首先,在项目的 `pom.xml` 文件中添加必要的 Maven 依赖项来支持 gRPC Protocol Buffers (protobuf)[^4]: ```xml <dependencies> <!-- gRPC dependency --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.50.0</version> </dependency> <!-- Protobuf compiler plugin --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.21.7</version> </dependency> <!-- gRPC protobuf generator --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.50.0</version> </dependency> <!-- gRPC stubs for client and server --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.50.0</version> </dependency> </dependencies> ``` #### 2. 定义 `.proto` 文件 `.proto` 文件用于描述服务接口服务消息结构。下面是一个简单的例子[^3]: ```proto syntax = "proto3"; option java_package = "com.example.grpc"; option java_outer_classname = "HelloWorldProto"; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; } ``` 保存此文件为 `helloworld.proto` 并将其放置在 `src/main/proto` 目录下。 #### 3. 使用 protoc 工具生成 Java 类 运行以下命令以生成客户端服务器端所需的 Java 类: ```bash protoc --java_out=./generated_src helloworld.proto ``` 这将在指定目录中生成对应的 Java 文件。 #### 4. 实现 Server 端逻辑 编写一个简单的 gRPC 服务端程序如下所示: ```java import io.grpc.Server; import io.grpc.ServerBuilder; public class HelloWorldServer { private int port = 50051; private Server server; public void start() throws IOException, InterruptedException { server = ServerBuilder.forPort(port) .addService(new GreeterImpl()) .build() .start(); System.out.println("Server started on port " + port); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { stop(); } catch (InterruptedException e) { e.printStackTrace(System.err); } })); server.awaitTermination(); } public void stop() throws InterruptedException { if (server != null && !server.isShutdown()) { server.shutdownNow().awaitTermination(30, TimeUnit.SECONDS); } } static class GreeterImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) { String replyMessage = "Hello " + req.getName(); HelloReply reply = HelloReply.newBuilder().setMessage(replyMessage).build(); responseObserver.onNext(reply); responseObserver.onCompleted(); } } public static void main(String[] args) throws IOException, InterruptedException { new HelloWorldServer().start(); } } ``` #### 5. 实现 Client 端调用 接着构建一个基本的 gRPC 客户端去连接到上述的服务端实例: ```java import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; public class HelloWorldClient { private final ManagedChannel channel; private final GreeterGrpc.GreeterBlockingStub blockingStub; public HelloWorldClient(String host, int port) { this.channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() .build(); this.blockingStub = GreeterGrpc.newBlockingStub(channel); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } public void greet(String name) { HelloRequest request = HelloRequest.newBuilder().setName(name).build(); HelloReply response = blockingStub.sayHello(request); System.out.println(response.getMessage()); } public static void main(String[] args) throws InterruptedException { HelloWorldClient client = new HelloWorldClient("localhost", 50051); try { client.greet("Alice"); } finally { client.shutdown(); } } } ``` 以上代码展示了完整的 gRPC 流程设置过程,包括定义协议缓冲区文件、编译它们成 Java 源码以及开发相应的服务端与客户端应用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值