gRPC 框架 简单使用(python版)

一、gRPC 简介

概述

gRPC是搭建分布式应用接口和客户端的框架。在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,可以更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务器相同的方法。

在这里插入图片描述

gRPC 客户端和服务器可以在各种环境中运行和相互通信——从 Google 内部的服务器到您自己的桌面——并且可以用任何 gRPC 支持的语言编写。例如,可以使用 Go、Python 或 Ruby 中的客户端轻松地调用在 Java 中创建 gRPC 服务器。



协议缓冲区

协议缓冲区, 是谷歌开源的结构化数据结构。

协议缓冲区中的数据和服务定义,可以参考:协议缓冲区

例如,在 proto 文件中定义 gRPC 服务,将 RPC 方法参数和返回类型指定为协议缓冲区消息:

// 定义服务
service Greeter {
	// 发送消息
	rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 包含用户名的请求消息
message HelloRequest {
	string name = 1;
}

// 包含问候的响应信息
message HelloReply {
	string message = 1;
}

使用在proto中定义的服务和数据结构,可以使用gRPC的插件来生成对应的grpc文件。



二、gRPC 的 Hello World

gRPC可以使用多种语言编写,下面使用python来实现一个简单的gRPC服务端和客服端。

一般来说写gRPC服务,需要三个文件:

  • .proto文件:用于生成gRPC服务文件。
  • server文件:定义 gRPC 服务端。
  • client文件:定义 gRPC 客户端,调用服务端接口。

基本环境如下:

  • python 3.10.2

在这里插入图片描述



协议缓冲区

定义协议缓冲区,新建一个hello.proto文件,写入以下内容:

syntax = "proto3";

package hello;

message User {
	string id = 1;
	string name = 2;
}

message Reply {
	string message = 1;
}

service UserInfo {
	rpc Info (User) returns (Reply) {}
}

这个文件首先定义了两个数据结构,一个是用户的详细信息User,一个是用户信息格式化输出。

需要注意的是当一个message中定义多个变量时,赋值的编号不能相同,如User中的id和name分别是1和2。

然后定义了一个简单的服务UserInfo,将User传入,最后返回Reply(注意是returns,加了s)

最后使用gRPC的工具包,生成gRPC服务类:

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./hello.proto

它会生成两个文件hello_pb2.pyhello_pb2_grpc.py.

大致可以理解为:_pb2中定义了数据结构。_pb2_grpc中定义了相关的方法。

具体的含义可以去看:生成代码参考



gRPC 服务端

如下,定义 gRPC 服务端hello_server.py,并堵塞监测本地50051端口,等待接收数据:

from concurrent import futures
import logging

import grpc
import hello_pb2
import hello_pb2_grpc

class UserInfo(hello_pb2_grpc.UserInfoServicer):
	def Info(self, request, context):
		return hello_pb2.Reply(message='id: %s; name: %s' % (request.id, request.name))

def serve():
	server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
	hello_pb2_grpc.add_UserInfoServicer_to_server(UserInfo(), server)
	server.add_insecure_port('[::]:50051')
	server.start()
	server.wait_for_termination()

if __name__ == '__main__':
	logging.basicConfig()
	serve()



gRPC 客户端

如下,定义 gRPC 客户端hello_client.py,通过接收参数,向本地50051端口,传输用户信息:

from __future__ import print_function

import logging, sys

import grpc
import hello_pb2
import hello_pb2_grpc


def run():
	with grpc.insecure_channel('localhost:50051') as channel:
		stup = hello_pb2_grpc.UserInfoStub(channel)
		response = stup.Info(hello_pb2.User(id=sys.argv[1],name=sys.argv[2]))
	print("用户信息: " + response.message)

if __name__ == '__main__':
	logging.basicConfig()
	run()



启动 gRPC

启动gRPC服务端 :

python hello_server.py

在另一个终端窗口中,启动gRPC客户端:

python hello_client.py 1 zhangsan

最后查看效果:

在这里插入图片描述





更多的用法可以参考:

gRPC 官方python教程

gRPC 官方API

协议缓冲区官方文档(需要魔法)

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
gRPC提供了针对多种编程语言的支持,包括Python。在Python使用gRPC,你可以使用gRPCPython库来构建客户端和服务器应用程序。 首先,你需要安装gRPCPython库。你可以使用pip命令运行以下命令进行安装: ``` pip install grpcio ``` 安装完成后,你就可以开始使用gRPC了。首先,你需要定义一个.proto文件来描述你的服务接口和消息类型。然后,使用gRPC的工具生成相应的Python代码。这些代码将包括用于客户端和服务器的Stub类、服务接口和消息类型。 在生成的代码中,你可以实现服务器的逻辑,并在客户端中使用Stub类来调用服务器提供的方法。gRPC使用Protocol Buffers作为默认的IDL,所以你需要编写.proto文件来定义你的接口和消息类型。 以下是一个简单示例,演示如何在Python使用gRPC: ```proto syntax = "proto3"; package mypackage; service MyService { rpc MyMethod(RequestMessage) returns (ResponseMessage) {} } message RequestMessage { string name = 1; } message ResponseMessage { string message = 1; } ``` 然后,使用protoc命令编译.proto文件并生成Python代码: ``` python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. myservice.proto ``` 生成的代码将包括myservice_pb2.py和myservice_pb2_grpc.py。你可以在其中找到自动生成的消息类型和服务接口。 接下来,在服务器端的代码中,你可以实现你的服务逻辑: ```python import grpc import myservice_pb2 import myservice_pb2_grpc class MyServiceServicer(myservice_pb2_grpc.MyServiceServicer): def MyMethod(self, request, context): response = myservice_pb2.ResponseMessage() response.message = "Hello, " + request.name return response def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) myservice_pb2_grpc.add_MyServiceServicer_to_server(MyServiceServicer(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': serve() ``` 在客户端的代码中,你可以使用Stub类调用服务器提供的方法: ```python import grpc import myservice_pb2 import myservice_pb2_grpc def run():
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力生活的黄先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值