thrift源码浅析

简介

Thrift是一个轻量级的、独立于语言的软件栈,用于点到点RPC实现。Thrift为数据传输、数据序列化和应用程序级处理提供了清晰的抽象和实现。代码生成系统使用一种简单的定义语言作为输入并生成跨编程语言的代码,这些代码使用抽象堆栈来构建可互操作的RPC客户端和服务器。
在这里插入图片描述
Thrift使得用不同编程语言编写的程序可以很容易地共享数据和调用远程过程。由于支持28种编程语言,Thrift很可能支持您当前使用的语言。
Thrift专门用于支持跨客户机和服务器代码的非原子版本更改。这允许你升级你的服务器,同时仍然能够服务老客户端;或者让较新的客户机向较旧的服务器发出请求。

server模型

TSimpleServer: 单线程服务器端,使用标准的阻塞式I/O。
TThreadedServer: 为每个 client 请求创建单独的线程进行I/O和业务处理。
TThreadPoolServer: 服务启动时创建线程池,其他和TThreadedServer一样。
TNonblockingServer:用libevent做事件通知,分为IOThread(调用系统I/O)和workthread(执行服务函数)。

nonblocking模式 流程解析

idl

namespace cpp demo

struct Request {
    1:i32 id;
    2:i64 timestamp;
    3:i64 latency_us;
    4:string payload;
}
    
struct Response {
    1:i32 id;
    2:i32 status;
    3:i64 timastamp;
    4:string payload;
}
service EchoService {
    Response Echo (1:Request request);
}

图不规范,仅为自己梳理代码

client端

伪代码

new TSocket(ip, port_));
if (nonblocking) {
        new TFramedTransport(TSocket);
} else {
        new TBufferedTransport(TSocket);
 }
 new TBinaryProtocol(TTransport);
 //EchoServiceClient是idl生成的client
 new EchoServiceClient(protocol_);
 client_->Echo(resp, req);

类图

在这里插入图片描述

流程图

在这里插入图片描述

Server端

代码

class EchoServiceHandler : public EchoServiceIf {
public:
	void Echo(Response& _return, const Request& request) {
		_return.payload = request.payload;
	}
};
std::shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(thread_nums_);
threadManager->threadFactory(std::make_shared<ThreadFactory>());
threadManager->start();
std::shared_ptr<TNonblockingServerSocket> tServerSocket = std::make_shared<TNonblockingServerSocket>(port_);
tServerSocket->setAcceptBacklog(65535);
TNonblockingServer* server_ = new TNonblockingServer(
            std::make_shared<xcloud::EchoServiceProcessor>(std::make_shared<EchoServiceHandler>()),
            (std::make_shared<EchoServiceHandler>()),
            std::make_shared<TBinaryProtocolFactory>(),
            tServerSocket,
            threadManager); 
server_->setNumIOThreads(iothread_nums_);
server_->serve();

一些类的说明

TProcessor:处理器是一个通用对象,它作用于两个数据流,一个是输入,另一个是输出。这个对象的定义是松散的,但典型的情况是用于生成对输入流的响应或将数据从一个管道转发到另一个管道的某种服务器。
就是通过TProcessor调用服务函数,TProcessor管理服务函数。
TServerEventHandler:虚拟接口类,可以处理来自服务器核心的事件。要使用它,您应该继承它并实现您所关心的方法。您的子类还可以存储您关心的本地数据,例如这些方法的附加“参数”(存储在对象实例的状态中)。
算是个钩子吧,Server端每一步流程都用调用TServerEventHandler相关函数。

类图

在这里插入图片描述

时序图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Thrift源码解析是通过分析Thrift框架的源代码来了解其内部工作原理和实现细节的过程。在这个过程中,我们可以深入了解Thrift框架中各个模块的功能和相互关系,以及具体的实现方式。 引用中提到了一篇博客文章《Thrift源码解析--Transport传输层分析》,该博客对Thrift框架中Transport传输层的实现进行了详细解析。传输层是Thrift框架中负责网络传输和数据序列化的模块,它定义了一系列的传输协议,如TBinaryProtocol、TCompactProtocol等,并提供了相应的传输方式,如TTransport、TServerTransport等。在这篇博客中,作者对Transport传输层的各个子模块进行了介绍,并详细解释了它们的实现原理和使用方法。 引用中提到了另一篇博客文章《Thrift源码解析(一)主要类概述》,该博客主要介绍了Thrift框架中的一些主要类和它们的作用。这些类包括TProcessor、TProtocol、TServer等,它们是Thrift框架中的核心组件,负责处理数据的编码、解码、处理和传输。在这篇博客中,作者通过对这些类的分析,帮助读者了解Thrift框架的整体结构和工作原理。 引用中提到了一个名为thrift-enhancer的工具包,该工具包是对Thrift协议的增强支持。它提供了动态解析IDL并生成参数对象的能力,生成的参数对象可以自动转换为Thrift协议数据,并且支持Thrift与JSON、XML的双向转换。thrift-enhancer的出现为Thrift源码解析提供了更多的工具和扩展功能,帮助开发者更好地理解和使用Thrift框架。 综上所述,Thrift源码解析是通过分析Thrift框架的源代码来了解其内部工作原理和实现细节的过程。通过阅读相关的博客文章和使用辅助工具,可以更深入地了解Thrift框架的各个模块和主要类的功能和实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值