Skip to main content

帮助模块轻松构建 GRPC 服务

项目描述

简易 GRPC

Python (>=3.7) GRPC 服务助手库。

安装

我们建议创建一个虚拟环境。

python3.7 -m venv ./venv
source venv/bin/activate
python  -m pip install --upgrade pip

安装模块:

pip install easy-grpc

使用示例

Easy GRPC 帮助您通过三个步骤创建 GRPC 服务:

  1. 定义和编译你的 proto 文件
  2. 实施行动
  3. 配置并运行 GRPC 服务

1. 定义和编译你的 proto 文件

在示例文件夹中,有一些从grpclib存储库中提取的文件,当前用于运行此服务。您可以找到helloworld.proto和相关编译的 python 文件(helloworld_pb2.pyhelloworld_grpc.py)。

syntax = "proto3";

package example.helloworld;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

要定义服务,您必须按照官方文档grpc.io中的说明创建原始文件。

要自己编译 proto 文件,只需从根目录执行此命令即可。

python -m grpc_tools.protoc \
  --proto_path=. \
  --python_out=. \
  --python_grpc_out=. \
  ./example/helloworld.proto

注意:注意python_grpc_out参数。这在grpc_tools.protoc库中不是标准的,它是grpclib 特定的。

2. 实施行动

在 helloworld.proto 文件中声明了一个 rpc 函数(您可以声明更多)。您应该为每个 rpc 创建一个动作,处理定义的输入消息 (HelloRequest) 并返回相关的返回消息 (HelloReply)。

在示例的情况下,创建了 helloworld_action.py:

from easygrpc import Action
from .helloworld_pb2 import  HelloReply


class Hello(Action):
    async def execute(self, hello_request=None):
        return HelloReply(message=f'Hello {hello_request.name}!')

Action是一个继承了 easygrpc.action.Action 抽象基类的 Class ,必须覆盖 execute 方法。

3.配置并运行GRPC服务

最后要运行服务,您将创建一个配置文件,用于配置和运行服务。

[SERVER]
server = example.helloworld_grpc.GreeterBase
client = example.client.SendRequest
host = 127.0.0.1
port = 50051

[ACTIONS]
SayHello = example.helloworld_action.Hello

ACTIONS部分,您应为每个 rcp 函数声明一个操作。当然,您可以声明更多可以使用和公开的已定义 rpc。

要运行该服务,只需打开一个终端,然后:

source venv/bin/activate
python -m easygrpc.start

要执行客户端,请打开另一个终端,然后:

source venv/bin/activate
python -m easygrpc.start -c

您应该看到来自服务的响应:

Hello Mr. Easy!

数据库交互

在每个实施的操作中,您都可以访问 PostgreSQL 数据库客户端库 ( asyncpg )。在配置文件中,您定义 PostgreSQL 连接参数。并且在action实现中你可以执行SQL命令与数据库进行交互。

创建一个名为“easy”的 postgreSQL(版本 9.2 到 10)数据库。

sudo -u postgres createdb -E UTF8 easy

然后创建一个新表:

CREATE TABLE public.messages
(
    id serial,
    text character varying,
    PRIMARY KEY (id)
);

并插入一行:

INSERT INTO public.messages(text) VALUES ('Hello PostgreSQL!');

添加以下配置部分:

[POSTGRESQL]
user = postgres
password = postgres
database = easy
host = localhost
port = 5432

修改 Hello Action (example/helloword_action.py):

from easygrpc import Action
from .helloworld_pb2 import  HelloReply


class Hello(Action):
    async def execute(self, hello_request=None):
        rec = await self.conn.fetchval("""
            SELECT row_to_json(t)
            FROM (
                SELECT
                    text as message
                FROM public.messages
                WHERE
                    id = $1
            ) as t
        """, 1)
        if rec is not None:
            return self.encode(rec, HelloReply)
        return None

要运行该服务,只需打开一个终端,然后:

source venv/bin/activate
python -m easygrpc.start

要执行客户端,请打开另一个终端,然后:

source venv/bin/activate
python -m easygrpc.start -c

具有多个服务的示例

你当然可以在你的 proto 文件中声明一个以上的服务和客户端:

syntax = "proto3";

package example.helloworld;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

服务GreeterDB { rpc SayHello ( HelloRequest )返回( HelloReply ) {} }  
       

在这种情况下,config.ini文件会有点不同:

[POSTGRESQL]
user = postgres
password = postgres
database = easy
host = localhost
port = 5432

[服务器]
服务器= example.helloworld_grpc.Greeter,  
    example.helloworld_grpc.GreeterDB
客户端= example.client.SendRequest,  
    example.client.SendRequestDb
主机= 127.0.0.1  
端口= 50051  

[行动]
Greeter.SayHello = example.helloworld_action.Hello  
GreeterDB.SayHello = example.helloworld_action.HelloDb  

注意操作部分。键是使用点符号定义的,以标识哪个服务器与给定的操作一起使用。

客户端也可以是多个(参见 ./example/client.py):

import asyncio

from grpclib.client import Channel

# generated by protoc
from .helloworld_pb2 import HelloRequest, HelloReply
from .helloworld_grpc import GreeterStub, GreeterDBStub


async def SendRequest(channel):
    greeter = GreeterStub(channel)

    reply = await greeter.SayHello(HelloRequest(name='Mr. Easy'))
    print(reply.message)

    channel.close()

async def SendRequestDb(channel):
    greeter = GreeterDBStub(channel)

    reply = await greeter.SayHello(HelloRequest(name='Mr. PostgreSQL'))
    print(reply.message)

    channel.close()

运行服务与启动单个服务实例相同:

source venv/bin/activate
python -m easygrpc.start

相反,要执行客户端,您可以选择要运行的客户端:

source venv/bin/activate
python -m easygrpc.start -c example.client.SendRequestDb

注意: 如果客户端没有作为参数给出,则执行第一个

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

easy-grpc-0.0.1b5.tar.gz (10.2 kB 查看哈希

已上传 source

内置分布

easy_grpc-0.0.1b5-py3-none-any.whl (12.2 kB 查看哈希

已上传 py3