首页 > 其他 > 详细

Grpc应用,基本实现

时间:2016-07-07 02:23:29      阅读:504      评论:0      收藏:0      [点我收藏+]

使用grpc可以用来进行不同系统之间的信息交互,而且grpc不限于java,使用同一个proto文件可以在不同的编程语言之间交互。


bubuko.com,布布扣

上面这张图介绍了proto文件的语法,对应proto3.0,具体更多的内容请参考文档:

http://www.grpc.io/docs/#generating-grpc-code

?

?

下面我们先讲一下如何在java中通过proto文件生成java代码,然后再讲如何使用。

添加如下依赖与插件:

Java代码 ?bubuko.com,布布扣
  1. <dependency>??
  2. ????<groupId>io.grpc</groupId>??
  3. ????<artifactId>grpc-all</artifactId>??
  4. ????<version>0.14.0</version>??
  5. </dependency>??
  6. <dependency>??
  7. ????<groupId>com.google.protobuf</groupId>??
  8. ????<artifactId>protobuf-java</artifactId>??
  9. ????<version>3.0.0-beta-2</version>??
  10. </dependency>??
  11. ??
  12. ??
  13. ????<build>??
  14. ????????<extensions>??
  15. ????????????<extension>??
  16. ????????????????<groupId>kr.motd.maven</groupId>??
  17. ????????????????<artifactId>os-maven-plugin</artifactId>??
  18. ????????????????<version>1.4.1.Final</version>??
  19. ????????????</extension>??
  20. ????????</extensions>??
  21. ????????<plugins>??
  22. ??
  23. ????????????<!--?protobuf?-->??
  24. ????????????<plugin>??
  25. ????????????????<groupId>org.xolstice.maven.plugins</groupId>??
  26. ????????????????<artifactId>protobuf-maven-plugin</artifactId>??
  27. ????????????????<version>0.5.0</version>??
  28. ????????????????<configuration>??
  29. ????????????????????<protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}</protocArtifact>??
  30. ????????????????????<pluginId>grpc-java</pluginId>??
  31. ????????????????????<pluginArtifact>io.grpc:protoc-gen-grpc-java:0.14.0:exe:${os.detected.classifier}</pluginArtifact>??
  32. ????????????????????<protoSourceRoot>src/main/resources/proto</protoSourceRoot>??
  33. ????????????????</configuration>??
  34. ????????????????<executions>??
  35. ????????????????????<execution>??
  36. ????????????????????????<goals>??
  37. ????????????????????????????<goal>compile</goal>??
  38. ????????????????????????????<goal>compile-custom</goal>??
  39. ????????????????????????</goals>??
  40. ????????????????????</execution>??
  41. ????????????????</executions>??
  42. ????????????</plugin>??
  43. ??
  44. ????????</plugins>??
  45. ????</build>??

这样一来,在进行mvn compile时,会自动去src/main/resources/proto目录下查找proto文件,并在target目录里生成对应的.java、.class文件。

?

?

下面我们写一个服务端、一个客户端的helloworld程序,proto文件如下:

Java代码 ?bubuko.com,布布扣
  1. syntax?=?"proto3";??
  2. ??
  3. package?grpc;??
  4. ??
  5. option?java_package?=?"com.zk_chs.grpc";??
  6. option?java_outer_classname?=?"HelloWorldServiceProto";??
  7. option?java_multiple_files?=?true;??
  8. ??
  9. service?HelloWorldService?{??
  10. ??rpc?SayHello?(HelloWorldRequest)?returns?(HelloWorldResponse)?{}??
  11. }??
  12. ??
  13. message?HelloWorldRequest?{??
  14. ??string?request?=?1;??
  15. }??
  16. ??
  17. message?HelloWorldResponse?{??
  18. ??string?response?=?1;??
  19. }??

当有option java_package存在时,会覆盖package属性,生成的文件如下:
bubuko.com,布布扣
?

?

?

接下来,需要先实现我们定义的HelloWorldService服务接口,该接口只需在服务端实现,客户端不用实现:

Java代码 ?bubuko.com,布布扣
  1. public?class?HelloWorldRpcServiceImpl?implements?HelloWorldRpcServiceGrpc.HelloWorldRpcService?{??
  2. ??
  3. ????@Override??
  4. ????public?void?sayHello(HelloWorldRequest?request,?StreamObserver<HelloWorldResponse>?responseObserver)?{??
  5. ????????String?req?=?request.getRequest();??
  6. ????????HelloWorldResponse?resp?=?HelloWorldResponse.newBuilder()??
  7. ????????????????.setResponse("hello?"?+?req)??
  8. ????????????????.build();??
  9. ????????responseObserver.onNext(resp);??
  10. ????????responseObserver.onCompleted();??
  11. ????}??
  12. ??
  13. }??

?

服务端实现:

Java代码 ?bubuko.com,布布扣
  1. public?class?GrpcServer?{??
  2. ??
  3. ????private?final?int?port?=?38628;??
  4. ??
  5. ????private?Server?server;??
  6. ??
  7. ????private?void?start()?throws?IOException?{??
  8. ????????server?=?ServerBuilder.forPort(port)??
  9. ????????????????.addService(HelloWorldRpcServiceGrpc.bindService(new?HelloWorldRpcServiceImpl()))?//?能继续使用.addService添加多个服务??
  10. ????????????????.build()??
  11. ????????????????.start();??
  12. ????????Runtime.getRuntime().addShutdownHook(new?Thread()?{??
  13. ????????????@Override??
  14. ????????????public?void?run()?{??
  15. ????????????????GrpcServer.this.stop();??
  16. ????????????}??
  17. ????????});??
  18. ????}??
  19. ??
  20. ????private?void?stop()?{??
  21. ????????if?(server?!=?null)?{??
  22. ????????????server.shutdown();??
  23. ????????}??
  24. ????}??
  25. ??
  26. ????private?void?blockUntilShutdown()?throws?InterruptedException?{??
  27. ????????if?(server?!=?null)?{??
  28. ????????????server.awaitTermination();??
  29. ????????}??
  30. ????}??
  31. ??
  32. ????public?static?void?main(String[]?args)?throws?IOException,?InterruptedException?{??
  33. ????????final?GrpcServer?server?=?new?GrpcServer();??
  34. ????????server.start();??
  35. ????????server.blockUntilShutdown();??
  36. ????}??
  37. ??????
  38. }??

?

客户端实现:

Java代码 ?bubuko.com,布布扣
  1. public?class?GrpcClient?{??
  2. ??
  3. ????private?final?ManagedChannel?channel;??
  4. ????private?final?HelloWorldRpcServiceGrpc.HelloWorldRpcServiceBlockingStub?blockingStub;??
  5. ??
  6. ????public?GrpcClient(String?host,?int?port)?{??
  7. ????????channel?=?ManagedChannelBuilder.forAddress(host,?port)??
  8. ????????????????.usePlaintext(true)??
  9. ????????????????.build();??
  10. ????????blockingStub?=?HelloWorldRpcServiceGrpc.newBlockingStub(channel);??
  11. ????}??
  12. ??
  13. ????public?void?shutdown()?throws?InterruptedException?{??
  14. ????????channel.shutdown().awaitTermination(5,?TimeUnit.SECONDS);??
  15. ????}??
  16. ??
  17. ????public?String?request(String?req)?{??
  18. ????????HelloWorldRequest?request?=?HelloWorldRequest.newBuilder()??
  19. ????????????????.setRequest(req)??
  20. ????????????????.build();??
  21. ????????return?blockingStub.sayHello(request).getResponse();??
  22. ????}??
  23. ??
  24. ????public?static?void?main(String[]?args)?throws?Exception?{??
  25. ????????GrpcClient?client?=?new?GrpcClient("localhost",?38628);??
  26. ????????String?req?=?"world!";??
  27. ????????String?response?=?client.request(req);??
  28. ????????System.out.println(response);??
  29. ????}??
  30. ??
  31. }??

?

?

然后进行测试,首先启动GrpcServer,再运行GrpcClient,在client的控制台能看到如下信息:
bubuko.com,布布扣
?

?

一个简易的grpc服务就完成了,当然,还有很多的不足:

1、例如异常信息处理(grpc有内置的异常信息)

2、连接每次都会断开,没有重复利用,效率低

?

下次的博客大概会介绍一下解决方法,比如采用commons-pool2连接池

?

Grpc应用,基本实现,http://zk-chs.iteye.com/blog/2308422

Grpc应用,搭配commons-pool2连接池实现连接复用,http://zk-chs.iteye.com/blog/2308730

Grpc应用,基本实现

原文:http://zk-chs.iteye.com/blog/2308422

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!