您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > GRPC入门及简单使用介绍
GRPC课件课件内容GRPC概述为什么要使用GRPCGRPC案例讲解GRPC概述一、什么是GRPCGRPC是由Google提供的一个高性能、通用性强的RPC开源框架,它主要面向移动应用开发。官网:知识点: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的语法例子:官网:概述3、GRPC支持众多开发语言GRPC目前支持的开发语言已达到了10种:C,C++,Java,Go,Node.js,Python,Ruby,Objective-C,PHPandC#。并且GRPC框架已在GitHub上开源。GitHub地址:地址:使用案例2、编译proto文件编译有两种方式:一是在IDE中直接引入protobuf插件来编译。二是到官网下载源码,手工生成protoc编译器,然后再编译(不推荐,步骤太繁琐)。protoBuf官方源码:为什么要使用GRPC1、它使用HTTP2协议,可复用链接,更充分的利用底层TCP传输协议,并以数据流的方式传输,比其他基于HTTP1的传输速率更高。2、它基于ProtoBuffer语言,对传输数据进行压缩、系列化和结构化,易于客户端与服务端数据的读写操作,并使数据量传输变得更小、传输效率更高。3、基于以上及其他特性,使得基于GRPC的客户端和服务端更高效的利用流和链接,从而有助于节省宽带流量、降低链接次数、提高CUP使用效率和电池的使用寿命。GRPC使用案例案例、Person的服务1、通过ProtoBuf定义接口规范定义消息体(message)messagePerson{stringname=1;int32age=2;}messageResponseMessage{stringmessage=1;}messageQueryPersonRequest{stringname=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,StreamObserverResponseMessageresponseObserver){responseObserver.onNext(ResponseMessage.newBuilder().setMessage(Hello+request.getName()+,Let'sStartLearnGrpc!).build());responseObserver.onCompleted();}•客户端实现GRPC使用案例•客户端实现(hello)publicvoidhello(){//线程同步控制器CountDownLatchfinishLatch=newCountDownLatch(1);Personperson=Person.newBuilder().setName(Jack).setAge(25).build();StreamObserverResponseMessageresponse=newStreamObserverResponseMessage(){@OverridepublicvoidonCompleted(){finishLatch.countDown();}@OverridepublicvoidonError(Throwablearg0){finishLatch.countDown();}@OverridepublicvoidonNext(ResponseMessagemessage){System.out.println(message.getMessage());}};try{asyncStub.hello(person,response);finishLatch.await(1,TimeUnit.MINUTES);}catch(Exceptione){logger.log(Level.WARNING,RPCfailed:{0},e.getMessage());}}GRPC使用案例客户端到服务器端的单向流—Aclient-to-serverstreamingRPC.特点:客户端上传大量数据到服务端,服务端返回非常小的数据量给客户端。•服务器端实现(addPerson)@OverridepublicStreamObserverPersonaddPerson(StreamObserverResponseMessageresponseObserver){returnnewStreamObserverPerson(){@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();StreamObserverResponseMessageresponse=newStreamObserverResponseMessage(){@OverridepublicvoidonCompleted(){finishLatch.countDown();}@OverridepublicvoidonError(Throwablearg0){finishLatch.countDown();}@OverridepublicvoidonNext(ResponseMessagemessage){System.out.println(message.getMessage());}};try{StreamObserverPersonrequest=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,StreamObserverPersonresponseObserver){responseObserver.onNext(persons.get(request.getName()));responseObserver.onCompleted();}GRPC使用案例•客户端实现@OverridepublicvoidgetPersonByName(){CountDownLatchfinishLatch=newCountDownLatch(1);QueryPersonRequestqueryPersonRequest=QueryPersonRequest.newBuilder().setName(Jack).build();StreamObserverPersonresponse=newStreamObserverPerson(){@OverridepublicvoidonCompleted(){finishLatch.countDown();}@OverridepublicvoidonError(Throwablearg0){finishLatch.countDown();}@OverridepublicvoidonNext(Personperson){System.out.println(person);}};try{asyncStub.getPersonByName(queryPersonRequest,response);finishLatch.await(1,TimeUnit
本文标题:GRPC入门及简单使用介绍
链接地址:https://www.777doc.com/doc-6315650 .html