1. 什么是grpc?
gRPC(全称为Google Remote Procedure Call)是一种高性能、通用的开源远程过程调用(RPC)框架,由Google开发并在开源社区中发布。它支持多种编程语言,并提供强大的功能和性能优势。
gRPC使用Protocol Buffers(简称为ProtoBuf)作为接口定义语言(IDL),用于定义服务接口和消息类型。通过ProtoBuf,你可以定义服务的方法、输入参数和返回值的数据结构。
gRPC基于HTTP/2协议进行通信,采用二进制传输数据,具备高效、低延迟和带宽节省的特点。它支持多种传输方式,如TCP、TLS等,以及多种序列化格式,如ProtoBuf和JSON。
使用gRPC,你可以轻松定义和实现跨平台、跨语言的分布式系统,其中各个服务之间可以通过RPC进行通信。它广泛应用于微服务架构、分布式系统、云原生应用等领域,可以在不同的技术栈之间提供高效的通信和协作能力。
总结一下,gRPC是一个高性能、跨语言的远程过程调用框架,通过使用Protocol Buffers和HTTP/2协议,提供了快速、高效、可靠的跨网络通信能力
2. HTTP2 和 HTTP1 的区别?
HTTP/2(简称为H2)是HTTP协议的第二个主要版本,它是HTTP/1.1的升级版本。HTTP/2引入了许多新特性和改进,旨在提供更快、更高效的网络通信。
下面是HTTP/2与HTTP/1的一些主要区别:
- 多路复用:HTTP/2引入了多路复用的机制,允许在同一个TCP连接上同时发送多个请求和响应,避免了HTTP/1中的串行请求和阻塞等待的问题,提高了并发性能和效率。
- 二进制传输:HTTP/2使用二进制格式传输数据,取代了HTTP/1中的文本格式,减少了数据传输的大小和解析的复杂度,提高了传输效率。
- 头部压缩:HTTP/2使用了头部压缩技术,减少了请求和响应中的头部数据的大小,节省了带宽并提高了性能。
- 服务器推送:HTTP/2支持服务器主动推送资源给客户端,无需客户端明确请求,可以提前将相关资源推送给客户端,减少了客户端的请求次数和等待时间。
- 流量控制:HTTP/2引入了流量控制机制,可以根据接收端的处理能力来控制数据的传输速率,防止过载和拥塞。
- 安全性:虽然HTTP/2并不要求使用加密,但由于大部分HTTP/2实现都要求使用加密,因此普遍使用HTTPS作为传输协议,提供了更好的数据传输安全性。
综上所述,HTTP/2相比于HTTP/1具有更好的性能、效率和安全性,通过引入多路复用、二进制传输、头部压缩等技术,使得网络通信更快速、高效,并提供了更好的用户体验。
3. proto文件
.proto文件是Protocol Buffers(简称为ProtoBuf)的定义文件,它用于定义数据结构和消息格式。ProtoBuf是一种轻量、高效、语言无关的序列化数据格式,常用于跨平台数据交换和存储。
.proto文件使用ProtoBuf语言描述,它定义了消息的字段、类型和结构,类似于一种数据模型的定义。在.proto文件中,可以定义消息的字段名、字段类型、字段编号等信息,以及消息的嵌套结构、枚举类型等。
通过编译.proto文件,可以生成特定编程语言的代码文件,用于在不同编程语言之间进行数据的序列化和反序列化操作。生成的代码文件提供了数据访问和操作的方法,使得开发者可以方便地使用定义好的数据结构和消息格式。
.proto文件是跨语言的,可以通过使用不同的编译器和库来生成不同编程语言的代码。常见的编译器包括Google提供的protobuf编译器和第三方的编译器,支持的编程语言包括C++、Java、Python、Go、C#等。
总而言之,.proto文件是用于定义数据结构和消息格式的文件,通过编译生成特定编程语言的代码文件,用于实现数据的序列化和反序列化操作。它是ProtoBuf的核心组成部分,支持跨平台、跨语言的数据交换和存储。
4. 使用python3 建立服务端与客户端
- 安装所需库
pip install grpcio
pip install grpcio-tools
- 编写.proto文件
这是当前demo目录,我们创建了一个虚拟环境和proto文件夹,里面放我们的.proto文件。
example.proto 内容,简单定义了一个服务,服务里面有一个方法,定义了请求参数和返回参数格式
syntax = "proto3";
package your_package_name;
message YourRequest {
string name = 1;
}
message YourResponse {
string message = 1;
}
service YourService {
rpc YourRPCMethod (YourRequest) returns (YourResponse);
}
使用grpc_tools工具将.proto文件编译成py文件
python -m grpc_tools.protoc -I ./proto --python_out=. --grpc_python_out=. ./proto/example.proto
生成后默认在当前目录,此时目录结构应该就变成下面这样
- example_pb2_pb2.py:包含生成的消息类型的定义,你可以在代码中使用它们来构建请求和处理响应。
- example_pb2_grpc_grpc.py:包含生成的服务类和 Stub 类的定义,你可以在代码中使用它们来实现和调用 gRPC 服务。
然后我们新建客户端和服务端两个文件。
server.py
import grpc
from concurrent import futures
import example_pb2
import example_pb2_grpc
class YourService(example_pb2_grpc.YourServiceServicer):
def YourRPCMethod(self, request, context):
name = request.name
# 实现你的RPC方法逻辑
response = example_pb2.YourResponse()
response.message = "Hello, " + name
print('response', response)
# 设置响应值
return response
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
example_pb2_grpc.add_YourServiceServicer_to_server(YourService(), server)
server.add_insecure_port('[::]:50051') # 设置服务器监听的端口
print('开启服务')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
serve()
client.py
import grpc
import example_pb2
import example_pb2_grpc
def run():
channel = grpc.insecure_channel('localhost:50051') # 连接到服务器地址
stub = example_pb2_grpc.YourServiceStub(channel)
request = example_pb2.YourRequest()
request.name = 'zsc'
# 设置请求参数
response = stub.YourRPCMethod(request)
print('response', response)
# 处理响应
if __name__ == '__main__':
run()
先运行服务端,在运行客户端即可,服务端就会收到客户端的请求。