官方文档: http://www.grpc.io/ 中文版: https://doc.oschina.net/grpc 目录: 一、利用maven compile 来将proto生成java文件 二、利用exe手动命令生成java文件 三、利用gradle build 来将proto生成java文件 四、编写service 和 client for java
一、利用maven compile 将proto生成java文件 1.编写 .proto 文件 。命名为 : grpc-helloworld.proto .文件内容如下: (protobuf3 语法:https://developers.google.com/protocol-buffers/docs/proto3 )
syntax = "proto3";
option java_generic_services = true;
option java_multiple_files = true;
option java_package = "com.hservice.grpc.schema";
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;
}
2.新建maven项目,将.proto放入src/main/proto文件夹下面
3、编写pom.xml文件,引入插件
<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.ytf.simple</groupId>
<artifactId>protobuf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>simple</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<grpc.version>1.0.1</grpc.version>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-core</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.0.1</version>
</dependency>
<!-- <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId>
<version>${grpc.version}</version> </dependency> <dependency> <groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId> <version>0.10.0</version> </dependency> -->
</dependencies>
<build>
<finalName>com.ytf.rpc.demo</finalName>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.5.0.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.1:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
4、进入pom.xml的文件目录,打开cmd窗口 (shift + 鼠标右键 -->在此处打开命令窗口) 输入 mvn compile
5、生成的java 以及grpc文件目录如下: projectPath\target\generated-sources\protobuf\java projectPath\Path\target\generated-sources\protobuf\grpc-java
6、将代码copy到项目src/main/java目录下 刷新项目即可
二、利用exe手动命令生成java文件
1.下载 protocol buffer 2/3
文档介绍:https://developers.google.com/protocol-buffers/docs/proto3
下载地址:https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.2/
下载完成后,添加 window 环境变量(由于我本地有两个版本,故我命名为protoc2/protoc3)添加完成后,进行验证。如下图:
如果出现于作者同样的图,说明安装成功!
2.在编译的 gRPC 的时候 ,protocol buffer 需要将 protoc-gen-grpc-java 作为插件来生成代码,
文档介绍:http://www.grpc.io/docs/quickstart/java.html
下载地址:https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/1.0.1/
下载完成后,
同样的添加到 winddos环境变量中。
3.编写 .proto 文件 。命名为 : grpc-helloworld.proto .文件内容如下:
syntax = "proto3";
option java_generic_services = true;
option java_multiple_files = true;
option java_package = "com.hservice.grpc.schema";
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;
}
首先生成Proto 文件
再执行生成命令:( >>> protoc3 --plugin=protoc-gen-grpc-java=D:/sysEnv/protoc-gen-grpc-java.exe --grpc-java_out=java --proto_path=proto proto/g
rpc-helloworld.proto) 生成gRPC文件
如果在这一步的时候,执行失败,请注意路径参数的配置。
4.生成后,会在com.hservice.grpc.schema 包下生存 GreeterGrpc.java 文件。我的生成后java 代码如下:
三、利用gradle build 将proto生成java文件 1、新建gradle3.0+++版本的gradle项目
2、编写gradle.build文件内容,如下: 3、进入gradle.build文件所在目录,,打开cmd窗口 (shift + 鼠标右键 -->在此处打开命令窗口)输入 gradle build 4、生成的文件目录如下: 然后复制过去就好 projectHome\build\generated\source\proto\main\java projectHome\build\generated\source\proto\main\grpc
apply plugin: 'java' apply plugin: 'com.google.protobuf' buildscript { repositories { mavenCentral() } dependencies { // ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier // gradle versions classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } } repositories { mavenLocal() mavenCentral() } // IMPORTANT: You probably want the non-SNAPSHOT version of gRPC. Make sure you // are looking at a tagged version of the example and not "master"! // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.0.1' // CURRENT_GRPC_VERSION dependencies { compile "io.grpc:grpc-netty:${grpcVersion}" compile "io.grpc:grpc-protobuf:${grpcVersion}" compile "io.grpc:grpc-stub:${grpcVersion}" testCompile "junit:junit:4.11" testCompile "org.mockito:mockito-core:1.9.5" } protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.1.0' } plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" } } generateProtoTasks { all()*. plugins { grpc { // To generate deprecated interfaces and static bindService method, // turn the enable_deprecated option to true below: option 'enable_deprecated=false' } } } } // Inform IntelliJ projects about the generated code. apply plugin: 'idea' idea { module { // Not using generatedSourceDirs because of // https://discuss.gradle.org/t/support-for-intellij-2016/15294/8 sourceDirs += file( "${projectDir}/build/generated/source/proto/main/java" ); sourceDirs += file( "${projectDir}/build/generated/source/proto/main/grpc" ); } } // Provide convenience executables for trying out the examples. apply plugin: 'application' startScripts.enabled = false task routeGuideServer(type: CreateStartScripts) { mainClassName = 'io.grpc.examples.routeguide.RouteGuideServer' applicationName = 'route-guide-server' outputDir = new File( project .buildDir, 'tmp' ) classpath = jar.outputs.files + project . configurations .runtime } task routeGuideClient(type: CreateStartScripts) { mainClassName = 'io.grpc.examples.routeguide.RouteGuideClient' applicationName = 'route-guide-client' outputDir = new File( project .buildDir, 'tmp' ) classpath = jar.outputs.files + project . configurations .runtime } task helloWorldServer(type: CreateStartScripts) { mainClassName = 'io.grpc.examples.helloworld.HelloWorldServer' applicationName = 'hello-world-server' outputDir = new File( project .buildDir, 'tmp' ) classpath = jar.outputs.files + project . configurations .runtime } task helloWorldClient(type: CreateStartScripts) { mainClassName = 'io.grpc.examples.helloworld.HelloWorldClient' applicationName = 'hello-world-client' outputDir = new File( project .buildDir, 'tmp' ) classpath = jar.outputs.files + project . configurations .runtime } task compressingHelloWorldClient(type: CreateStartScripts) { mainClassName = 'io.grpc.examples.experimental.CompressingHelloWorldClient' applicationName = 'compressing-hello-world-client' outputDir = new File( project .buildDir, 'tmp' ) classpath = jar.outputs.files + project . configurations .runtime } applicationDistribution.into( 'bin' ) { from(routeGuideServer) from(routeGuideClient) from(helloWorldServer) from(helloWorldClient) from(compressingHelloWorldClient) fileMode = 0755 }
四、编写service 和 client for java 首先你得有:*Grpc.java,*Proto.java,*Builder.java文件
1、编写service,流 ①、继承GreeterGrpc.GreeterImplBase 定义一个静态内部类重写你刚才定义的接口, 然后你还的有个start(),stop(),blockUntilShutdown()方法来操作服务端的开始停止,完整代码如下:
package com.ibm.crl.demo; import java.io.IOException; import io.grpc.Server; import io.grpc.ServerBuilder; import io.grpc.stub.StreamObserver; public class DemoServer { private Server server ; private int port = 50051; private void start() throws IOException { server = ServerBuilder.forPort( port ).addService( new DemoGrpcImpl()).build().start(); System. out .println( "server start " + port ); Runtime.getRuntime().addShutdownHook( new Thread() { @Override public void run() { // Use stderr here since the logger may have been reset by its JVM shutdown hook. System. err .println( "*** shutting down gRPC server since JVM is shutting down" ); DemoServer. this .stop(); System. err .println( "*** server shut down" ); } }); } private void stop() { if ( server != null ) { server .shutdown(); } } private void blockUntilShutdown() throws InterruptedException { if ( server != null ) { server .awaitTermination(); } } public static void main(String[] args) throws IOException, InterruptedException { final DemoServer server = new DemoServer(); server.start(); server.blockUntilShutdown(); } static class DemoGrpcImpl extends GreeterGrpc.GreeterImplBase { @Override public StreamObserver<HelloRequest> sayHello(StreamObserver<HelloReply> responseObserver) { return new StreamObserver<HelloRequest>() { private int count = 0; public void onNext(HelloRequest req) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } count ++; HelloReply reply = HelloReply.newBuilder().setMessage( "demo " + req.getName()).build(); responseObserver.onNext(reply); System. out .println( "resquest:" + req.getName() + System.currentTimeMillis()); } public void onError(Throwable t) { System. err .println(System.currentTimeMillis() + " : " + count + "server demo error:" + t.getMessage()); responseObserver.onError(t); } public void onCompleted() { System. out .println( "task finish close session ! someone has died!" + System.currentTimeMillis() + " times:" + count ); responseObserver.onCompleted(); } }; } } } // end 2、编写client,流 主要是初始化channel和GreeterStub代码如下: package com.ibm.crl.demo; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.examples.helloworld.HelloWorldServer; import io.grpc.stub.StreamObserver; public class DemoClient { private final ManagedChannel channel ; private final GreeterGrpc.GreeterStub stub ; private int count = 1; public DemoClient(String host, int port) { this (ManagedChannelBuilder.forAddress(host, port).usePlaintext( true )); } DemoClient(ManagedChannelBuilder<?> channelBuilder) { channel = channelBuilder.build(); stub = GreeterGrpc.newStub( channel );
} public void shutdown() throws InterruptedException { channel .shutdown().awaitTermination(5, TimeUnit. SECONDS ); } public void greet(String name) { try { final CountDownLatch finishLatch = new CountDownLatch(1); StreamObserver<HelloRequest> ob = stub .sayHello( new StreamObserver<HelloReply>() { @Override public void onNext(HelloReply value) { System. out .println( "response:" + value.getMessage() + count ); count ++; } public void onError(Throwable t) { System. err .println( "client demo error:" + t.getMessage()); finishLatch.countDown(); } public void onCompleted() { System. out .println( "finished demo" ); finishLatch.countDown(); } }); Thread.sleep(400); HelloRequest reply = HelloRequest.newBuilder().setName(name).build(); System. out .println(System.currentTimeMillis()); for ( int i = 0; i < 1; i++) { ob.onNext(reply); } ob.onCompleted(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); DemoClient client = new DemoClient( "localhost" , 50051); try { String user = "world" ; client.greet(user); System. out .println( "耗时:" + (System.currentTimeMillis() - start) + "ms" ); } finally { client.shutdown(); } System. out .println( System.currentTimeMillis() + "耗时:" + (System.currentTimeMillis() - start) + "ms" ); } }