保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

gRPC三种客户端类型实践Java版

  本文承袭Grpc服务开发和接口测试初探【Java】内容,学会了基本的gRPC的基本Demo之后,自然要开始了各类客户端的学习。由于服务端的代码都是由开发写好的,所以作为新手测试来说,我觉得学好客户端的代码优先级更高一些。
  书接上文,gRPC客户端有三种实现方式,其实就是从io。grpc。ManagedChannel创建客户端Stub的过程。三种方式分别为:newBlockingStub、newStub、newFutureStub。下面通过代码演示来分享三种的区别和优劣。
  gRPC客户端目前用起来跟HTTP协议一样,调用方式跟HttpClient调用一样。分成了阻塞、异步和future,有兴趣可以移步HTTP异步连接池和多线程实践。服务端
  服务端是上期进行改造,主要是增加了响应等待时间和时间信息,方便后面验证不同客户端功能。代码如下:packagecom。funtester。grpc;importcom。funtester。frame。SourceCode;importcom。funtester。fungrpc。HelloRequest;importcom。funtester。fungrpc。HelloResponse;importcom。funtester。fungrpc。HelloServiceGrpc;importcom。funtester。utils。Time;importio。grpc。stub。StreamObserver;importorg。apache。logging。log4j。LogManager;importorg。apache。logging。log4j。Logger;publicclassHelloServiceImplextendsHelloServiceGrpc。HelloServiceImplBase{privatestaticfinalLoggerloggerLogManager。getLogger(HelloServiceImpl。class);OverridepublicvoidexecuteHi(HelloRequestrequest,StreamObserverHelloResponseresponseObserver){HelloResponseresponseHelloResponse。newBuilder()。setMsg(你好request。getName()Time。getDate())。build();SourceCode。sleep(1。0);logger。info(用户{}来了,request。getName());responseObserver。onNext(response);responseObserver。onCompleted();}}newBlockingStub
  顾名思义,这个是阻塞调用的gRPC客户端类型,实际使用中跟HTTP接口请求响应一样,代码如下:packagecom。funtest。grpcimportcom。funtester。frame。SourceCodeimportcom。funtester。fungrpc。HelloRequestimportcom。funtester。fungrpc。HelloResponseimportcom。funtester。fungrpc。HelloServiceGrpcimportio。grpc。ManagedChannelimportio。grpc。ManagedChannelBuilderimportjava。util。concurrent。ExecutionExceptionclassBlockClientextendsSourceCode{publicstaticvoidmain(String〔〕args)throwsExecutionException,InterruptedException{ManagedChannelmanagedChannelManagedChannelBuilder。forAddress(localhost,8080)。usePlaintext()。build()HelloServiceGrpc。HelloServiceBlockingStubhelloServiceBlockingStubHelloServiceGrpc。newBlockingStub(managedChannel)。withCompression(gzip)HelloRequesthelloRequestHelloRequest。newBuilder()。setName(FunTester)。build()5。times{HelloResponseorderResponsehelloServiceBlockingStub。executeHi(helloRequest)output(收到响应:orderResponse。getMsg())}managedChannel。shutdown()}}
  控制台输出:20:46:04。664main当前用户:oker,工作目录:UsersokerIdeaProjectsfuntester,系统编码格式:UTF8,系统MacOSX版本:10。1620:46:04。675main20:46:06。517main收到响应:你好FunTester2022050920:46:0520:46:07。521main收到响应:你好FunTester2022050920:46:0620:46:08。531main收到响应:你好FunTester2022050920:46:0720:46:09。542main收到响应:你好FunTester2022050920:46:0820:46:10。552main收到响应:你好FunTester2022050920:46:09进程已结束,退出代码0
  比较简单,这里不多做介绍了。newStub
  看名字有点猜不出来,这是个纯异步调用客户端。写上去代码可能比较多,但是如果把io。grpc。stub。StreamObserver对象拆开看就会比较容易懂一些。代码如下:packagecom。funtest。grpcimportcom。funtester。frame。SourceCodeimportcom。funtester。fungrpc。HelloRequestimportcom。funtester。fungrpc。HelloResponseimportcom。funtester。fungrpc。HelloServiceGrpcimportio。grpc。ManagedChannelimportio。grpc。ManagedChannelBuilderimportio。grpc。stub。StreamObserverimportjava。util。concurrent。ExecutionExceptionclassSyncClientextendsSourceCode{publicstaticvoidmain(String〔〕args)throwsExecutionException,InterruptedException{ManagedChannelmanagedChannelManagedChannelBuilder。forAddress(localhost,8080)。usePlaintext()。build()HelloServiceGrpc。HelloServiceStubhelloServiceStubHelloServiceGrpc。newStub(managedChannel)。withCompression(gzip)HelloRequesthelloRequestHelloRequest。newBuilder()。setName(FunTester)。build()StreamObserverHelloResponsehelloResponseStreamObservernewStreamObserverHelloResponse(){OverridevoidonNext(HelloResponsevalue){output(value。getMsg())}OverridevoidonError(Throwablet){output(t。getMessage())}OverridevoidonCompleted(){}}5。times{helloServiceStub。executeHi(helloRequest,helloResponseStreamObserver)}sleep(2000)managedChannel。shutdown()}}
  由于都是异步,所以相当于自动多线程了。控制台输出如下:20:50:59。053main20:51:00。816grpcdefaultexecutor4你好FunTester2022050920:50:5920:51:00。816grpcdefaultexecutor1你好FunTester2022050920:50:5920:51:00。816grpcdefaultexecutor3你好FunTester2022050920:50:5920:51:00。816grpcdefaultexecutor0你好FunTester2022050920:50:5920:51:00。816grpcdefaultexecutor2你好FunTester2022050920:50:59进程已结束,退出代码0
  可以看到,所有请求响应的结果时间都是一样的,说明请求到达服务端时间是一样的。newFutureStub
  这种客户端也是异步的,之所以放在最后将是因为它具有同步客户端的属性,在实际使用中,既可以当做异步客户端使用也可以当做一个同步的客户端使用。下面是演示代码:packagecom。funtest。grpcimportcom。funtester。frame。SourceCodeimportcom。funtester。fungrpc。HelloRequestimportcom。funtester。fungrpc。HelloResponseimportcom。funtester。fungrpc。HelloServiceGrpcimportcom。google。common。util。concurrent。ListenableFutureimportio。grpc。ManagedChannelimportio。grpc。ManagedChannelBuilderimportjava。util。concurrent。ExecutionExceptionclassFutureClientextendsSourceCode{publicstaticvoidmain(String〔〕args)throwsExecutionException,InterruptedException{ManagedChannelmanagedChannelManagedChannelBuilder。forAddress(localhost,8080)。usePlaintext()。build()HelloServiceGrpc。HelloServiceFutureStubhelloServiceFutureStubHelloServiceGrpc。newFutureStub(managedChannel)。withCompression(gzip)HelloRequesthelloRequestHelloRequest。newBuilder()。setName(FunTester)。build()同步客户端的使用方式5。times{ListenableFutureHelloResponsehelloResponseListenableFuturehelloServiceFutureStub。executeHi(helloRequest)HelloResponsehelloResponsehelloResponseListenableFuture。get()output(helloResponse。getMsg())}异步客户端的使用方式defres〔〕5。times{ListenableFutureHelloResponsehelloResponseListenableFuturehelloServiceFutureStub。executeHi(helloRequest)reshelloResponseListenableFuture}res。each{output(it。get()。getMsg())}managedChannel。shutdown()}}
  控制台输出:21:03:07。312main21:03:09。226main你好FunTester2022050921:03:0821:03:10。232main你好FunTester2022050921:03:0921:03:11。238main你好FunTester2022050921:03:1021:03:12。247main你好FunTester2022050921:03:1121:03:13。255main你好FunTester2022050921:03:1221:03:14。262main你好FunTester2022050921:03:1321:03:14。281main你好FunTester2022050921:03:1321:03:14。281main你好FunTester2022050921:03:1321:03:14。282main你好FunTester2022050921:03:1321:03:14。282main你好FunTester2022050921:03:13进程已结束,退出代码0
  可以看到,前面五个请求是串行的,后面的五个请求是并行的。在实际工作中,使用到异步调用又要处理结果的地方也是这种类型使用较多,而使用Java的线程同步类,往往比较麻烦也不够优雅。HaveFunTester!

汕头中考作文范文我真想作文中考已经拉开帷幕,小编整理了中考的作文范文,快来看看吧。今年中考作文题为半命题作文ldquo;我真想rdquo;,昨天下午5时语文考试完毕后,记者在飞厦中学门口抓拍到了一……氢燃料电池的催化剂2030年必须迈过去的坎【能源人都在看,点击右上角加关注】说到新能源汽车,很多投资者脑海里会跳出三个字电动车。其实新能源汽车的涵盖范围不止于电动汽车(BEV),还包括一个很重要的品类氢能源汽车(……法媒中国是我们未来的窗户《回声报》9月17日刊登题为《中国是我们未来的窗户》的文章,称西方曾长期认为中国数字企业都是抄袭硅谷,经常将他们称为中国的谷歌或亚马逊。但情况已经变了,中国创造了其它地方都不存……到底啥是比特币到目前为止,我还没发现谁把比特币和区块链说得很清楚,所以今天我想试试。为了更好理解比特币,先给大家介绍西太平洋上的一个小岛,它叫雅普岛,这个岛上的居民用石头当货币,不是什……落叶的轮回作文在平时的学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌生吧,根据写作命题的特点,作文可以分为命题作文和非命题作文。那要怎么写好作文呢?以下是小编收集整理的落叶的轮回……比特币价值归零所面对的系统性风险系统性风险是衡量金融市场活动安全与否的重要指标,它的威力就像说你不行你就不行,哪怕前面九十九步都走对了,但最后一步走错了,也会全盘皆输。这种蝴蝶效应式坍塌会导致整个体系出……从苹果13系列手机发售看,原来我们一直在键盘爱国9月17日,苹果13系列手机在国内正式发售了,无论是正式发售,还是前几天的预售,异常火爆销售场面一度让官网都瘫痪了。那么为何苹果要放在9。18前一天正式发售,是真的巧合,还是他……果粉狂喜!iOS15正式版发布FaceTime通话功能来了【手机中国新闻】9月15日凌晨,苹果召开秋季新品发布会,推出了iPhone13系列等新品。除了新品外,iOS15也备受关注,发布会过后,苹果给开发者们推送了iOS15RC版本更……iOS15正式版来了,线上升级全面指南苹果公司在今年6月举办了WWDC21,并推出了iOS15系统,相信很多朋友都已经用上公测版,而正式版终于要来了!今日凌晨1点苹果终于推送了iOS15正式版。同时推送了wa……iOS15正式版新功能总整理25项必学重点功能一次看苹果今日正式推出iOS15和iPadOS15正式版更新,主要是针对iPhone、iPad与iPodtouch所推出,iOS15支援iPhone6s系列及新款机型,最新iOS15……屏下摄像头手机并不贵,8GB运存55W快充仅2498元,还有智能手机在实现全面屏的过程中,正面诞生了很多种设计,包括刘海屏,水滴屏,挖孔屏,升降屏等等,这些都是处于过渡期,而屏下摄像头技术在未来才是主流。目前市面上在售的屏下摄像头手机并……手机中的明星?这四款国产手机颜值最高,连直男都把握不住但是随着手机芯片由高通一家独大之外,台积电也能从中分一杯羹之外,再无其它选择,可惜了华为的海思麒麟芯片。既然芯片无法拉开差距,于是我们看见各家厂商纷纷开始从手机外观开始动手对手……
无奈的婚礼小蜜蜂和小蜘蛛订婚了,但他们的脸上没有一点儿喜色。小蜜蜂双翅下垂,杏眼含恨,不时用小爪子抓抓自己飘逸的金色纱裙,用力地揉搓;小蜘蛛吸着雪茄,忧郁万分,一丝无奈锁在眉间,八只触角……为什么任何事件都有人可以在很短时间内写出比较复杂的文章?答:胸藏文墨怀若谷博览群书、积淀知识;胸有成竹、下笔成章;腹有诗书、潺潺流淌;几分耕耘、几分收获;机会来临、一触即发!正所谓,没有金刚钻,不……我最爱的水果是葡萄作文1我最爱的水果葡萄我爱吃的水果可多啦!比如:香蕉、芒果、西瓜、火龙果简直是数不胜数。但你知道我最喜欢吃的水果是什么吗?来猜一猜:一串串,晶莹剔透,像一颗颗玻璃球。对……量子为什么会纠缠,本质原因是什么?量子纠缠是微观粒子间的一种特殊物理现象,已经被实验观测所证实。很多人不能接受量子纠缠,其实有以下几个原因:一、量子纠缠这个名字起得不好这个名字不能真正表达这个微观粒……如果现在有一位科学巨匠横空出世,把现在所有的科学理论全部推翻如果真的有人提出了惊世骇俗的理论,将现有的理论全部推翻,那么等待他的结果是无人理睬,该理论对于世界没有任何的影响。为什么会这样呢?难道科学不是追求绝对真理吗?如果理论是外……陈景润穷其一生而至死没能证明哥德巴赫猜想,那么他还有什么其他200多年前,德国数学家哥德巴赫(Goldbach)发现,似乎任何一个大于2的偶数都可以写成两个质数之和的形式。但是他无法给出证明,他同时代的欧拉等数学家也无法证明。这个问题就……观愤怒的小孩有感【参考文章1:观《愤怒的小孩》有感】如今,许多父母由于工作过于繁忙,因此常常忽略了孩子们的感受。最近,我就看了一部关于父母长期不关心小孩而引发的离家出走的电影。有一……2021中国卫星互联网产业及用户调研报告发布中国青年报客户端北京4月24日电(中青报中青网记者邱晨辉)今天,在首届中关村商业航天大会暨2022年中国航天日主题活动上,北京九天微星发布《谁可摘星辰2021年中国卫星互联网产……做强社区电商产业满足居民新消费需求作者:赵霞、韩一军(中国农业大学经管学院、国家农业市场研究中心)社区电商是指依托互联网平台,以服务具有社区属性的城乡居民家庭生活消费为目的,整合社区周边一定范围内的产品与……中学生作文风筝作文曾经,带着希望的风筝飞向蓝天,与清风游戏天际。可惜,它断了线。不管它飞得多高,也只是一只断线风筝,总有一天,风筝会跌落,就不能再飞翔。这是这只断线风筝的命运。是一种悲哀,一种失……太原老旧城区停车难,该怎么解决?太原老旧城区停车难是一个特别棘手的问题。先来说说造成这个现象的原因。一是老旧城区人口密度大,住宅楼大部分都没有建停车库,而且专门的停车场设立的又少。这样,找停车位就变成大家每天……三年级的传统重阳节作文老人节三年级的传统重阳节作文:老人节农历九月九日,为传统的重阳节,又称老人节,取谐音久久,长寿之意。因为《易经》中把久定为阴数,把九定为阳数,九月九日,日月并阳,两九相重,故而……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网