96SEO 2026-02-20 07:14 8
稳定/广泛使用Thrift的数据类型Thrift的协议Thrift的传输层Thrift的服务端类型Thrift入门示例(一)

Thrift读音[θrɪft]是一个轻量级、跨语言的远程服务调用框架最初由Facebook开发后面进入Apache开源项目。
它通过自身的IDL中间语言,
并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。
Thrift支持多种不同的编程语言包括C、Java、Python、PHP、Ruby等本系列主要讲述基于Java语言的Thrift的配置方式和具体使用。
Thrift软件栈分层从下向上分别为传输层(Transport
Layer)传输层负责直接从网络中读取和写入数据它定义了具体的网络传输协议比如说TCP/IP传输等。
Layer)协议层定义了数据传输格式负责网络传输数据的序列化和反序列化比如说JSON、XML、二进制数据等。
Layer)处理层是由具体的IDL接口描述语言生成的封装了具体的底层网络传输和序列化方式并委托给用户实现的Handler进行处理。
Layer)整合上述组件提供具体的网络线程/IO服务模型形成最终的服务。
IDL文件利用编译生成器自动生成服务端骨架(Skeletons)和客户端桩(Stubs)。
从而省去开发者自定义和维护接口编解码、消息传输、服务器多线程模型等基础工作。
服务端只需要按照服务骨架即接口编写好具体的业务处理程序(Handler)即实现类即可。
客户端只需要拷贝IDL定义好的客户端桩和服务对象然后就像调用本地对象的方法一样调用远端服务。
通过维护Thrift格式的IDL接口描述语言文件注意写好注释即可作为给Client使用的接口文档使用也自动生成接口代码始终保持代码和文档的一致性。
且Thrift协议可灵活支持接口的可扩展性。
Protobuf且更加易读易懂特别是RPC服务接口的风格就像写一个面向对象的Class一样简单。
初学者只需参照thrift.apache.org/一个多小时就可以理解Thrift
Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk等多种语言即可生成上述语言的服务器端和客户端程序。
对于我们经常使用的Java、PHP、Python、C支持良好虽然对iOS环境的Objective-C(Cocoa)支持稍逊但也完全满足我们的使用要求。
Thrift在很多开源项目中已经被验证是稳定和高效的例如Cassandra、Hadoop、HBase等国外在Facebook中有广泛使用国内包括百度、美团小米、和饿了么等公司。
Thrift可以让用户选择客户端与服务端之间传输通信协议的类别在传输协议上总体划分为文本(text)和二进制(binary)传输协议。
为节约带宽提高传输效率一般情况下使用二进制类型的传输协议为多数有时还会使用基于文本类型的协议这需要根据项目/产品中的实际需求。
常用协议有以下几种
TBinaryProtocol二进制编码格式进行数据传输TCompactProtocol高效率的、密集的二进制编码格式进行数据传输TJSONProtocol
使用JSON文本的数据编码协议进行数据传输TSimpleJSONProtocol只提供JSON只写的协议适用于通过脚本语言解析
TSocket使用阻塞式I/O进行传输是最常见的模式TNonblockingTransport使用非阻塞方式用于构建异步客户端TFramedTransport使用非阻塞方式按块的大小进行传输类似于Java中的NIO
TSimpleServer单线程服务器端使用标准的阻塞式I/OTThreadPoolServer多线程服务器端使用标准的阻塞式I/OTNonblockingServer单线程服务器端使用非阻塞式I/OTHsHaServer半同步半异步服务器端基于非阻塞式IO读写和多线程工作任务处理TThreadedSelectorServer多线程选择器服务器端对THsHaServer在异步IO模型上进行增强
IDL编译器下载地址http://thrift.apache.org/docs/install。
下载Windows安装环境的.exe文件将thrift.exe的路径加入环境变量中。
在Idea上安装Thrift编辑插件。
由于未指定代码生成的目标下。
这里生成一个HelloWorldService.java类文件文件大小超过数千行下面截取一部分核心代码。
org.apache.thrift.TException;}public
org.apache.thrift.async.AsyncMethodCallbackString
org.apache.thrift.TException;}public
org.apache.thrift.TServiceClient
org.apache.thrift.TServiceClientFactoryClient
getClient(org.apache.thrift.protocol.TProtocol
getClient(org.apache.thrift.protocol.TProtocol
org.apache.thrift.protocol.TProtocol
Client(org.apache.thrift.protocol.TProtocol
Client(org.apache.thrift.protocol.TProtocol
org.apache.thrift.protocol.TProtocol
org.apache.thrift.async.TAsyncClient
org.apache.thrift.async.TAsyncClientFactoryAsyncClient
org.apache.thrift.async.TAsyncClientManager
org.apache.thrift.protocol.TProtocolFactory
Factory(org.apache.thrift.async.TAsyncClientManager
org.apache.thrift.protocol.TProtocolFactory
clientManager;this.protocolFactory
getAsyncClient(org.apache.thrift.transport.TNonblockingTransport
AsyncClient(org.apache.thrift.protocol.TProtocolFactory
org.apache.thrift.async.TAsyncClientManager
org.apache.thrift.transport.TNonblockingTransport
org.apache.thrift.async.AsyncMethodCallbackString
___transport);this.___currentMethod
method_call;___manager.call(method_call);}//
}对于开发人员而言使用原生的Thrift框架仅需要关注以下四个核心内部接口/类Iface,
Iface服务端通过实现HelloWorldService.Iface接口向客户端的提供具体的同步业务逻辑。
AsyncIface服务端通过实现HelloWorldService.Iface接口向客户端的提供具体的异步业务逻辑。
Client客户端通过HelloWorldService.Client的实例对象以同步的方式访问服务端提供的服务方法。
AsyncClient客户端通过HelloWorldService.AsyncClient的实例对象以异步的方式访问服务端提供的服务方法。
新建maven工程引入thrift的依赖这里使用的是版本0.10.0。
dependencygroupIdorg.apache.thrift/groupIdartifactIdlibthrift/artifactIdversion0.10.0/version/dependencyb).
将生成类的HelloWorldService.java源文件拷贝进项目源文件目录中并实现HelloWorldService.Iface的定义的say()方法。
ServerSocket(ServerConfig.SERVER_PORT);TServerSocket
TServerSocket(serverSocket);HelloWorldService.Processor
HelloWorldService.ProcessorHelloWorldService.Iface(new
HelloWorldServiceImpl());TBinaryProtocol.Factory
TBinaryProtocol.Factory();TSimpleServer.Args
TSimpleServer.Args(serverTransport);tArgs.processor(processor);tArgs.protocolFactory(protocolFactory);//
TSimpleServer(tArgs);System.out.println(Running
TSocket(ServerConfig.SERVER_IP,
ServerConfig.TIMEOUT);TProtocol
TBinaryProtocol(transport);HelloWorldService.Client
HelloWorldService.Client(protocol);transport.open();String
client.say(Leo);System.out.println(Result
运行服务端程序服务端在指定端口监听客户端的连接请求控制台输出启动日志
运行客户端程序客户端通过网络请求HelloWorldService的say()方法的具体实现控制台输出返回结果
这里使用的一个基于单线程同步的简单服务模型一般仅用于入门学习和测试
本文对Thrift的概念做了相关介绍体验了一番thrift程序如何编写
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback