python 3 使用 grpc

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 建立服务端与客户端

  1. 安装所需库
pip install grpcio
pip install grpcio-tools
  1. 编写.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

生成后默认在当前目录,此时目录结构应该就变成下面这样

  1. example_pb2_pb2.py:包含生成的消息类型的定义,你可以在代码中使用它们来构建请求和处理响应。
  2. 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()

先运行服务端,在运行客户端即可,服务端就会收到客户端的请求。
请添加图片描述
请添加图片描述

4. flask 和 Django框架待记录。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本门课程是带大家进入微服务领域入门的课程,很适合新手小白学习的课程。1: 什么是rpc?RPC(Remote Procedure Call)是函数对函数的远程调用,传输协议tcp,http,主要是基于xml,json序列化协议(这里的序列化协议是对数据编解码的方式),项目中我们真正用到的是grpcgrpc是一个框架,基于http2.0的长链接,性能有所改进,重要的是grpc用的是Google开源的protobuf序列化协议,它比json,xml性能更快,在压缩数据方面也更小。总之我们选择grpc最主要的有两点:1:支持跨语言开发(如python,golang,java)2:  grpc首先是一个框架,封装rpc,让程序员只关注代码逻辑即可 2: 为什么用grpc,而不用flask,django,tornado,即http协议?1:http的调用是根据url的(即restful),它跟rpc的调用最大的区别就是这里,rpc的调用,你就像调用一个本地函数一样简单,而且微服务,分布式也是从rpc开始的,学好rpc对以后做好分布式会更有帮助,其实go语言和python语言里都有rpc(如xmlrpc,jsonrpc,zerorpc),我们之所以学习go语言里的rpc是因为go语言的rpc相对更加灵活,go语言本身也支持高并发,这一点对于分布式来说更好。2:其次http协议,用过flask框架的人都知道,请求一次数据后就断开,而grpc基于http2.0,它不但可以保持长链接,传输效率也更高,使用方面,因为http2.0相当于tcp一样使用,现在很多大厂也都开始用http2.0了。http2.0相比http的优势很明显,头部压缩,分流,针对tcp的多路复用。所以基于http2.0的grpc无论从生态和性能方面都更好。 这张图是一个gRPC相关的架构图,同学们可以通过这张图了解gRPC在项目中的使用
Python使用gRPC是一种方便的方式来构建分布式系统和微服务。gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言(IDL)来定义服务接口和消息格式。 要在Python使用gRPC,首先需要安装gRPC库。可以使用pip命令进行安装: ``` pip install grpcio ``` 安装完成后,可以开始编写gRPC服务和客户端代码。首先需要定义服务接口和消息格式,这可以通过编写.proto文件来完成。然后使用gRPC提供的工具将.proto文件编译成Python代码。 接下来,可以编写服务端代码。在服务端代码中,需要实现.proto文件中定义的服务接口,并提供相应的方法来处理客户端请求。 最后,可以编写客户端代码来调用服务端提供的方法。客户端代码需要创建一个gRPC通道,并使用通道创建一个stub对象,然后可以通过stub对象调用服务端提供的方法。 下面是一个简单的示例代码,演示了如何在Python使用gRPC: ```python # 导入所需的模块 import grpc import helloworld_pb2 import helloworld_pb2_grpc # 创建一个gRPC通道 channel = grpc.insecure_channel('localhost:50051') # 创建一个stub对象 stub = helloworld_pb2_grpc.GreeterStub(channel) # 调用服务端提供的方法 response = stub.SayHello(helloworld_pb2.HelloRequest(name='Alice')) # 打印服务端返回的结果 print(response.message) ``` 以上代码中,假设服务端提供了一个名为`SayHello`的方法,客户端通过创建一个stub对象来调用该方法,并传递一个`HelloRequest`对象作为参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值