什么是RPC与GRPC!它们之间关系!
gprc与http对比,grpc为啥好,基本原理是什么?
区别:
rpc是远程过程调用,就是本地去调用一个远程函数,而http是通过url与restful风格的数据包去发送送和获取数据
rpc使用的一般编码协议更加高效,gprc使用protobuf编解码,而http使用的json进行编解码,数据相对于rpc更加直观,但是数据库大效率低下
rpc用于服务内部的互相调用,而http是用于和用户交互的
什么是RPC?
是指远程过程调用,一般用于异构的分布式系统之间的通信。让分布式应用之间的通信变得更加方便和高效
RPC的调用过程?
**RPC 架构包含4个核心组件:**客户端(Client)、客户端存根(Client Stub)、服务端(Server)及服务端存根(Server Stub)。
(1)客户端:服务的调用者。
(2)客户端存根:存放服务端的服务列表,将客户端请求打包并通过网络发送到服务端。
(3)服务端:服务提供者。
(4)服务端存根:接收客户端消息并解包,然后调用本地的方法。
主要包括:建立通信、服务寻址、网络传输、服务调用和返回!
(1)客户端以本地调用的方式发起调用,这时调用的其实是客户端存根。
(2)服务端存根在收到调用后,负责将被调用的方法名、参数等打包并编码成特定格式的能进行网络传输的消息体。
(3)客户端存根将消息体通过网络发送给服务端。
(4)服务端存根通过网络接收到消息,按照相应的格式进行拆包、解码,获取方法名和参数。
(5)服务端存根根据方法名和参数进行本地调用,这时调用的是真正的服务提供者。
(6)服务提供者调用本地服务,然后将结果返回给服务端存根。
(7)服务端存根将返回值打包并编码成消息。
(8)服务端存根通过网络将消息发送给客户端。
(9)服务端存根在收到消息后,进行拆包、解码并返回给客户端。
(10)服务端存根得到本次RPC调用的最终结果。
在RPC中一般会用到动态代理、序列化反序列化、NIO网络通信、服务注册和发现等技术。
什么是gRpc?
RPC是一个高性能、开源、通用的RPC框架。基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议(Protocol Buffers基本语法),支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。
什么是 Protocol Buffers(protobuf)?它与 XML 和 JSON 有什么区别?
首先protobuf使用的二进制编码,占用较少的存储空间和网络宽带!而XML和JSON都是使用文本格式的,占用空间和网络宽带都较大;
其次protobuf由于采用二进制编码和高效的序列化算法,可读性低,不能手动调式、支持多种数据类型,解析和序列化通常比XML和JSON要快、可读性高、可以手动调式!
如何定义一个消息类型和服务方法的protobuf文件?grpc支持哪些类型的服务方法?它们的区别是什么?
在 Protobuf 文件中定义消息类型和服务方法是定义 gRPC 服务的关键部分。以下是如何在 Protobuf 文件中定义消息类型和服务方法的示例,以及 gRPC 支持的不同类型的服务方法和它们的区别:
定义消息类型:
在 Protobuf 文件中,使用 message
关键字来定义消息类型。以下是一个示例:
protobufCopy codesyntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
}
上述代码定义了一个名为 Person
的消息类型,它有两个字段 name
和 age
。
定义服务方法:
在 Protobuf 文件中,使用 service
关键字来定义服务。每个服务可以包含多个方法,每个方法都有输入和输出消息类型。以下是一个示例:
protobufCopy codesyntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
}
service MyService {
rpc GetPersonInfo (Person) returns (Person);
}
上述代码定义了一个名为 MyService
的服务,其中包含一个名为 GetPersonInfo
的方法,它的输入和输出都是 Person
消息类型。
gRPC 支持的服务方法类型:
gRPC 支持四种不同类型的服务方法:
- 单一请求-单一响应(Unary): 这是最常见的类型,客户端发送一个请求,服务器处理请求并返回单个响应。这种类型的方法类似于传统的函数调用。
- 客户端流(Client Streaming): 客户端可以连续地发送多个请求消息,服务器在收到所有请求后处理并返回单个响应。
- 服务器流(Server Streaming): 服务器发送多个响应消息,而客户端只发送单个请求消息。客户端可以在接收到响应的同时处理数据。
- 双向流(Bidirectional Streaming): 客户端和服务器都可以同时发送多个消息,客户端和服务器可以独立地读写数据。这种方法适用于实时通信和流式处理场景。
区别: 这些服务方法类型的区别在于数据流的方向和数量。单一请求-单一响应是最简单的,适用于普通的请求-响应场景。而客户端流和服务器流方法适用于需要流式处理的场景,它们可以在不同的时间发送多个请求或响应。双向流方法则支持客户端和服务器之间的双向流式通信,允许两端同时读写数据。
单一请求-单一响应是最简单的,适用于普通的请求-响应场景。而客户端流和服务器流方法适用于需要流式处理的场景,它们可以在不同的时间发送多个请求或响应。双向流方法则支持客户端和服务器之间的双向流式通信,允许两端同时读写数据。
选择服务方法类型应该根据实际需求来决定,根据数据流的方向和实时性要求来进行权衡。