GRPC入门及简单使用介绍_第1页
GRPC入门及简单使用介绍_第2页
GRPC入门及简单使用介绍_第3页
GRPC入门及简单使用介绍_第4页
GRPC入门及简单使用介绍_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GRPC课件,课件内容GRPC概述为什么要使用GRPCGRPC案例讲解,GRPC概述,一、什么是GRPCGRPC是由Google提供的一个高性能、通用性强的RPC开源框架,它主要面向移动应用开发。官网:http:/www.grpc.io/,知识点:RPC的实现思路大同小异,以动态代理为例,定义好接口,用一个代理假装实现了这个接口(真正的实现放在服务端),供客户端调用,代理内部将该方法调用封装成一个网络请求发送到服务端。服务端根据参数找到对应的注册好的对象进行处理,返回给客户端。,GRPC概述,以下为GRPC概念图:,GRPC概述,二、GRPC的特性1、基于HTTP/2协议标准什么是HTTP/2协议?HTTP2.0即超文本传输协议2.0,是下一代HTTP协议(基于二进制的传输协议)。是由互联网工程任务组(IETF)的Bis(httpbis)工作小组进行开发。,GRPC概述,HTTP/2的优点http2减少了网络往返传输的数量,并且用多路复用和快速丢弃不需要的流的办法来完全避免headoflineblocking(线头阻塞)的困扰,降低延迟并提高安全性。支持大量并行流,所以即使网站的数据分发在各处也不是问题。合理利用流的优先级,可以让客户端尽可能优先收到更重要的数据。,GRPC概述,2、GRPC基于强大的IDL(Interfacedescriptionlanguage)GRPC基于ProtoBuf(ProtocolBuffers)定义接口规范。ProtoBuf是什么?ProtocolBuffers是google提供的一种轻便、高效、简单的数据存储语言,可以用于结构化、序列化数据。为什么要使用ProtoBuf?适合应用场景:它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化数据结构。,GRPC概述,支持语言众多(提供了完善的API):Proto2提供了C+、Java、Python三种语言的API。目前语言版本Proto3提供了更多的语言支持,包括C+、C#、GO、JAVA、PYTHON。易学易懂:protoBuf语法非常简单,掌握非常容易,便于读写。以下为protoBuf的语法例子:官网:,GRPC概述,3、GRPC支持众多开发语言GRPC目前支持的开发语言已达到了10种:C,C+,Java,Go,Node.js,Python,Ruby,Objective-C,PHPandC#。并且GRPC框架已在GitHub上开源。GitHub地址:,GRPC使用案例,2、编译proto文件编译有两种方式:一是在IDE中直接引入protobuf插件来编译。二是到官网下载源码,手工生成protoc编译器,然后再编译(不推荐,步骤太繁琐)。protoBuf官方源码:,为什么要使用GRPC,1、它使用HTTP2协议,可复用链接,更充分的利用底层TCP传输协议,并以数据流的方式传输,比其他基于HTTP1的传输速率更高。2、它基于ProtoBuffer语言,对传输数据进行压缩、系列化和结构化,易于客户端与服务端数据的读写操作,并使数据量传输变得更小、传输效率更高。3、基于以上及其他特性,使得基于GRPC的客户端和服务端更高效的利用流和链接,从而有助于节省宽带流量、降低链接次数、提高CUP使用效率和电池的使用寿命。,GRPC使用案例,案例、Person的服务1、通过ProtoBuf定义接口规范定义消息体(message)messagePersonstringname=1;int32age=2;messageResponseMessagestringmessage=1;messageQueryPersonRequeststringname=1;,GRPC使用案例,定义服务接口(service)servicePersonService/AsimpleRPC.rpchello(Person)returns(ResponseMessage)/Aclient-to-serverstreamingRPC.rpcaddPerson(streamPerson)returns(ResponseMessage)/Aserver-to-clientstreamingRPC.rpcgetPersonByName(QueryPersonRequest)returns(streamPerson)/ABidirectionalstreamingRPC.rpcgetAllPerson(streamPerson)returns(streamPerson),GRPC使用案例,2、GRPC服务端与客户端实现简单的RPC调用(不使用流操作)AsimpleRPC.特点:服务器与客户端的数据交互量非常小。服务端实现(hello)Overridepublicvoidhello(Personrequest,StreamObserverresponseObserver)responseObserver.onNext(ResponseMessage.newBuilder().setMessage(Hello+request.getName()+,LetsStartLearnGrpc!).build();responseObserver.onCompleted();客户端实现,GRPC使用案例,客户端实现(hello)publicvoidhello()/线程同步控制器CountDownLatchfinishLatch=newCountDownLatch(1);Personperson=Person.newBuilder().setName(Jack).setAge(25).build();StreamObserverresponse=newStreamObserver()OverridepublicvoidonCompleted()finishLatch.countDown();OverridepublicvoidonError(Throwablearg0)finishLatch.countDown();OverridepublicvoidonNext(ResponseMessagemessage)System.out.println(message.getMessage();tryasyncStub.hello(person,response);finishLatch.await(1,TimeUnit.MINUTES);catch(Exceptione)logger.log(Level.WARNING,RPCfailed:0,e.getMessage();,GRPC使用案例,客户端到服务器端的单向流Aclient-to-serverstreamingRPC.特点:客户端上传大量数据到服务端,服务端返回非常小的数据量给客户端。服务器端实现(addPerson)OverridepublicStreamObserveraddPerson(StreamObserverresponseObserver)returnnewStreamObserver()OverridepublicvoidonCompleted()responseObserver.onNext(ResponseMessage.newBuilder().setMessage(OK).build();responseObserver.onCompleted();OverridepublicvoidonError(Throwablearg0)OverridepublicvoidonNext(Personperson)persons.put(person.getName(),person);,GRPC使用案例,客户端实现publicvoidaddPerson()CountDownLatchfinishLatch=newCountDownLatch(1);Personperson=Person.newBuilder().setName(Jack).setAge(25).build();StreamObserverresponse=newStreamObserver()OverridepublicvoidonCompleted()finishLatch.countDown();OverridepublicvoidonError(Throwablearg0)finishLatch.countDown();OverridepublicvoidonNext(ResponseMessagemessage)System.out.println(message.getMessage();tryStreamObserverrequest=asyncStub.addPerson(response);request.onNext(person);request.onCompleted();finishLatch.await(1,TimeUnit.MINUTES);catch(Exceptione)logger.log(Level.WARNING,RPCfailed:0,e.getMessage();finally,GRPC使用案例,服务器端到客户端的单向流Aserver-to-clientstreamingRPC.特点:服务端返回大量数据到客户端,客户端上传非常小的数据量给服务端。服务器端实现OverridepublicvoidgetPersonByName(QueryPersonRequestrequest,StreamObserverresponseObserver)responseObserver.onNext(persons.get(request.getName();responseObserver.onCompleted();,GRPC使用案例,客户端实现OverridepublicvoidgetPersonByName()CountDownLatchfinishLatch=newCountDownLatch(1);QueryPersonRequestqueryPersonRequest=QueryPersonRequest.newBuilder().setName(Jack).build();StreamObserverresponse=newStreamObserver()OverridepublicvoidonCompleted()finishLatch.countDown();OverridepublicvoidonError(Throwablearg0)finishLatch.countDown();OverridepublicvoidonNext(Personperson)System.out.println(person);tryasyncStub.getPersonByName(queryPersonRequest,response);finishLatch.await(1,TimeUnit.MINUTES);catch(Exceptione)logger.log(Level.WARNING,RPCfailed:0,e.getMessage();,GRPC使用案例,客户端与服务器端的双向流ABidirectionalstreamingRPC.适用场景:客户端上传大量数据到服务端,服务端返回给客户端的数据量也很大。服务器端实现OverridepublicStreamObservergetAllPerson(StreamObserverresponseObserver)returnnewStreamObserver()OverridepublicvoidonCompleted()responseObserver.onCompleted();OverridepublicvoidonError(Throwablee)OverridepublicvoidonNext(Personperson)persons.put(person.getName(),person);IteratorpersonIt=persons.values().iterator();while(personIt.hasNext()responseObserver.onNext(personIt.next();,GRPC使用案例,客户端实现publicvoidgetAllPerson()CountDownLatchfinishLatch=newCountDownLatch(1);StreamObserverresponse=newStreamObserver()OverridepublicvoidonCompleted()finishLatch.countDown();OverridepublicvoidonError(Throwablearg0)finishLatch.countDown();OverridepublicvoidonNext(Personperson)System.out.println(person);tryStreamObserverrequest=asyncStub.getAllPerson(response);for(inti=0;i5;i+)Personperson=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论