帮助模块轻松构建 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 服务:
- 定义和编译你的 proto 文件
- 实施行动
- 配置并运行 GRPC 服务
1. 定义和编译你的 proto 文件
在示例文件夹中,有一些从grpclib存储库中提取的文件,当前用于运行此服务。您可以找到helloworld.proto和相关编译的 python 文件(helloworld_pb2.py和helloworld_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
注意: 如果客户端没有作为参数给出,则执行第一个
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。