grpc服务端proto文件生成java文件,并利用maven打成可依赖jar包(linux环境),供grpc客户端直接依赖jar包使用

介绍

我们使用grpc框架进行开发时,一般是共同维护一份proto文件,客户端服务端都使用此文件生成对应的代码,然后调用相关方法类使用。
本文提供另一种思路,服务端使用proto生成相关java代码,我们把这些代码发成可依赖jar包,客户端直接引入此依赖使用。

1.前提

1-1.已有编写好的proto文件

本文示例proto文件内容如下

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.demo.helloworld";
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;
}

1-2.环境依赖已满足(maven;JDK1.8)

2.生成java文件

2-1.下载ptotoc linux依赖

wget https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.19.4/protoc-3.19.4-linux-x86_64.exe
wget https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/1.44.0/protoc-gen-grpc-java-1.44.0-linux-x86_64.exe

下载好后我们统一调整项目及文件目录结构调整后如下
在这里插入图片描述
java目录下存放后面生成的java文件
proto目录下面存放proto文件(例:helloworld.proto)
protoc-plugins目录下存放下载好的两个文件

2-2.生成java文件

cd grpc-java/src/main/protoc-plugins/
chmod +x protoc-3.19.4-linux-x86_64.exe
chmod +x protoc-gen-grpc-java-1.44.0-linux-x86_64.exe
cd grpc-java/src/main/
protoc-plugins/protoc-3.19.4-linux-x86_64.exe --java_out=java --proto_path=proto proto/helloworld.proto
protoc-plugins/protoc-3.19.4-linux-x86_64.exe --plugin=protoc-gen-grpc-java=protoc-plugins/protoc-gen-grpc-java-1.44.0-linux-x86_64.exe  --grpc-java_out=java --proto_path=proto proto/helloworld.proto

执行上面步骤后即在 grpc-java/src/main/java 下生成proto对用的java文件
在这里插入图片描述

3.编写pom.xml,引入依赖

上面生成的java文件需要用的proto-java,proto-api等依赖,需要用maven引入依赖,可在idea中按照当前目录结构创建maven项目,导入生成的java文件后,按照报错导入需要的依赖,示例pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>demo-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>grpc-java</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>grpc-java</name>
    <description>grpc-java</description>
    <properties>
        <grpc-java.version>1.44.0</grpc-java.version>
        <protoc.version>3.19.4</protoc.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- grpc -->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>${grpc-java.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>grpc-api</artifactId>
                    <groupId>io.grpc</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>error_prone_annotations</artifactId>
                    <groupId>com.google.errorprone</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>${grpc-java.version}</version>
        </dependency>
        <dependency>
            <!-- Java 9+ compatibility - Do NOT update to 2.0.0 -->
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>1.3.5</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.19.4</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <distributionManagement>
       <!-- 此处填写打好的依赖jar包上传的仓库地址 -->
    </distributionManagement>

</project>

将写好的pom.xml放到grpc-java目录下

4.mvn打包并上传

cd grpc-java/
mvn package
mvn deploy

生成的jar包在 /grpc-java/target/下
我们的grpc客户端项目可以直接引入此jar包依赖编写项目,从而不用没次引入proto文件生成java文件再使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 gRPC Java 入门示例,包含了 Maven 引入插件和依赖的详细信息: 1. 首先,您需要创建一个 Maven 项目并在 pom.xml 文件中添加以下依赖: ```xml <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.29.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.29.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.29.0</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.12.2</version> </dependency> </dependencies> ``` 2. 接下来,您需要添加以下插件配置: ```xml <build> <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.12.2:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.29.0:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 3. 现在,您可以编写您的 gRPC 服务定义文件并将其保存为 .proto 文件。例如,以下是一个简单的示例: ```protobuf syntax = "proto3"; option java_multiple_files = true; option java_package = "com.example.grpc"; option java_outer_classname = "HelloWorldProto"; service HelloWorld { rpc sayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 4. 接下来,您可以使用以下命令来生成 Java 代码: ```sh mvn protobuf:compile ``` 5. 最后,您可以编写您的 gRPC 服务器代码和客户端代码并运行它们。例如,以下是一个简单的示例: ```java public class HelloWorldServer { public static void main(String[] args) throws IOException, InterruptedException { Server server = ServerBuilder.forPort(50051) .addService(new HelloWorldImpl()) .build() .start(); System.out.println("Server started"); server.awaitTermination(); } static class HelloWorldImpl extends HelloWorldGrpc.HelloWorldImplBase { @Override public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) { String message = "Hello " + request.getName() + "!"; HelloResponse response = HelloResponse.newBuilder().setMessage(message).build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } } public class HelloWorldClient { public static void main(String[] args) { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051) .usePlaintext() .build(); HelloWorldGrpc.HelloWorldBlockingStub stub = HelloWorldGrpc.newBlockingStub(channel); String name = "World"; HelloRequest request = HelloRequest.newBuilder().setName(name).build(); HelloResponse response = stub.sayHello(request); System.out.println(response.getMessage()); channel.shutdown(); } } ``` 这就是一个简单的 gRPC Java 入门示例。希望对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值