vlambda博客
学习文章列表

gRPC 101:在Python中运行Go代码

顾名思义,我们将用Golang编写函数定义,并从Python程序中调用该函数。对于一个人为什么要用一种语言编写功能并从另一种语言执行该功能,我听起来有些荒谬。但是,请相信我,您做的次数比您想象的要多。例如,当您以任何喜欢的编程语言或框架(例如Flask,Express,RoR等)编写后端API并在客户端中调用这些API时,这些API可以是Web App,Mobile App或 即使是多次使用不同于您的后端的语言编写的CLI。当您在客户端中调用API端点时,您实际上要做的是在服务器中执行一个函数,该函数是从客户端完成的。

现在,您已经了解了何时需要执行此函数的跨语言调用,下面将讨论有关RPC及其相对于以上REST API方法的优势的更多信息。

在RPC中,基本上发生的事情是客户端应用程序可以调用位于不同计算机上的服务器应用程序上的方法,就好像它是创建分布式应用程序和服务的本地对象一样。gRPC是Google开发的框架,使我们能够制作RPC应用程序。

此时您可能会想到两个问题:1。当您可信赖的REST正常工作时,为什么要使用RPC?2。为什么要用一种语言编写程序并从另一种语言执行程序?(尽管我已经在上面进行了解释,但更多的是讨论)

回答第一个问题,假设您正在构建一个高度可扩展的应用程序,例如Flipkart,现在作为这个庞大而复杂的电子商务网站的一部分,您将需要创建至少十二种服务,这些服务将执行库存管理,用户的购物车管理,付款,物流,建议,卖方业务逻辑等。如您所见,这些服务之间将存在很多相互依赖关系,例如付款服务将需要了解用户购物车中的信息,卖方将需要了解物流以及许多其他方面。其他这样的关系。假设您为每个服务编写一个REST API并相互交换端点。突然,您的Slack会收到大量消息,例如我应该在此API中传递哪些参数,以及关于如何更改Carts API中的一个参数使支付服务陷入困境的愤怒消息。随着服务数量的增加,复杂性也随之增加,这种方法的可伸缩性不是很高。为了解决这个问题,人们在后端使用RPC,这有助于简化这数十种服务之间的对话。正如我们将看到的Proto文件一样,它本身是关于进行RPC调用时发送的请求内容和响应内容的绝对事实。

回答第二个问题,某些编程语言在一项工作上要比其他语言更好地配备,例如在高频交易中,速度至关重要,因此您将始终使用高性能语言(如C ++)编写核心逻辑,现在此服务需要 与您的其他服务进行交互。因此,从业务角度来看,在不同的服务中使用不同的语言是有意义的。

可能您想过,请告诉我们代码。让我们开始编写代码。我们将编写一个基本程序,假定某人的Github用户名将返回其关注者列表。整个代码可以在我的github个人资料上访问。

下面给出了目录结构。

gRPC 101:在Python中运行Go代码

Directory Structure




我们先来看github.proto

gRPC 101:在Python中运行Go代码

原始文件是定义服务器和客户端之间要交换的功能的方式。如您所见,我们定义了一个名为GithubService的服务,并声明我们将拥有一个名为GetFollowers的函数,该函数将FollowerRequest作为参数并返回FollowerResponse作为响应。此处重复的关键字意味着我们打算将一个字符串数组作为类型。在字符串github_username = 1中,数字1表示在序列化和反序列化过程中的标识符。在REST中,通常将数据作为JSON传递,但在gRPC中,数据以称为protobuf的二进制格式传递。

我们无法直接使用此原型文件来制作客户端和服务器文件,我们首先需要将该原型文件转换为实际代码。gRPC支持多种语言,您可以通过访问其网站进行检查。您将需要Python和Go所需的编译器,以分别将此原型文件编译为Python和Go代码。安装后,您可以运行以下命令来生成文件。

将自动生成的文件将为github.pb.go,github_pb2.py,github_pb2_grpc.py

现在,让我们在Golang中实现实际代码。

我将不介绍GetFollowers函数的实现,这只是对github API的正常调用以获取数据。

gRPC 101:在Python中运行Go代码

server.go




在这里,在主要功能中,我们只是使用由protoc编译器生成的代码注册服务器。我们在localhost:50051提供服务器。您只需要编写标准样板代码即可使服务器运行。

现在,让我们用Python编写客户端代码。

gRPC 101:在Python中运行Go代码

sys.path.insert(1,'/ home / jigar / grpc')语句只是为了我们可以为当前目录之外的目录导入文件。

我们正在导入由python grpc编译器生成的文件。我们在localhost:50051上连接到服务器,并在服务器上调用GetFollowers函数。同样,您会在这里找到一些样板代码来建立客户端和服务器之间的实际连接。

现在来看结果,让我们同时运行客户端和服务器。

因此,我们已成功调用了由python程序在Go中实现的函数。您也可以在python中实现相反的实现,然后在Go中调用。例如,我也在Go中建立了一个客户端。您可以在上面链接的存储库中查看。

(本文翻译自Jigar Chavada的文章《gRPC 101 : Run your Go Code in Python》,参考:https://medium.com/@chavada.jigar.3/grpc-101-run-your-go-code-in-python-1aab3df732)

部分文字与图片来源于网络,如有版权请联系删除!