`
longgangbai
  • 浏览: 7340324 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

在新的项目中公司在平台内部系统间使用Thrift通讯,都没有听说过。然后听同事说,是跨语言Socket通讯的开源组件。

功能及特点

1.跨平台和语言的Socket通讯组件。

2.根据伪代码的结构语言定义对象和服务结构,然后生成各语言的代码和接口

3.各语言根据组件提供的库,编写客户端和服务器端程序。服务器端实现接口并编写业务逻辑。

4.服务器端支持多种序列化方式(Binary,Compact,JSON等)和多种服务器实现

 

太晚了,以后在完善,先贴代码了

 

本测试使用WINDOW环境和JAVA语言

 

1.下载和安装

下载地址:http://thrift.apache.org

下载最新版本,当前0.7.0

 
解压thrift-x.x.x.tar.gz ,进入thrift-x.x.x/lib/java,在cmd模式先使用ant编译(ant安装和设置就不说了哈。然后需要上公网,昨天在公司弄不起就是公司上不了公网,热)。

 数据类型:

bool,byte,i16,i32,i64,double,string,binary[二进制类型,在做文件服务器的时候使用]
structs:定义了一个类对象。其实就是一个OOP里面的类
容器类:list,set:集合,map: 字典。包括了三种容器对象
异常:这个跟传统的异常没有太大的差异
服务:类似于定义了一个接口或纯抽象类。程序员要做的就是去实现这些接口然后就可以暴露给客户端调用了。
定义完了thrift文件之后就可以写代码了

点击(此处)折叠或打开

对以上代码的简单分析:
(1).支持的传输格式
TBinaryProtocol   二进制格式
TCompactProtocol  压缩格式
TJSONProtocol     JSON格式
TSimpleJSONProtocol 提供JSON只写协议,生成的文件很容易通过脚本语言解析
TDebugProtocol     使用易懂的可读的文本格式以便于debug
(2). 支持的数据传输方式
TSocket    阻塞式socket
THttpTransport采用HTTP传输协议进行数据传输
TFramedTransport以frame为单位传输,非阻塞式服务中使用
TFileTransport以文件形式进行传输
TMemoryTransport将内存用于I/0,
TZlibTransport使用zlib进行压缩。
TBufferedTransport对某个transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或将数据直接写入到buffer
(3). 支持的服务模型[主要是服务端类型]
TSimpleServer简单的单线程服务模型,常用于测试
TThreadedServer多线程服务模型使用标准的阻塞式IO,每个请求创建一个线程
TThreadPoolServer多线程服务模型使用标准的阻塞式IO,预先创建一组线程处理请求
TNonblockingServer多线程服务模型使用非阻塞IO(需要用TFramedTransport数据传输方式 )
ps:什么叫阻塞与非阻塞?
阻塞IO:socket的阻塞意味着必须要做完IO包括错误才会返回
非阻塞IO:无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功
在网络阻塞严重的时候,网络层没有足够的内存来进行写操作,这时候就会出现写不成功的情况,阻塞情况下会尽可能(有可能被中断)等待到数据全部发送完毕, 对于非阻塞的情况就是一次写多少算多少,没有中断的情况下也还是会出现write 到一部分的情况.

2.建立测试工程

普通JAVA工程,目录如下:

src

+ org.acooly.thrift.demo.client  客户端代码

+ org.acooly.thrift.demo.generalcode 通过thrift工具生成的代码

+ org.acooly.thrift.demo.server 服务器端代码

lib

+拷贝前面ant编译后的build/lib下的jar和编译生成的thrift-x.x.x.jar

tools

+ thrift.exe 前面下载的

+ thriftdemo.thrift 伪代码

 

3.编写伪代码文件*.thrift

 

Java代码   收藏代码
  1. namespace java org.acooly.thrift.demo.generalcode  
  2.   
  3. struct Contact{  
  4.     1:i32 id  
  5.     2:string name  
  6.     3:i64 birthday  
  7.     4:string phoneNo  
  8.     5:string ipAddress  
  9.     6:map<string,string> props  
  10. }  
  11.   
  12. service ContactManager{  
  13.   void save(1:Contact contact)  
  14.   void remove(1:i32 id)  
  15.   list<Contact> getAll();  
  16.   list<Contact> query(1:map<string,string> conditions)  
  17. }  

 

 

4.生成代码

 

cmd模式进入 tools目录,运行

thrift.exe -gen java thriftdemo.thrift

 

运行成功后,在本目录会生成gen-java目录,拷贝该目录下生成的代码到工程中对应的包。

 

5.服务器代码和实现业务逻辑

 

实现业务逻辑

Java代码   收藏代码
  1. package org.acooly.thrift.demo.server;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Calendar;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.acooly.thrift.demo.generalcode.Contact;  
  9. import org.acooly.thrift.demo.generalcode.ContactManager;  
  10. import org.apache.thrift.TException;  
  11.   
  12. public class ContactManagerImpl implements ContactManager.Iface{  
  13.   
  14.     public List<Contact> getAll() throws TException {  
  15.         List<Contact> contacts = new ArrayList<Contact>();  
  16.         contacts.add(new Contact(1,"zhangpu",Calendar.getInstance().getTimeInMillis(),"1389612222","192.168.2.1",null));  
  17.         return contacts;  
  18.     }  
  19.   
  20.     public List<Contact> query(Map<String, String> conditions) throws TException {  
  21.         List<Contact> contacts = new ArrayList<Contact>();  
  22.         contacts.add(new Contact(1,"zhangpu",Calendar.getInstance().getTimeInMillis(),"1389612222","192.168.2.1",null));  
  23.         return contacts;  
  24.     }  
  25.   
  26.     public void remove(int id) throws TException {  
  27.         System.out.println("invoke: remove,id = " + id);  
  28.     }  
  29.   
  30.     public void save(Contact contact) throws TException {  
  31.         System.out.println("invoke: save,contact = " + contact);  
  32.           
  33.     }  
  34.   
  35.       
  36.       
  37. }  

 编写服务器代码

Java代码   收藏代码
  1. package org.acooly.thrift.demo.server;  
  2.   
  3. import org.acooly.thrift.demo.generalcode.ContactManager;  
  4. import org.acooly.thrift.demo.generalcode.ContactManager.Iface;  
  5. import org.apache.thrift.protocol.TCompactProtocol;  
  6. import org.apache.thrift.protocol.TCompactProtocol.Factory;  
  7. import org.apache.thrift.server.TServer;  
  8. import org.apache.thrift.server.TSimpleServer;  
  9. import org.apache.thrift.server.TServer.Args;  
  10. import org.apache.thrift.transport.TServerSocket;  
  11.   
  12. public class ThriftServer {  
  13.   
  14.     public static void main(String[] args) throws Exception{  
  15.         TServerSocket serverSocket = new TServerSocket(8111);  
  16.         ContactManager.Processor<Iface> processor = new ContactManager.Processor<Iface>(new ContactManagerImpl());  
  17.         Factory factory = new TCompactProtocol.Factory();  
  18.         Args ag = new Args(serverSocket);  
  19.         ag.outputProtocolFactory(factory);  
  20.         ag.inputProtocolFactory(factory);  
  21.         ag.processor(processor);  
  22.         TServer server = new TSimpleServer(ag);  
  23.         server.serve();  
  24.     }  
  25.       
  26. }  

 

 

6.客户端代码

Java代码   收藏代码
  1. package org.acooly.thrift.demo.client;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.List;  
  5.   
  6. import org.acooly.thrift.demo.generalcode.Contact;  
  7. import org.acooly.thrift.demo.generalcode.ContactManager;  
  8. import org.apache.thrift.protocol.TCompactProtocol;  
  9. import org.apache.thrift.protocol.TProtocol;  
  10. import org.apache.thrift.transport.TSocket;  
  11. import org.apache.thrift.transport.TTransport;  
  12.   
  13.   
  14. public class ThriftClient {  
  15.   
  16.     public static void main(String[] args) throws Exception{  
  17.           
  18.         TTransport transport = new TSocket("localhost",8111);  
  19.         TProtocol protocol = new TCompactProtocol(transport);  
  20.         ContactManager.Client client = new ContactManager.Client(protocol);  
  21.         transport.open();  
  22.           
  23.         List<Contact> list = client.getAll();  
  24.         System.out.println(list);  
  25.           
  26.         client.save(new Contact(1,"zhangpu",Calendar.getInstance().getTimeInMillis(),"1389612222","192.168.2.1",null));  
  27.           
  28.         client.remove(1);  
  29.         transport.close();  
  30.     }  
  31. }  

 

 

7.启动和测试运行

1.运行ThriftServer

2.运行ThriftClient

 

ThriftServer输出:

invoke: save,contact = Contact(id:1, name:zhangpu, birthday:1308591769148, phoneNo:1389612222, ipAddress:192.168.2.1, props:null)
invoke: remove,id = 1

 

ThriftClient输出:

[Contact(id:1, name:zhangpu, birthday:1308591769131, phoneNo:1389612222, ipAddress:192.168.2.1, props:null)]

 

分享到:
评论

相关推荐

    thrift入门学习教程

    ### Thrift入门学习教程 #### 一、Thrift概述 Thrift是由Facebook开发并在2007年贡献给Apache基金会的一款开源项目。它的主要目的是解决跨平台、跨语言的系统间大数据量传输通信问题。在早期,Facebook面临着系统...

    thrift入门教程+代码

    在入门Thrift时,你需要做以下几步: 1. 安装Thrift编译器:根据操作系统和需求,从Apache Thrift官网下载相应版本的编译器。 2. 编写IDL文件:定义你的服务接口和数据类型。 3. 生成代码:运行Thrift编译器,...

    thrift初级入门教程

    ### Thrift初级入门教程 #### 一、简介 Thrift 是由 Facebook 开发的一款软件库和一组代码生成工具,旨在加速高效且可扩展的后端服务的开发与实现。通过抽象出不同编程语言中最常用的部分,并将其封装进一个通用库...

    thrift开发入门java程序

    Thrift作为可伸缩的跨语言服务开发框架,网上的资源较少,这里是一个简单的入门小程序,文件中的mylib下包含了依赖的jar包,并且在file目录下放了一个简单的thrift文件和生成thrift-0.9.0.exe工具,直接使用 thrift-...

    thrift 入门介绍.pdf

    .thrift 入门介绍.pdf

    thrift 入门介绍.docx

    .thrift 入门介绍.docx

    thrift入门

    Thrift 入门指南 Thrift 是一种高性能的通讯中间件,支持多种编程语言,可以实现跨语言和跨平台的数据交换和 RPC 服务。Thrift 由 Facebook 开源,于 2007 年提交 Apache 软件基金会。Thrift 可以支持多种编程语言...

    thrift入门简介共22页.pdf.zip

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开发并开源,后来成为Apache软件基金会的顶级项目。它允许程序员定义服务接口,然后自动生成各种编程语言的代码,使得服务提供者和服务消费者可以使用不同...

    Thrift入门.docx

    【Thrift 简介】 Thrift 是一个开源的接口定义语言和跨语言的通信框架,最初由 Facebook 开发,目的是解决大规模跨语言服务开发的问题。Thrift 允许开发者定义服务接口,然后生成不同编程语言的代码,使得在各种...

    Thrift入门及Java实例演示

    在"Thrift入门及Java实例演示"中,我们可以预期学习到以下核心知识点: 1. **Thrift IDL**:Thrift的接口定义语言类似于C++或Java的接口,用于定义服务、结构体、异常和枚举等。例如,你可以定义一个简单的服务,...

    Thrift入门简介

    通俗简单的介绍了什么是thrift,适用于thrift或RPC扫盲。

    thrift基础文档

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年设计并发布,其目的是为了高效地实现不同编程语言之间的通信。Thrift通过定义一种中间表示(IDL,Interface Definition Language)来描述服务接口,然后...

    支持thrift协议的纯java版的增强工具集合, pojo直接转换为thrift,json/xml转换为thrift

    thrift-stuff: pojo转出成thrift二进制协议的能力,这一点与protostuff 类似, 目前实现了thrift的二进制和压缩协议 thrift-translator: 提供动态解析idl并生成参数对象的能力,动态生成的参数对象可以自动转换为...

    thrift实现http协议案例

    Thrift是一种高效的、跨语言的服务框架,最初由Facebook开发,现在是Apache的顶级项目。它提供了强大的代码生成工具,可以从接口定义文件(IDL)生成多种编程语言的客户端和服务端代码,使得不同语言之间可以轻松地...

    thrift样例操作实例

    首先,`Thrift简介.docx`可能是关于Thrift的入门文档,介绍了Thrift的概念、特点和用途。Thrift的主要特点包括高效、类型安全以及支持多种编程语言,如Java、C++、Python等。它通过定义服务接口,使得不同语言之间...

    thrift开发入门,php客户端调用java服务方,实现跨语言调用

    然后运行 restart_thrift.sh 脚本就可以直接启动 ps 一下进程是否正常,如果错误请查看日志 然后就可以使用线下的php直接调用, 代码是从网上找到的,比较容易入门 当然也可以直接导入java目录下的java工程,直接运行...

    thrift-0.13.0.zip

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,现在是Apache软件基金会的项目。它的主要目标是通过定义一种中间语言(IDL,Interface Definition Language)来简化不同编程语言之间的通信,使得...

    使用wireshark抓取thrift协议接口调用

    总之,结合Wireshark和Thrift dissector,我们可以深入洞察Thrift协议的网络交互,这对于开发、调试和维护Thrift服务具有极大的价值。请确保正确配置和使用这些工具,以便充分利用它们的功能,提升你的工作效率。

    thrift官方代码+与dubbo集成支持原生thrift协议

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年设计并发布,其目的是为了在各种编程语言之间提供高效的、轻量级的通信机制。Thrift通过定义一种中间表示(IDL,Interface Definition Language)来描述...

Global site tag (gtag.js) - Google Analytics