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 + 鼠標右鍵 -->在此處打開命令窗口)輸入
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 + 鼠標右鍵 -->在此處打開命令窗口)輸入
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;
/* The port on which the server should run */
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();
}
}
/**
* Await termination on the main thread since the grpc library uses daemon threads.
*/
private
void
blockUntilShutdown()
throws
InterruptedException {
if
(server
!=
null) {
server.awaitTermination();
}
}
/**
* Main launches the server from the command line.
*/
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();
}
};
}
}
}
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;
/**
* A simple client that requests a greeting from the
{@link HelloWorldServer}.
*/
public
class
DemoClient {
private
final
ManagedChannel
channel;
private
final
GreeterGrpc.GreeterStub
stub;
private
int
count
= 1;
/** Construct client connecting to HelloWorld server at {@code host:port}. */
public
DemoClient(String
host,
int
port) {
this(ManagedChannelBuilder.forAddress(host,
port).usePlaintext(true));
}
/** Construct client for accessing RouteGuide server using the existing channel. */
DemoClient(ManagedChannelBuilder<?>
channelBuilder) {
channel
=
channelBuilder.build();
stub
= GreeterGrpc.newStub(channel);
}
public
void
shutdown()
throws
InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
/** Say hello to server. */
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();
}
}
/**
* Greet server. If provided, the first element of {@code args} is the name to use in the
* greeting. 客戶端如果5秒沒收到響應,則斷開連接。
*/
public
static
void
main(String[]
args)
throws
Exception {
long
start
= System.currentTimeMillis();
DemoClient
client
= new
DemoClient("localhost",
50051);
try
{
/* Access a service running on the local machine on port 50051 */
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");
}