设为首页 收藏本站
查看: 443|回复: 0

[经验分享] Apache Thrift简介

[复制链接]

尚未签到

发表于 2016-12-29 10:57:44 | 显示全部楼层 |阅读模式
Apache Thrift

Apache Thrift 是跨语言服务访问的框架。最早由Facebook 开发,贡献给了Apache。
通过接口定义语言(IDL),定义和创建服务,Thrift生成特定语言的可供server和client 访问的代码。
Thrfit 有着非常优秀的效率,无论是内存还是 传输效率上。
Cassandra 支持多种语言的编程接口,正式由于使用了Thrift。
架构
http://www.openxid.com/wp-content/gallery/me/5d30dac4-35fc-3cd6-8a81-646396802ad1.jpg
以上是创建server和client的stack。最上面的是IDL,然后生成Client和Processor。红色的是发送的数据。protocol和transport 是Thrift运行库的一部分。
通过Thrift 你只需要关心服务的定义,而不需要关心protocol和transport。
Thrift允许你选择 protocol ,transport和server。因为Thrift 最早是有C++开发的,Thrift在C++实现中有最大的变化。
Thrift支持 text 和 binary protocols,binary protocols要比text protocols,但是有时候 text protocols比较有用(例如:调试的时候)。支持的协议有:
TBinaryProtocol  -直接的二进制格式
TCompactProtocol  效率和高压缩编码数据
TDenseProtocoal  和TCompactProtocol相似,但是省略了meta信息,从哪里发送的,增加了receiver。还在实验中,java实现还不可用。
TJSONProtocoal 使用JSON
TSImpleJSONProtocoal  只写的protocol使用JSON。适合被脚本语言转化
TDebugProtocoal  使用人类可读的text 格式 帮助调试
上面的protocol 说明了 什么被传送,Thrift  transports 说明了怎样传送。支持的transport:
TSocket  使用 blocking socket I/O
TFramedTransport   以帧的形式发送,每帧前面是一个长度。要求服务器来non-blocking server
TFileTransport   写到文件。没有包括在java实现中。
TMemoryTransport   使用内存 I/O 。java实现中在内部使用了ByteArrayOutputStream
TZlibTransport 压缩 使用zlib。在java实现中还不可用
最后,thrift 提供了servers:
TSimpleServer  单线程 server,使用标准的blocking IO。用于测试
TThreadPoolServer  多线程  使用标准的blocking IO
TNonblockingServer  多线程  使用 non-blocking IO (java实现中使用了NIO channels)。TFramedTransport必须使用在这个服务器。
一个server只允许定义一个接口服务。这样的话多个接口需要多个server。这样会带来资源的浪费。同意通过继承接口的方式。
创建服务 
1创建user.thrift
Java代码

  • namespace java thrift.demo.gen
  • namespace py thrift.demo
  • struct User{
  •     1: i32 id,
  •     2: string username,
  •     3: string password
  • }
  • exception UserNotFound{
  •     1:string message
  • }
  • service UserService{
  •     list<User> getUsers(),
  •     User getUserByName(1:string username) throws(1:UserNotFound unf)
  • }

定义了一个User ,一个UerNotFound异常,一个UserService服务接口
 
服务定义主要使用了 类C的语法
Types
Thrift 定义的类型
base type:bool,byte,i16,i32,i64,double,string(UTF-8 编码)
binary
structs
Contains:list<type>,set<type>,map<type>
exception
services:包含了一组接口方法
 
注意定义的时候 序号是不可省略的,使用序号可以提升序列化和反序列对象的速度。
2.生成代码
命令行下执行
生成java代码
Java代码

  • thrift-0.6.1.exe –gen java  user.thrift

生成python代码
Java代码

  • thrift-0.6.1.exe –gen py user.thrift

3.实现服务端
3.1接口服务实现
Java代码

  • package thrift.demo.server;
  • import java.util.ArrayList;
  • import java.util.List;
  • import org.apache.thrift.TException;
  • import thrift.demo.gen.User;
  • import thrift.demo.gen.UserNotFound;
  • import thrift.demo.gen.UserService.Iface;
  • public class UserServiceHandler implements Iface {
  •     @Override
  •     public List<User> getUsers() throws TException {
  •         List<User> list = new ArrayList<User>();
  •         User user = new User();
  •         user.setId(1);
  •         user.setUsername(“user1″);
  •         user.setPassword(“pwd1″);
  •         list.add(user);
  •         User user2 = new User();
  •         user2.setId(1);
  •         user2.setUsername(“user2″);
  •         user2.setPassword(“pwd2″);
  •         list.add(user2);
  •         return list;
  •     }
  •     @Override
  •     public User getUserByName(String username) throws UserNotFound, TException {
  •         if (“user1″.equals(username)) {
  •             User user = new User();
  •             user.setId(1);
  •             user.setUsername(“user1″);
  •             user.setPassword(“pwd1″);
  •             return user;
  •         } else {
  •             throw new UserNotFound();
  •         }
  •     }
  • }

3.2 Server启动类
Java代码

  • package thrift.demo.server;
  • import org.apache.thrift.TProcessorFactory;
  • import org.apache.thrift.protocol.TCompactProtocol;
  • import org.apache.thrift.server.THsHaServer;
  • import org.apache.thrift.server.TServer;
  • import org.apache.thrift.transport.TFramedTransport;
  • import org.apache.thrift.transport.TNonblockingServerSocket;
  • import org.apache.thrift.transport.TTransportException;
  • import thrift.demo.gen.UserService;
  • public class UserServer {
  •     public final static int PORT = 8989;
  •     /**
  •      * @param args
  •      */
  •     public static void main(String[] args) {
  •         try {
  •             TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT);
  •             final UserService.Processor processor = new UserService.Processor(
  •                     new UserServiceHandler());
  •             THsHaServer.Args arg = new THsHaServer.Args(socket);
  •             arg.protocolFactory(new TCompactProtocol.Factory());
  •             arg.transportFactory(new TFramedTransport.Factory());
  •             arg.processorFactory(new TProcessorFactory(processor));
  •             TServer server = new THsHaServer(arg);
  •             server.serve();
  •         } catch (TTransportException e) {
  •             e.printStackTrace();
  •         }
  •     }
  • }

4.实现客户端
Java代码

  • package thrift.demo.client;
  • import org.apache.thrift.TApplicationException;
  • import org.apache.thrift.TException;
  • import org.apache.thrift.protocol.TCompactProtocol;
  • import org.apache.thrift.protocol.TProtocol;
  • import org.apache.thrift.transport.TFramedTransport;
  • import org.apache.thrift.transport.TSocket;
  • import org.apache.thrift.transport.TTransport;
  • import org.apache.thrift.transport.TTransportException;
  • import thrift.demo.gen.UserNotFound;
  • import thrift.demo.gen.UserService;
  • public class UserClient {
  •     public static void main(String[] arsg) {
  •         String address = ”127.0.0.1″;
  •         int port = 8989;
  •         int clientTimeout = 30000;
  •         TTransport transport = new TFramedTransport(new TSocket(address, port,
  •                 clientTimeout));
  •         TProtocol protocol = new TCompactProtocol(transport);
  •         UserService.Client client = new UserService.Client(protocol);
  •         try {
  •             transport.open();
  •             System.out.println(client.getUserByName(“user1″));
  •         } catch (TApplicationException e) {
  •             System.out.println(e.getMessage() + ” ” + e.getType());
  •         } catch (TTransportException e) {
  •             e.printStackTrace();
  •         } catch (UserNotFound e) {
  •             e.printStackTrace();
  •         } catch (TException e) {
  •             e.printStackTrace();
  •         }
  •         transport.close();
  •     }
  • }

注意 客户端和服务端要使用同一中 Protocol 和 Transport,否则会抛出异常
参考:
http://incubator.apache.org/thrift/
http://wiki.apache.org/thrift/FrontPage
http://www.cnblogs.com/end/archive/2011/04/12/2013805.html
http://jnb.ociweb.com/jnb/jnbJun2009.html 非常好的入门教程
http://developers.facebook.com/thrift/thrift-20070401.pdf thrift开发者写的论文

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-321025-1-1.html 上篇帖子: Apache Shiro学习 下篇帖子: Apache SSI 教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表