上文我们大概表达了我们这边准备做一个Grpc项目示例,然后主要的分层为:
api层 server层 client层
本文的话我们来实战一下,演示这里的api层。因为api层是专门用来一定接口的。并且他是被client和server层共享的,因此对于我们来说首先做的肯定是api层。下面我们就来演示下定义api层。
一、创建主项目
一般来说我们会首先创建一个主项目,然后剩余的模块都主要是在这个子项目里面以module的形式存在的,所以这里的话,我们创建一个GrpcDemo的项目:
然后我们把pom.xml里面的packaging由默认的jar修改为pom,示例如下:
此时我们的主项目就创建完成了。
二、创建api层module
接着我们在主项目GrpcDemo下面创建一个名称为grpc-api的module,示例如下:
三、引入grpc相关的依赖
由于这里的grpc部分呢是共享的,所以我们把它提取到这个主项目里面,此时完整的主项目pom.xml文件的示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.rpc.demo</groupId> <artifactId>GrpcDemo</artifactId> <version>1.0</version> <packaging>pom</packaging> <name>GrpcDemo</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <protobuf.version>3.12.0</protobuf.version> <protoc.version>3.12.0</protoc.version> <grpc.version>1.31.1</grpc.version><!-- CURRENT_GRPC_VERSION --> <grpc_stub.version>1.31.1</grpc_stub.version> <error_prone_annotations.version>2.11.0</error_prone_annotations.version> </properties> <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>${protobuf.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc_stub.version}</version> </dependency> <dependency> <groupId>com.google.errorprone</groupId> <artifactId>error_prone_annotations</artifactId> <version>${error_prone_annotations.version}</version> <!-- prefer to use 2.3.3 or later --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <modules> <module>grpc-api</module> </modules> </project>
在这里我们主要是添加了grpc相关的依赖和springboot相关的依赖。目前springboot项目是java开发里面非常流行的基础框架,所以这里我们就以springboot框架为基石来创建对应的项目。
四、编写api层的proto
这里我们就要开始准备api层了,api层主要的流程有:
1、创建proto文件夹 2、编写proto文件 3、编译proto文件
1)首先创建这个proto文件夹,因为一会要使用到maven编译,因此这里的我们创建的proto文件夹需要以源文件夹的形式存在,所以完整的路径是:src/main/proto,示例如下:
2)这里我们假设我们的流程如下:
client通过grpc调用server获取user的详情信息
那么从这个业务里面我们主要考虑以下几块信息:
1、需要一个request实体 2、需要一个response实体 3、需要一个method调用方法
所以这里的话,我们分成两个proto文件进行定义,第一个userdto.proto主要用于定义request和response,第二个userservice.proto主要用来定义获取用户信息的方法,完整的示例如下:
userdto.proto文件数据示例如下:
//protobuf版本为proto3 syntax = "proto3"; //实体类生成的包路径 package org.grpc.api.user.dto; //如果为true时message会生成多个类 option java_multiple_files = true; //定义请求用户信息的request实体,包含一个uid字段 message UserRequest { int32 uid = 1; } //定义返回用户信息的request实体,包含一个uid,name,age3个字段 message UserResponse { int32 uid = 1; string name = 2; int32 age = 3; }
示例图如下:
接着我们再创建一个userservice.proto的文件,数据示例如下:
//protobuf版本为proto3 syntax = "proto3"; // 引入刚才创建的dto实体定义 import "userdto.proto"; // 设置为true时,message会生成多个类 option java_multiple_files = true; // 此处要注意和userdto.proto相同包,否则找不到实体 package org.grpc.api.user.dto; // 服务定义生成的包 option java_package = "org.grpc.api.user.service"; // 指定生成Java的类名,如果没有该字段则根据proto文件名称以驼峰的形式生成类名 option java_outer_classname = "UserProto"; // 定义服务 service UserService { //定义接口,获取用户详情,设计到的类需要和前面保持一致 rpc list (UserRequest) returns (stream UserResponse) {} }
示例图如下:
此时我们就已经把接口定义完成了,这里定义的接口可以使用grpc编译工具进行编译,也可以使用maven进行编译,这里我们演示的主要是使用maven进行编译,因此再grpc-api项目的pom文件里面添加上对应的build信息,示例如下:
<build> <!-- os系统信息插件, protobuf-maven-plugin需要获取系统信息下载相应的protobuf程序 --> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.2</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.15.0:exe:${os.detected.classifier}</pluginArtifact> <!--指定代码生成到 src 下--> <!--<outputDirectory>${basedir}/src/main/java</outputDirectory>--> <clearOutputDirectory>false</clearOutputDirectory> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
然后我们进入到命令行或者使用开发工具执行以下下面的maven命令:
mvn protobuf:compile mvn protobuf:compile-custom
这里我是直接在eclipse下执行的,执行完毕之后就会出现两个新的文件夹,如下图:
这里展开就可以看到我们使用proto文件编译的java代码了:
然后我们把它拷贝到grpc-api这个模块的src/main/java模块下,然后把刚才生成的这两个文件夹给删除掉,最后的效果如下:
到这里我们的api层就暂时告一段落了,是不是很简单?
备注:
1、api层一般都用来定义的是一些rpc的接口 2、使用grpc我们的工作很简单,主要是定义proto文件,然后编译proto文件即可。
最后按照惯例,附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...