Как написать клиента gRP C в Python для службы gRP C, написанной в Java - PullRequest
0 голосов
/ 07 мая 2020

Я не могу двигаться дальше в этом замешательстве, потому что не знаю, что делать. Большинство руководств в Python получают имя основного класса, в котором определен метод, не знаете, как это сделать, когда вам просто нужно написать клиента.

1 Ответ

2 голосов
/ 14 мая 2020

Я подозреваю, что вы новичок или программист среднего уровня, поэтому я был бы очень удивлен, если бы вам поручили или попытались выполнить что-то столь же сложное, как написание своего собственного gRP C клиента. Я предполагаю, что вы на самом деле просто хотите читать данные из службы Java gRP C, и вы читали об использовании клиента Python gRP C, но не знаете, как это сделать.

Упрощенный пример клиента.

Во-первых, давайте поговорим о том, как может работать клиент . Представьте себе, что вы пишете класс Python, например

class MyClient:
    def __init__(self, address, port):
        self.address = address
        self.port = port
        // create a grpc channel

    def connect(self):
        // connect the channel

    def read(self):
        // read the channel

Затем в своей основной функции вы должны создать экземпляр этого клиента, используя его для подключения и чтения (или записи) сообщений. Таким образом, клиент - это просто объект, который выполняет грязную работу по подключению к какому-либо месту и чтению сообщений по сети за вас.

Итак, приведенный выше пример является плохим, потому что это не совсем то, как gRP C работает. Но я решил, что будет легче понять более традиционный пример подключения и чтения. И теперь вы видите связь между вашей основной функцией и универсальным c клиентом.

Итак, как gRP C вписывается в это?

Вся идея gRP C в том, что вы не должны писать клиента! Взгляните на это по шагам следующим образом:

  1. Кто-то начал с написания файла .proto, который «определяет» их службу. Они определили, какие типы конечных точек будет у этой службы, например, getThings(), doThat().

  2. Затем они использовали программу или плагин (grp c - java) до сгенерировать a в основном -finished Java application. Незавершенные части: именно то, что делают getThings() и doThat().

  3. Они заполнили этот код ... и готово! grp c - java сгенерировал для них весь код сервера, поэтому их служба уже запущена и работает.

  4. Теперь вы хотите читать из этого service, но в Python.

  5. Вам просто нужно взять тот же файл .proto, который они использовали для создания службы Java, и следовать эти шаги с по создают клиента . Итак, вы видите, как они использовали программу для генерации большей части своей службы Java, вы также собираетесь использовать программу для генерации клиента для этой службы! (И даже не «большинство». Он генерирует полностью работающего клиента.)

    python -m grpc_tools.protoc --python_out=. --grpc_python_out=. your_java_service_proto_file.proto
    
  6. В своей основной функции вы просто создаете экземпляр этого сгенерированного клиента (с указанием IP-адреса и портировать на службу Java), и вам хорошо go!

    channel = grpc.insecure_channel('10.123.123.123:54321')
    stub = the_generated_thing.RouteGuideStub(channel)
    things_from_java_service = stub.getThings()
    

Резюме и один из способов взглянуть на него, хотя и не точный: )

Думайте о gRP C как о наборе программ , написанных https://grpc.io/, которые генерируют код для всех.

Кто-то определил служба в файле .proto затем использовала одну из этих программ gRP C (grp c - java в вашем случае) для создания большинства сервера. Затем они реализовали остальное и развернули этот сервер.

Теперь любой , как вы, может передать тот же файл .proto через другую программу gRP C (grp c - python в вашем случае) для создания полнофункционального клиента на любом языке по вашему выбору. Вы загружаете этот сгенерированный клиент в свою основную функцию, и вы готовы взаимодействовать с сервером на другой стороне.

...