Python gRPC 与跨语言 gRPC 调用

本文详细介绍了如何使用Python进行gRPC入门,包括安装gRPC Python组件、编写proto文件、实现服务端和客户端。接着,文章展示了Python调用Golang和Golang调用Python的跨语言gRPC调用过程,强调了gRPC的强大之处在于其跨语言的兼容性。最后,作者以幽默的方式表达了在这个季节中的感慨。
摘要由CSDN通过智能技术生成

Python gRPC 与跨语言 gRPC 调用

本文是我上一篇文章《 Go 微服务基础:Protobuf & gRPC》的延伸,在开始本文前,建议先看一看那篇文章。

在《 Go 微服务基础:Protobuf & gRPC》一文中,我们介绍了 protobuf 的基础。随后定义了一个 userinfo proto 作为接口,实现了一套 Golang 版本的服务端、客户端。

本文中,我们继续使用那个 userinfo proto 作为接口,去实现一套 Python 版本的服务端、客户端,在实例中入门 Python gRPC 使用。然后,我们做一个有意思的尝试 —— Golang 与 Python 版本客户端、服务端的跨语言调用。

Python gRPC 入门

首先,我们了解一下如何配置 Python 的 gRPC 环境,如何把 proto 文件编译出 Python 接口,如何实现服务端、客户端。

安装 gRPC Python

安装 gRPC Python 组件:

pip3 install grpcio
pip3 install grpcio-tools

编写 proto 生成接口

编写 proto 文件,这里我们直接复制《 Go 微服务基础:Protobuf & gRPC》一文中的 proto:

syntax = "proto3";

package proto;

// 用户信息请求参数
message UserRequest {
  string name = 1;
}

// 用户信息请求响应
message UserResponse {
  int32 id = 1;
  string name = 2;
  int32 age = 3;
  repeated string hobby = 4;
}

// 用户信息接口
service UserInfo {
  // 获取用户信息,请求参数为 UserRequest,返回响应为 UserResponse
  rpc GetUserInfo (UserRequest) returns (UserResponse) {}
}

编译。注意是使用 grpc_tools.protoc 这个 Python 专用的编译器,而不是使用 protoc 哦:

python3 -m grpc_tools.protoc  -I . --python_out=. --grpc_python_out=. ./userinfo.proto

会生成两个文件:

  • userinfo_pb2.py:请求、响应数据结构的定义的类:(proto 文件中的 message)
    • UserRequest
    • UserResponse
  • userinfo_pb2_grpc.py:服务端、客户端的定义的类:(proto 文件中的 service)
    • UserInfoServicer:服务端
    • UserInfoStub:客户端

注:这里文件名里的 pb2 和 protobuf 语法的版本(syntax = "proto3")没关系。这个 pb2 只是表示是用的 Protocol Buffers Python API 版本为 2。

服务端实现

查看 userinfo_pb2_grpc.py 里生成的代码可以知道,Python gRPC 的服务实现是写一个子类去继承 proto 编译生成的 userinfo_pb2_grpc.UserInfoServicer ,在子类中实现 RPC 的具体服务处理方法。

from concurrent import futures

import grpc

import userinfo_pb2
import userinfo_pb2_grpc


class UserInfoServicer(userinfo_pb2_grpc.UserInfoServicer):
    """UserInfoServicer 具体实现 userinfo_pb2_grpc.UserInfoServicer,处理 RPC 服务
    """

    def GetUserInfo(self, request, context):
        """获取用户信息,请求参数为 UserRequest,返回响应为 UserResponse
        """
        name = request.name

        # Fake query
        if name == 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值