gRPC动手实践

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lyjshen/article/details/52238234

创建Maven项目

使用IDEA作为gRPC的开发IDE,新建一个空的maven工程(不从archetype原型生成)。

创建完成之后,修改pom.xml,向其中添加gRPC-java的依赖和protoc插件项:

grpc-mvn

gRPC-java的依赖:

    <dependencies>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>${grpc-version}</version>
        </dependency>
    </dependencies>

protocol buffers编译插件项:

    <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>
                    <!--
                      The version of protoc must match protobuf-java. If you don't depend on
                      protobuf-java directly, you will be transitively depending on the
                      protobuf-java version that grpc depends on.
                    -->
                    <protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

注意,这里我用的我自己编译生成,然后安装到本地Maven库中的grpc-all的jar包

因此,我这里写的是 1.1.0-SNAPSHOT

grpcversion

大家如果不想自己编译的话,可以使用目前Maven官方仓库中最新的版本:1.0.0。
第二点,注意这里的版本:

grpc protoc version

上边绿色字体的注释中规定,我们的protoc的版本要和protobuf-java jar包的版本一致。也就是说我们这里如果写了3.0.0(第一个红框内,注:我这里给出的例子使用的是3.0.0,而官方给出的是3.0.0-beta-3),那么下边这个地方也要是3.0.0:

grpc-java version

这些都准备完成之后,我们可以在Maven本地仓库中看到,它会自动下载平台相关的相应版的protoc的exe程序,这里是3.0.0正式版的:

protoc windows

配置文件中给出的

${os.detected.classifier}

在我的机器上被解析为 windows-x86_64 了,这些都是上边的那个扩展插件的作用:

os-maven-plugin

编写服务.proto文件

接下来,需要添加.proto文件。

打开Project Structure—》Modules,先在src/main目录下新建一个文件夹proto,用来存放我们马上将要创建的proto文件。

proto folder

然后新建一个名叫hello.proto文件,按照官方教程中的样子,编写一个自定义的grpc服务。

hell proto

编译.proto文件

编译.proto文件的工作由protoc的Maven插件编译来完成,它会调用指定路径下protoc.exe解析.proto,并生成我们编写客户端和服务端代码基础。

由于protoc可执行程序是平台相关的,因此这里给出两种配置方式:
1. 使用protobuf-maven-plugin自己指定的protc可执行程序。这种方式,什么都不用配置,只需要把plugin加进我们的pom.xml中就行了,插件会自己下载需要的可执行程序,在maven的本地仓库中,我们可以找到:

这里写图片描述

以及

plugin exe maven

  1. 手动下载protc可执行程序
    我们也可以自己从github上,去下载相应版本的protoc。在这里,找到3.0版本:

protobuf3.0

下边的Download列表中选择你自己平台需要的可执行程序下载包进行下载,由于我是在windows平台上编译,所以我选择protoc-3.0.0-win32.zip

protobuf versions

完成之后,解压,可以看到bin下的exe执行文件:

protobuf bin

说明你已经下载成功了,接着最后在我们的pom.xml中告诉protobuf-maven-plugin插件我们的可执行程序的路径:

protobuf location

build goal

注意:左侧我们在pom.xml中看到的有两个goal,此时选择第二个compile-custom,对hello.proto的修改在重新编译的时候才会生效,否则不会在target/generated-sources/protobuf/grpc-java目录下生成一个叫GreeterGrpc.java的文件。

编译提示:

custom goal

然后执行compile goal生成HelloRequest、HelloReply等java类,在target/generated-sources/protobuf/java目录下。

 grpc compile goal

编译提示:

compile goal

target目录下的就是编译生成的结果:

target catalog

最后,由于生成的代码中有

@java.lang.Override

这种注释,在JDK1.8中有问题,按住 Alt+Enter键,修改jdk语言级别为6:

set jdk level

编译生成的代码

由于我们上边规定了option:java_multiple_filestrue,因此在编译完成之后,会生成多个Message类,它们并没有被包含在HelloProto.java文件中。
每个Message类,拿HelloRequest来说,它实现了Message和MessageOrBuilder接口:

hierachy

由proto3语法定义的类继承自GeneratedMessageV3,实现了HelloRequestOrBuilder接口。

requestmessage

HelloRequestOrBuilder继承了MessageOrBuilder接口,这个类的代码非常简短:

hello builder

另外一个比较重要的类是GreeterGrpc.java文件。

rpcclass

展开阅读全文

没有更多推荐了,返回首页