项目工程设计:
在一个idea项目中,有三个模块:grpc_lib、grpc_server、grpc_client。grpc_lib提供服务相关的proto文件和编译后的文件,grpc_server监听端口提供服务,grpc_client作为客户端调用服务。
-
在idea中新建项目和模块
创建一个maven项目,并在此项目中创建grpc_lib、grpc_server、grpc_client模块。如下图:
grpc工程结构.png 添加依赖
父工程的pom.xml中添加gprc相关的依赖和插件。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springboot_grpc</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>grpc_server</module>
<module>grpc_client</module>
<module>grpc_lib</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<grpc.version>1.11.0</grpc.version>
<os.plugin.version>1.5.0.Final</os.plugin.version>
<protobuf.plugin.version>0.5.1</protobuf.plugin.version>
<protoc.version>3.5.1</protoc.version>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>${grpc.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.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os.plugin.version}</version>
</plugin>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf.plugin.version}</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!--suppress UnresolvedMavenProperty -->
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<overWriteReleases>false</overWriteReleases>
<includeScope>runtime</includeScope>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
grpc_lib模块的pom.xml中添加编译的插件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot_grpc</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>grpc_lib</artifactId>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
grpc_server模块的pom.xml中引入grpc_lib的依赖
<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">
<parent>
<artifactId>springboot_grpc</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>grpc_server</artifactId>
<name>grpc-server</name>
<description>grpc demo</description>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>grpc_lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
grpc_client模块引入grpc_lib依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot_grpc</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>grpc_client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>grpc_client</name>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>grpc_lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
- 创建proto文件,编译
在grpc_lib模块的src/main
目录下创建proto
目录,并在创建的鲁姆中创建HiService.proto
文件,文件内容如下:
syntax = "proto3";
package com.example.grpc;
option java_multiple_files = true;
message HelloRequest {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
map<string, string> tags = 4;
}
message HelloResponse {
string greeting = 1;
}
service HelloService {
rpc hello(HelloRequest) returns (HelloResponse);
}
编辑后,点击右侧导航栏的maven->grpc_lib->Plugins->protobuf,右键选择
Run [grpc_lib] 运行,等待编译。编译完成后,生成的java文件在
target/generated-serouces/protobuf/java```目录下。如下图:
protobuf插件.png
- 将grpc_lib打成jar包
在grpc_lib模块下运行如下命令,打成jar包供另外两个模块使用
mvn clean install
- 创建服务端Service和Server
在grpc_server模块下,创建HelloService
,内容如下:
public class HelloService extends HelloServiceGrpc.HelloServiceImplBase{
@Override
public void hello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
System.out.println( request );
String greeting = "Hi " + request.getName() + " you are " + request.getAge() + " years old" +
" your hoby is " + (request.getHobbiesList()) + " your tags " + request.getTagsMap();
HelloResponse response = HelloResponse.newBuilder().setGreeting( greeting ).build();
responseObserver.onNext( response );
responseObserver.onCompleted();
}
}
创建MyGrpcServer
:
public class MyGrpcServer {
static public void main(String[] args) throws IOException, InterruptedException {
Server server = ServerBuilder.forPort( 8082 )
.addService( new HelloService() )
.build();
System.out.println( "Starting server..." );
server.start();
System.out.println( "Server started!" );
server.awaitTermination();
}
}
运行MyGrpcServer
中的main方法,启动server。
- 创建grpc的调用客户端
在grpc_client模块下,创建MyGrpcClient
:
public class MyGrpcClient {
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8082)
.usePlaintext()
.build();
HelloServiceGrpc.HelloServiceBlockingStub stub =
HelloServiceGrpc.newBlockingStub(channel);
HelloResponse helloResponse = stub.hello(
HelloRequest.newBuilder()
.setName("forezp")
.setAge(17)
.addHobbies("football").putTags( "how?","wonderful" )
.build());
System.out.println(helloResponse);
channel.shutdown();
}
}
运行MyGrpcClient
的main方法进行测试。