博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
grpc客户端类型
阅读量:5975 次
发布时间:2019-06-20

本文共 3207 字,大约阅读时间需要 10 分钟。

介绍了grpc的四种服务类型,在定义服务的时候可以定义流式客户端,实现客户端以异步的方式返回多个对象,当然可以返回单个对象以实现异步的操作。在grpc中可以在客户端上进行同步异步的调用。

阻塞调用(blockingCall)

void blockingCall() {    HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(channel);    stub.simpleHello(person).getString();}

这是最简单的方式,通过block的形式调用rpc,并在当前线程返回结果。

Future直接调用(futureCallDirect)

void futureCallDirect() {    HelloServiceGrpc.HelloServiceFutureStub stub = HelloServiceGrpc.newFutureStub(channel);    ListenableFuture
response = stub.simpleHello(person); try { response.get(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(e); } catch (ExecutionException e) { }}

这种方式是通过创建futureStub调用rpc并获得future对象,通过get方法来阻塞调用,这里的future是guava包中的而不是jdk内置的。

Future回调调用(furueCallCallback)

void futureCallCallback() {    final CountDownLatch latch = new CountDownLatch(1);    HelloServiceGrpc.HelloServiceFutureStub stub = HelloServiceGrpc.newFutureStub(channel);    ListenableFuture
response = stub.simpleHello(person); Futures.addCallback( response, new FutureCallback
() { @Override public void onSuccess(@Nullable ProtoObj.Result result) { System.out.println(result.getString()); latch.countDown(); } @Override public void onFailure(Throwable t) { } }, directExecutor());}

同上前一种方式一样,获得Future,然后通过Futures方法在其他。

异步调用(asyncCall)

void asyncCall() {    HelloServiceGrpc.HelloServiceStub stub = HelloServiceGrpc.newStub(channel);    final CountDownLatch latch = new CountDownLatch(1);    StreamObserver
responseObserver = new StreamObserver
() { @Override public void onNext(ProtoObj.Result value) { System.out.println(value.getString()); latch.countDown(); } @Override public void onError(Throwable t) { } @Override public void onCompleted() { } }; stub.simpleHello(person, responseObserver); if (!Uninterruptibles.awaitUninterruptibly(latch, 1, TimeUnit.SECONDS)) { throw new RuntimeException("timeout!"); }}

在之前四种服务类型中已经使用过newStub,当时是用在客户端流式服务上,其实newStub并不只限于流式服务,任何rpc调用都可以使用其来实现异步调用。

异步底层方式调用

void advancedAsyncCall() {    //使用方法的名字METHOD_SIMPLE_HELLO进行调用    ClientCall
call = channel.newCall(HelloServiceGrpc.METHOD_SIMPLE_HELLO, CallOptions.DEFAULT); final CountDownLatch latch = new CountDownLatch(1); call.start(new ClientCall.Listener
() { @Override public void onMessage(ProtoObj.Result message) { System.out.println(Thread.currentThread().getName()); System.out.println(message.getString()); latch.countDown(); } }, new Metadata()); call.request(1); call.sendMessage(person); call.halfClose(); if (!Uninterruptibles.awaitUninterruptibly(latch, 10, TimeUnit.SECONDS)) { throw new RuntimeException("timeout!"); }}

该种方式只是上面newStub的底层实现,没有特殊需求不会使用这种方式进行rpc。

转载于:https://www.cnblogs.com/resentment/p/6850627.html

你可能感兴趣的文章
编码过程中的问题总结
查看>>
网页与APP中那些优美的登陆表单
查看>>
快速幂取模模板
查看>>
Git:配置
查看>>
神经系统知识普及
查看>>
Spring可扩展Schema标签
查看>>
c++ STL unique , unique_copy函数
查看>>
函数模板的使用说明
查看>>
http://miicaa.yopwork.com/help/overall/
查看>>
浅谈关于特征选择算法与Relief的实现
查看>>
Android 通过局域网udp广播自动建立socket连接
查看>>
Python按行输出文件内容具体解释及延伸
查看>>
mybatis-spring 项目简介
查看>>
FreeRTOS 任务优先级分配方案
查看>>
Wireshark抓取RTP包,还原语音
查看>>
Behavioral模式之Memento模式
查看>>
Work Management Service application in SharePoint 2016
查看>>
Dos 改动IP 地址
查看>>
Mac终端(Terminal)自定义颜色,字体,背景
查看>>
<转载>OleDb操作Access数据库:新增记录时获取自动编号的主键值
查看>>