Thrift-构建一个RPC实例(二)

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

之前详细说明了一个服务端的示例 Thrift—构建一个RPC实例(一)

今天来看一下客户端的示例流程:


1. 构建一个python客户端

   在hello服务器所在的目录中编写一个Python客户端代码,以查看Apache Thrift RPC的客户端。我们的客户只需调用单独服务方法,显示结果并退出即可。示例如下:

import sys
sys.path.append("gen-py")
from thrift.transport import TSocket
from thrift.protocol import TBinaryProtocol        #A
from hello import HelloSvc
socket = TSocket.TSocket("localhost", 8585)
socket.open()                                      #B
protocol = TBinaryProtocol.TBinaryProtocol(socket) #C
client = HelloSvc.Client(protocol)                 #D
msg = client.hello_func()                          #E
print("[Client] received: %s" % msg)

步骤释义如下:

#A 二进制协议是几种Apache Thrift序列化协议之一
#B open命令将客户端套接字连接到本地主机上端口8585上的服务器
#C 二进制协议将读写连接的套接字
#D 编译器为HelloSvc生成的客户端存根将通过二进制协议发送其所有请求
#E Client对象使调用远程函数像调用本地函数一样容易

详细过程分析:

   如上图代码所示,我们再次将gen-py目录添加到Python路径以支持hello包导入。我们的客户需要Thrift Python库中的两个类。第一个是thrift.transport包中的TSocket模块中的TSocket类。

   用Apache Thrift术语来说,TSocket是一种传输类型,传输是将字节移动到目标的对象。我们准备使用要连接的主机和端口来初始化TSocket,并在准备与服务器建立连接时调用套接字的open()方法。

   我们还需要thrift.protocol软件包中TBinaryProtocol模块中的TBinaryProtocol类。Thrift序列化协议将Thrift IDL类型转换为字节流。协议依赖于传输来传输字节,但与所提供的特定传输类型无关。这允许协议通过简单地切换传输就可以序列化到内存,磁盘或网络设备。

   默认情况下,Apache Thrift服务器使用二进制协议。客户端和服务器必须使用相同的协议/传输堆栈才能成功通信。Apache Thrift生成的客户端代码未提供默认协议,因此我们必须显式创建一个TBinaryProtocol对象以在此处使用。

   IDL编译器生成的HelloSvc.py模块包含一个Client类,该类充当远程服务的代理。在构造了客户端对象并为其提供协议对象之后,我们可以通过客户端代理对服务进行调用。在Client对象上调用hello_func()方法将使用二进制协议序列化我们的调用请求,并将其通过套接字传输到服务器。

   服务器使用处理程序执行我们的请求,并返回“ Hello Thrift”字符串。客户端套接字接收字节并将其传递给二进制协议,该协议对该字符串反序列化,返回一个字符串,然后显示该字符串。

   运行结果:

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

   尽管比运行的hello world程序要有多得多的工作,但几行IDL和Python使我们能够使用有效的客户端和服务器来创建与语言无关,与操作系统无关和与平台无关的服务API。


2. 构建一个Java客户端

   最后,让我们组装一个Java客户端。我们的第一步是为我们的服务生成Java存根。

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

#A -gen开关java参数使编译器发出指定IDL的Java代码。
#B 编译器生成单个源文件,其中包含支持IDL所需的所有代码用Java构造。

   与IDL一起运行时,IDL编译器Java代码生成器仅输出一个文件。HelloSvc.java文件包含Java HelloSvc类。 客户端和服务器存根类嵌套在该类中。

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.TException;
public class HelloClient {
  public static void main(String[] args) throws TException {
    TSocket socket = new TSocket("localhost", 8585);
    socket.open();
    TBinaryProtocol protocol = new TBinaryProtocol(socket);
    HelloSvc.Client client = new HelloSvc.Client(protocol);
    String str = client.hello_func();
    System.out.println("[Client] received: " + str);
  }
}

运行情况:

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

#A 编译Java源代码,将Apache Thrift和SLF4J jar添加到类路径
#B HelloSvc类文件保存在gen-java目录中
#C HelloClient类文件在当前目录中创建
#D 将gen-java和当前目录添加到类路径以运行客户端

   Java客户端和python客户端整体的实现思路类似,就不再重复,可以参考python客户端的实现思路来理解Java客户端的实现过程。


3. 总结

   通过前面的操作和介绍,我们便实现了由一个python服务端处理两个不同语言客户端的demo。这便是thrift分布式应用的基础。之后再继续深入介绍。欢迎关注交流~

相关文章
|
6天前
|
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功能的有效性。
389 7
|
4月前
|
运维 Ubuntu Shell
阿里云云效操作报错合集之流水线构建Docker镜像时,遇到报错:“error: failed to solve: rpc error: code”,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
6月前
|
JSON JavaScript Java
性能工具之Jmeter压测Thrift RPC服务
【5月更文挑战第21天】性能工具之Jmeter压测Thrift RPC服务
100 1
|
6月前
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
135 1
|
Go 流计算
gRPC阅读日记(七)客户端的RPC构建2
gRPC阅读日记(七)客户端的RPC构建2
|
6月前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
348 9
|
6月前
|
设计模式 负载均衡 网络协议
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
253 0
|
9天前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
3月前
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC