如何在 Python 中为在 Java 中编写的 gRPC 服务编写 gRPC 客户端

How to write a gRPC client in Python for a gRPC service written in Java

我无法继续前进,因为我不知道该怎么办。 Python 中的大多数教程都在定义方法的地方获得主要的 Class 名称,当您只需要编写客户端时不确定如何去做。

我怀疑您是初学者或中级程序员,所以如果您负责或尝试编写 自己的 gRPC 客户端这样复杂的任务,我会感到非常惊讶.我的猜测是您实际上只想从 Java gRPC 服务读取数据,并且您已经阅读了有关使用 Python gRPC 客户端的信息,但您对如何执行此操作感到困惑。

客户端的简化示例。

首先,让我们谈谈 客户端 的工作原理。想象写一个 Python class 像

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

然后在您的主要功能中,您将创建此客户端的一个实例,使用它来连接和读取(或写入)消息。所以客户端只是一个对象,它完成连接到某个地方并为您读取离线消息的肮脏工作。

现在,上面是一个糟糕的例子,因为 gRPC 并不是这样工作的。但我认为更传统的连接和读取示例会更容易理解。现在您看到了主函数和通用客户端之间的连接。

那么,gRPC 如何融入其中?

gRPC 背后的整个想法是您不必 编写客户端!按照这样的步骤看:

  1. 有人开始编写一个 "defined" 他们服务的 .proto 文件。他们定义了该服务的端点类型,例如 getThings()doThat().

  2. 然后他们使用一个程序或插件(grpc-java)来生成一个mostly -完成 Java 申请。未完成的部分是:正是 getThings()doThat() 所做的。

  3. 他们填写了那个代码……完成了! grpc-java 为他们生成了整个服务器代码,所以他们的服务已经启动 运行.

  4. 现在想从这个服务读取,但是在Python.

  5. 只需要获取他们用来生成 Java 服务的同一个 .proto 文件,然后按照 these steps 生成一个客户端。所以你看,就像他们使用程序生成大部分 Java 服务一样,你也将使用程序为该服务生成客户端! (甚至 "most." 它都不能生成功能齐全的客户端。)

    python -m grpc_tools.protoc --python_out=. --grpc_python_out=. your_java_service_proto_file.proto
    
  6. 在您的主要功能中,您只需创建该生成的客户端的实例(为 Java 服务指定 IP 地址和端口),就可以开始了!

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

一个总结,以及一种看待它的方式,虽然不准确 :)

将 gRPC 视为 程序套件 https://grpc.io/ 编写,为每个人生成代码。

有人在 .proto 文件中定义了一项服务,然后使用其中一个 gRPC 程序(在您的情况下为 grpc-java)生成了服务器的 most。然后他们实施了其余部分并部署了该服务器。

现在,像你这样的任何人 都可以通过 另一个 gRPC 程序(grpc-python 在您的案例)以您选择的语言生成功能齐全的客户端。您在主函数中加载这个生成的客户端,并准备好与另一端的服务器进行交互。