介绍
我们使用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文件再使用