grpc框架_gRPC框架:同步、异步调用与流式编程 - Go语言中文社区

grpc框架_gRPC框架:同步、异步调用与流式编程


一、概览

  • gRPC一开始由 google 开发,是一款语言中立、高性能、平台中立、开源的远程过程调用系统.
  • 通过IDL文件来定义一个服务,包含:方法、参数和返回类型。
  • gRPC 基于HTTP/2标准设计,带来诸如双向流、流控、头部压缩。
  • protobuf使用基础
909eb4ced977d6b44b3280b535ba205f.png

二、同步和异步回调,流式编程

  • gRPC编程接口同时支持同步和异步的特点
  • 流式编程

三、插件protoc-gen-grpc-java编译安装

插件用于生成gRPC服务端与客户端类。

  • 下载代码:https://github.com/grpc/grpc-java
  • cd grpc-java/compile
  • ../gradlew build

过程中gradle下载比较慢,可自己手动下载,自己google,aliyun的mavne源还会有proto-xx的jar包下载失败,我自己下载下载,mvn install --xxx 安装到本地,应该还可以到中央仓库,可以自动下载就是有点慢跑,../gradlew build 每次手动安装jar包每build第一次都会失败,第二次运行才成功

  • 安装成功在dist目录下载 grpc-java/compiler/build/exe/java_plugin/ protoc-gen-grpc-java命令 grpc生成Server时用的
  • 在命令中使用:protoc --plugin=protoc-gen-grpc-java=/Users/ttylang/gitee/grpc-java/compiler/build/exe/java_plugin/protoc-gen-grpc-java --grpc-java_out=./java --java_out=./java ./hello.proto

四、编写proto文件

syntax = "proto3";option java_multiple_files = true;option java_generic_services = true;option java_package = "com.example.bean";message QueryRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3;}message QueryResponse { string res = 1;}service IndexService { rpc queryApi(QueryRequest) returns(QueryResponse);}

五、编译protoc生成Java对象与gRPC代码

protoc --plugin=protoc-gen-grpc-java=/Users/ttylang/gitee/grpc-java/compiler/build/exe/java_plugin/protoc-gen-grpc-java --grpc-java_out=./java --java_out=./java ./hello.proto

六、Java服务端项目

  • 新建maven java普通项目
  1. 在pom里加依懒:
 io.grpc grpc-all 1.20.0
  • 把proto的代码复制到项目里
  • 业务实现类
//业务服务处理类 继承IndexServiceGrpc.IndexServiceImplBase类public class IndexServiceImpl extends IndexServiceGrpc.IndexServiceImplBase { @Override public void queryApi(QueryRequest req, io.grpc.stub.StreamObserver responseObserver) { //封装Response响应,业务代码 ...... QueryResponse reply = QueryResponse.newBuilder().setRes("这是你查询的结果").build();s responseObserver.onNext(reply); responseObserver.onCompleted(); }}//Server端启动public class ServerDemo { private Server server; public ServerDemo(int port){ try { this.server = ServerBuilder.forPort(port) .addService(new IndexServiceImpl()) .build(); }catch (Exception e){ e.printStackTrace(); } } public void start(){ try{ System.out.println("start server and listen 5001"); this.server.start(); this.server.awaitTermination(); }catch (Exception e){ e.printStackTrace(); } } public void stop(){ if(this.server!=null) this.server.shutdown(); } public static void main(String[] args) { ServerDemo server = new ServerDemo(5001); server.start(); }} 

七、同步、异步客户端代码

  • 同步调用客户端
 public static void sendReq(){ ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build(); IndexServiceGrpc.IndexServiceBlockingStub blockingStub = IndexServiceGrpc.newBlockingStub(managedChannel); QueryRequest req = QueryRequest.newBuilder().setPageNumber(1).setResultPerPage(10).setQuery("*.java").build(); QueryResponse resp = blockingStub.queryApi(req); System.out.println(resp.getRes());}
  • 异步客户端
//异步客户端 ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build(); IndexServiceGrpc.IndexServiceFutureStub asyncStub = IndexServiceGrpc.newFutureStub(managedChannel); ListenableFuture future = asyncStub.queryApi(req);while(!future.isDone()){ System.out.println("异步:"+future.get().getRes());}
  • 异步回调客户端
//异步+回调的客户端IndexServiceGrpc.IndexServiceStub callbackStub = IndexServiceGrpc.newStub(managedChannel);callbackStub.queryApi(req,new StreamObserver(){ @Override public void onNext(QueryResponse value) { System.out.println("回调:"+value.getRes()); } @Override public void onError(Throwable t) { t.printStackTrace(); } @Override public void onCompleted() { System.out.println("onCompleted"); }});

八、gRPC双流式端代码

  • proto流式文件,在普通的proto上加了stream
syntax = "proto3";option java_multiple_files = true;option java_generic_services = true;option java_package = "com.example.bean";message QueryRequest { int32 number = 2;}message QueryResponse { string res = 1;}service IndexService { rpc queryApi(stream QueryRequest) returns(stream QueryResponse);}
  • proto与插件protoc-gen-grpc-java生成gRPCJava代码,复制生成代码到Java 项目中
protoc --plugin=protoc-gen-grpc-java=/Users/ttylang/gitee/grpc-java/compiler/build/exe/java_plugin/protoc-gen-grpc-java --grpc-java_out=./java --java_out=./java ./stream.proto 
  • 服务端流式实现代码
//服务实现类public class IndexServiceStreamImpl extends IndexServiceGrpc.IndexServiceImplBase { @Override public StreamObserver queryApi(StreamObserver responseObserver) { StreamObserver streamObserver = new StreamObserver() { @Override public void onNext(QueryRequest value) { System.out.println("stream server:"+value.getNumber()); QueryResponse resp = QueryResponse.newBuilder().setRes(value.getNumber() + " x 2" + " = " + (value.getNumber()<<1)).build(); responseObserver.onNext(resp); } @Override public void onCompleted() { System.out.println("stream Server 计算结束"); } @Override public void onError(Throwable t) { t.printStackTrace(); } }; return streamObserver; }}// 服务类public class BootStrapServer { private Server server; private int port; public BootStrapServer(int port){ this.port = port; try { this.server = ServerBuilder.forPort(port) .addService(new IndexServiceStreamImpl()) .build(); }catch (Exception e){ e.printStackTrace(); } } public void start(){ try{ System.out.println("start server and listen "+this.port); this.server.start(); this.server.awaitTermination(); }catch (Exception e){ e.printStackTrace(); } } public void stop(){ if(this.server!=null) this.server.shutdown(); } //启动方法 public static void main( String[] args ) { BootStrapServer server = new BootStrapServer(5002); server.start(); }}
  • 流式客户端代码
public class ClientDemo { public static void main(String[] args) { ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39929721/article/details/110665205
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 04:07:06
  • 阅读 ( 1419 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢