Thrift—构建一个RPC实例(一)

简介: Thrift—构建一个RPC实例(一)

1. Apache Thrift IDL

   服务在接口定义语言(IDL)文件中定义。 服务接口是客户端和服务器之间通信的基础。Thrift IDL文件只是用Apache Thrift IDL编码的纯文本文件,并具有“ .thrift”扩展名。

   以下是一个IDL文件的例子:

service HelloSvc { #A
 string hello_func() #B
}

   该IDL文件声明了一个称为HelloSvc 的服务接口。HelloSvc有一个函数hello_func(),该函数不接受任何参数并返回字符串类型。

   为了将此接口转换为有用的代码,我们可以使用Apache Thrift IDL编译器对其进行编译。Apache Thrift编译器二进制文件在UNIX(如系统)上被称为“ thrift”,在Windows上被称为“ thrift.exe”。要运行编译器,需要向其传递IDL文件和目标语言来为其生成代码。 示例如下:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

20210527153548522.png

   每一步的解释如下:

#A 在命令行上调用Apache Thrift编译器,使用IDL文件进行编译,并使用“ -gen”开关指定要输出的语言,在这种情况下为Python。
#B 编译器为Python源文件创建一个“ gen-py”输出目录。
#C 输出目录包含一个与IDL文件同名的Python包。
#D constants.py文件包含IDL中的常量定义。
#E 编译器为IDL中定义的每个服务创建一个Python模块。
#F 编译器的Python生成器为每个服务创建一个Python测试客户端。
#G Python使用__init__.py文件将目录指定为Python包
#H ttypes.py文件包含源IDL中的用户定义类型。

2. 构建python服务端

   注:目前文章中Apache Thrift的代码不支持Python3.x。构建Python示例

需要Python 2.5 –2.7.x。

   示例如下:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

20210527153548522.png

       步骤解析如下:

#A 在这里,我们将生成的代码的位置添加到Python路径中,以便import语句可以找到它
#B 我们将使用Apache Thrift TCP / IP套接字模块公开我们的服务
#C 所有服务器执行逻辑将由内置的Apache Thrift Server驱动
#D IDL编译器生成的HelloSvc模块提供了我们所有应用程序特定的RPC代码
#E HelloHandler类是我们实现服务的地方
#F 编译器生成的服务处理器将客户端请求分派给我们的处理程序
#G 我们的监听套接字将使用端口8585
#H 服务器serve()方法运行服务器

   下面来逐行分析代码的实用。用Python编写Apache Thrift应用程序时,我们面临的第一个配置问题是Python在Python路径上的当前目录和目录中搜索要导入的软件包。IDL编译器生成的hello包位于gen-py目录下。为简单起见,我们导入标准的python sys模块,并将“ gen-py”附加到Python路径,以便我们可以直接从hello包中导入元素。

import sys
sys.path.append("gen-py")

   以这种方式将gen-py目录添加到路径是比较快速简便的,适合于开发和测试。如果从gen-py的父目录之外的其他位置运行示例,则需要在此处提供完整路径。在生产环境中,您可能会将生成的Python软件包安装在Python路径上已经存在的目录中,例如“ site-packages”目录,从而无需此代码。

   下一步是导入一些Thrift模块。

from thrift.transport import TSocket
from thrift.server import TServer

   Thrift库分为子包/目录。在这种情况下,我们从服务器包中导入服务器模块,从传输包中导入套接字模块。这将使我们能够使用TCP / IP套接字创建基本的RPC服务器进行通信。

    为我们的服务生成的IDL编译器存根代码放在与该服务同名的python文件中,并在与IDL文件同名的包中。我们将使用Thrift生成的服务器存根(在Apache Thrift中称为“处理器”)来调度来自客户端的服务调用。

      下面的代码从hello包中导入我们的服务模块HelloSvc.py。

from hello import HelloSvc

    现在,我们可以为HelloSvc服务实现处理程序。它实际上提供了服务方法的行为。处理程序“处理”来自客户端的RPC调用。

class HelloHandler:
  def hello_func(self):
    print("[Server] Handling client request")
    return "Hello thrift, from the python server"

   所有Service方法都必须在Handler类中表示,在这个例子中,是hello_func()方法。

   现在,我们可以构造并连接实现服务器所需的所有对象。

handler = HelloHandler()
processor = HelloSvc.Processor(handler)
listening_socket = TSocket.TServerSocket(port=8585)
server = TServer.TSimpleServer(processor, listening_socket)

   首先,我们创建处理程序的实例,然后将处理程序包装在由IDL编译器为我们生成的HelloSvc处理器中。处理器处理来自网络的调用,并调用正确的处理程序方法。接下来的TSocket模块TServerSocket类是用于监听端口8585上的连接。

   最后一部分是构造一个对象,以将所有这些功能组织到可运行的服务器中。 服务器必须使用侦听套接字来处理客户端连接,并在客户端请求进入时调用处理器。标准的TServer模块包含一个TSimpleServer类,它为我们解决了这一问题。TSimpleServer类具有一个运行服务器的关键方法serve()。

print ("[Server] Started")
server.serve()

   在命令行运行情况如下:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

   服务器启动来等待客户端请求。


   今天就看到这里,欢迎关注交流~

相关文章
|
16天前
|
Java Apache C++
别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码
Thrift 是一个轻量级、跨语言的远程服务调用框架,由 Facebook 开发并贡献给 Apache。它通过 IDL 生成多种语言的 RPC 服务端和客户端代码,支持 C++、Java、Python 等。Thrift 的主要特点包括开发速度快、接口维护简单、学习成本低和多语言支持。广泛应用于 Cassandra、Hadoop 等开源项目及 Facebook、百度等公司。
别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码
|
5月前
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
408 8
|
4月前
|
运维 Ubuntu Shell
阿里云云效操作报错合集之流水线构建Docker镜像时,遇到报错:“error: failed to solve: rpc error: code”,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
6月前
|
JSON JavaScript Java
性能工具之Jmeter压测Thrift RPC服务
【5月更文挑战第21天】性能工具之Jmeter压测Thrift RPC服务
104 1
|
6月前
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
137 1
|
Go 流计算
gRPC阅读日记(七)客户端的RPC构建2
gRPC阅读日记(七)客户端的RPC构建2
|
Java 编译器 API
Thrift-构建一个RPC实例(二)
Thrift-构建一个RPC实例(二)
Thrift-构建一个RPC实例(二)
|
6月前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
360 9
|
6月前
|
设计模式 负载均衡 网络协议
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
268 0
|
20天前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。