Как я могу реализовать динамические соединения с gRPC в Python?Python

Программы на Python
Ответить
Anonymous
 Как я могу реализовать динамические соединения с gRPC в Python?

Сообщение Anonymous »

Я работаю над проектом с использованием Docker, в котором мне нужно динамически скомпилировать протофайл gRPC, а затем создать соединение и отправить запрос на сервер, используя метод, определенный в указанном протофайле. Я получаю информацию от службы Selector, которая возвращает, какой инструмент/службу gRPC следует использовать (это основано на UDDI). Полученная информация содержит следующее:

Код: Выделить всё

message GetServiceResponse {

string service_name = 1;
string service_ip = 2;
string service_port = 3;
string proto_file = 4; # protofile in base64

}
Мне удалось правильно скомпилировать и сгенерировать файлы gRPC, но я не знаю, как мне продолжить дальше.
Я пытался создайте модуль таким образом. Файлы gRPC генерируются в /app/generated/{service_name, а затем я пытаюсь сгенерировать модуль.

Код: Выделить всё

def _create_grpc_stub(self, service_name: str, service_ip: str, service_port: str):
module = __import__(f'generated.{service_name}')
service_class = getattr(module, service_name)
channel = grpc.insecure_channel(f'{service_ip}:{service_port}')
config.logger.debug(f"Stub created for '{service_name}'")
return service_class(channel)

def select_tool(self, query: str):
#...
config.logger.debug("Creating service STUB...")
stub = self._create_grpc_stub(
service_name=result.service_name,
service_ip=result.service_ip,
service_port=result.service_port
)
Я получаю следующую ошибку:

Код: Выделить всё

2024-11-05 13:15:28 2024-11-05 12:15:28,980 [ERROR]  Error processing selection of tool: 'module' object is not callable
2024-11-05 13:15:28 2024-11-05 12:15:28,980 [ERROR]  Exception serializing message!
2024-11-05 13:15:28 Traceback (most recent call last):
2024-11-05 13:15:28   File "/usr/local/lib/python3.12/site-packages/grpc/_common.py", line 89, in _transform
2024-11-05 13:15:28     return transformer(message)
2024-11-05 13:15:28            ^^^^^^^^^^^^^^^^^^^^
2024-11-05 13:15:28 TypeError: descriptor 'SerializeToString' for 'google._upb._message.Message' objects doesn't apply to a 'NoneType' object
Кроме того, я не знаю, правильный ли этот подход. В поисках способов реализации этого я наткнулся на gRPC Reflection, рассматривал этот пример и задавался вопросом, может ли он быть мне каким-либо полезен. Выглядит достаточно просто, но я не могу найти способ реализовать это в своем проекте, поскольку мне нужно динамически добавлять сервисы.
РЕДАКТИРОВАТЬ:
После некоторой проверки этого клиента gRPC с отражением я думаю, что его можно использовать для этого конкретного случая, единственное, что мне нужно, это способ вызова указанных методов, потому что я не знаю, как это сделать, как в примере. не сделано, и проверка документов тоже не помогла. Я нашел интерфейс командной строки gRPC, который делает это, но мне нужен способ сделать это с помощью кода Python. Использование CLI кажется мне слишком сложным.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»