[zz]Apache Thrift学习小记

参考:

http://incubator.apache.org/thrift/

http://wiki.apache.org/thrift/FrontPage

 

http://jnb.ociweb.com/jnb/jnbJun2009.html非常好的入门教程

http://developers.facebook.com/thrift/thrift-20070401.pdfthrift开发者写的论文

http://wiki.apache.org/thrift/ThriftUsageC%2B%2B  官方的c++文档

 

 

Thrift是个啥东东?

来自wiki.apache.org/thrift/FrontPage的定义

 

Thrift is a software framework for scalable cross-language services development. 

Thrift是为了实现跨语言服务访问的一个框架

 

Thrift allows you to define data types and service interfaces in a simple definition file.

Thrift定义了数据和服务的描述方式,是一种IDL

 

Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages.

写一个定义文件,就可以使用thrift来生成某种语言RPC客户端和服务端程序框架。你只需要考虑如何实现你的服务就可以了。并且它支持很多种语言。

 

这有点像web service, 定义好一个web service服务描述文件后,可以使用如axis等工具生成服务器端或客户端的框架程序。

 

为什么还需要Thrift

thrift-20070401.pdf中有解释。

1、多语言开发的需要

比如其中提到的搜索服务,LAMP本身没有这个功能,开发者可能使用C++开发,php如何访问这个服务呢?于是需要有一种高效的跨语言访问的方法。

2、性能问题

web service也可以实现多语言互访问的功能,但xml文件太大,性能不行。Thrift可以使用二进值的格式。

 

开始测试

实现一个简单的服务,就是根据loginName得到User, user中有userId,loginName, name, password

 

第一步,写Thrift IDL文件 ,user.thrift,

 

[c-sharp] view plaincopy
  1. namespace java mytest.thrift.gen  
  2. namespace py mytest.thrift  
  3. struct User {  
  4.   1: i32    userId,  
  5.   2: string loginName,  
  6.   3: string password,  
  7.   4: string name  
  8. }  
  9. exception UserNotFound {  
  10.   1: string message  
  11. }  
  12. service UserService {  
  13.   User getUser(1:string loginName) throws (1:UserNotFound unf),  
  14.   list<User> getUsers()  
  15. }  

 

 

第二步,生成java和python代码

thrift --gen java user.thrift

thrift --gen py user.thrift

 

第三步,实现java服务端

参见:http://wiki.apache.org/thrift/ThriftUsageJava

 

服务实现 UserServiceHandler.java

 

 

[java] view plaincopy
  1. package myserver;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import mytest.thrift.gen.User;  
  5. import mytest.thrift.gen.UserNotFound;  
  6. import mytest.thrift.gen.UserService;  
  7. import org.apache.thrift.TException;  
  8. public class UserServiceHandler implements UserService.Iface {  
  9.     @Override  
  10.     public User getUser(String loginName) throws UserNotFound, TException {  
  11.         if (!"login1".equals(loginName)) {  
  12.             UserNotFound e = new UserNotFound("User not Found!");  
  13.             throw e;  
  14.         }  
  15.         User user = new User();  
  16.         user.setUserId(100);  
  17.         user.setLoginName("login1");  
  18.         user.setPassword("pwd1");  
  19.         user.setName("user1");  
  20.         return user;  
  21.     }  
  22.     @Override  
  23.     public List<User> getUsers() throws TException {  
  24.         List<User> list = new ArrayList<User>();  
  25.         User user = new User();  
  26.         user.setUserId(100);  
  27.         user.setLoginName("login1");  
  28.         user.setPassword("pwd1");  
  29.         user.setName("user1");  
  30.         list.add(user);  
  31.         User user2 = new User();  
  32.         user2.setUserId(200);  
  33.         user2.setLoginName("login2");  
  34.         user2.setPassword("pwd2");  
  35.         user2.setName("user2");  
  36.         list.add(user2);  
  37.         return list;  
  38.     }  
  39. }  

 

 

主程序 Server.java

 

 

[java] view plaincopy
  1. package myserver;  
  2. import mytest.thrift.gen.UserService;  
  3. import org.apache.thrift.server.TServer;  
  4. import org.apache.thrift.server.TSimpleServer;  
  5. import org.apache.thrift.transport.TServerSocket;  
  6. import org.apache.thrift.transport.TServerTransport;  
  7. public class Server {  
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             UserServiceHandler handler = new UserServiceHandler();  
  11.             UserService.Processor processor = new UserService.Processor(handler);  
  12.             TServerTransport serverTransport = new TServerSocket(9090);  
  13.             TServer server = new TSimpleServer(processor, serverTransport);  
  14.             // Use this for a multithreaded server  
  15.             // server = new TThreadPoolServer(processor, serverTransport);  
  16.             System.out.println("Starting the server...");  
  17.             server.serve();  
  18.         } catch (Exception x) {  
  19.             x.printStackTrace();  
  20.         }  
  21.         System.out.println("done.");  
  22.     }  
  23. }  

 

 

第四步,实现java客户端

 

[java] view plaincopy
  1. package myclient;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4. import mytest.thrift.gen.User;  
  5. import mytest.thrift.gen.UserNotFound;  
  6. import mytest.thrift.gen.UserService;  
  7. import org.apache.thrift.TException;  
  8. import org.apache.thrift.protocol.TBinaryProtocol;  
  9. import org.apache.thrift.protocol.TProtocol;  
  10. import org.apache.thrift.transport.TSocket;  
  11. import org.apache.thrift.transport.TTransport;  
  12. public class Client {  
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             TTransport transport = new TSocket("localhost"9090);  
  16.             TProtocol protocol = new TBinaryProtocol(transport);  
  17.             UserService.Client client = new UserService.Client(protocol);  
  18.             transport.open();  
  19.             System.out.println("test1");  
  20.             try {  
  21.                 User user1 = client.getUser("login1");  
  22.                 System.out.println("name=" + user1.getName());  
  23.             } catch (UserNotFound e) {  
  24.                 System.out.println(e.getMessage());  
  25.             }  
  26.               
  27.             System.out.println("test2");  
  28.             try {  
  29.                 User user2 = client.getUser("login10");  
  30.                 System.out.println("name=" + user2.getName());  
  31.             } catch (UserNotFound e) {  
  32.                 System.out.println(e.getMessage());  
  33.             }  
  34.               
  35.             System.out.println("test3");  
  36.             List<User> list = client.getUsers();  
  37.             Iterator<User> it = list.iterator();  
  38.             while(it.hasNext()){  
  39.                 User u = it.next();  
  40.                 System.out.println("name=" + u.getName());  
  41.             }  
  42.             transport.close();  
  43.         } catch (TException x) {  
  44.             x.printStackTrace();  
  45.         }  
  46.     }  
  47. }  

 


第五步,实现python客户端
[c-sharp] view plaincopy
  1. from mytest.thrift import UserService  
  2. from mytest.thrift.ttypes import UserNotFound  
  3. from thrift import Thrift  
  4. from thrift.transport import TSocket  
  5. from thrift.transport import TTransport  
  6. from thrift.protocol import TBinaryProtocol  
  7. try:  
  8.     # Make socket  
  9.     transport = TSocket.TSocket('localhost', 9090)  
  10.     # Buffering is critical. Raw sockets are very slow  
  11.     transport = TTransport.TBufferedTransport(transport)  
  12.     # Wrap in a protocol  
  13.     protocol = TBinaryProtocol.TBinaryProtocol(transport)  
  14.     # Create a client to use the protocol encoder  
  15.     client = UserService.Client(protocol)  
  16.     # Connect!  
  17.     transport.open()  
  18.     try:    
  19.         user1 = client.getUser("login1")  
  20.         print user1.name  
  21.     except UserNotFound, io:  
  22.         print '%r' % io  
  23.     # Close!  
  24.     transport.close()  
  25. except Thrift.TException, tx:  
  26.     print '%s' % (tx.message) 

转载于:https://www.cnblogs.com/zhangzhang/archive/2012/03/18/2404591.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php引用python出现502,【已解决】python执行出错:HTTPError: HTTP Error 502: Bad Gateway

【已解决】python执行出错&#xff1a;HTTPError: HTTP Error 502: Bad Gateway【背景】某此脚本执行&#xff0c;出现错误&#xff1a;LINE 1687 : ERROR Unknown Error !Traceback (most recent call last):File “E:WebServerWordPressto_wphi-baidu-mover_v2hi-baidu-mo…

can't load apple.laf.AquaLookAndFeel (Ant in Eclipse can't find it

转载自&#xff1a;http://lists.apple.com/archives/java-dev/2004/Oct/msg00529.html Re: "cant load apple.laf.AquaLookAndFeel" (Ant in Eclipse cant find it) Subject: Re: "cant load apple.laf.AquaLookAndFeel" (Ant in Eclipse cant find it)Fr…

php中的会话控制器,php – codeigniter检查每个控制器中的用户会话

另一个选项是创建基本控制器。将函数放在基本控制器中&#xff0c;然后继承。要在CodeIgniter中实现这一点&#xff0c;请在应用程序的libraries文件夹中创建一个名为MY_Controller.php的文件。class MY_Controller extends Controller{public function __construct(){parent::…

EXT.NET高效开发(一)——概述

之前就有想法说说这方面&#xff0c;直到看到我上一篇博客《EXT.NET复杂布局&#xff08;一&#xff09;——工作台》的回复&#xff1a; 小龙3&#xff1a;ext.net 比使用傳統的webform控件开发时间多多少&#xff1f; 我就决定提前写这一系列了。小龙3应该感到荣幸。嘿嘿。 相…

php 类的注释标准,php标准注释

文件头部模板/***这是一个什么文件**此文件程序用来做什么的(详细说明&#xff0c;可选。)。* author richard* version $Id$* since 1.0*/函数头部注释/*** some_func* 函数的含义说明** access public* param mixed $arg1 参数一的说明* param mixed $arg2 参数二的说明* par…

前端学习(417):京东制作页面25中间部分的准备工作

引入index.css作为中部样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…

前端学习(418):京东制作页面26中间模块划分

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-left:10px;} .grid-coll3{width: 190px;height: 100%;background-color:purple;…

Linux下,安装配置Weblogic

Linux下&#xff0c;安装配置Weblogic2009-03-20 15:03一、安装配置JDK //如果应用不需要高版本的JDK的话&#xff0c;可以不单独安装JDK 1. 安装JDK # chmod ax jdk-1_5_0_15-linux-i586.bin # ./jdk-1_5_0_15-linux-i586.bin # mv jdk1.5.0_15 /usr/local/jdk //JDK安…

php_self nginx,nginx中的PATH_INFO为什么会影响$_SERVIER['PHP_SELF']

发现问题&#xff1a;使用ThinkPHP3.2.2在nginx部署网站&#xff0c;设置URL_MODEL2&#xff0c;使用U方法在本地生成的链接形如:/public/index但是在部署在nginx上却出现了问题 其中的URL生成了./public/index通过追寻ThinkPHP源码在ThinkPHP.php文件中发现了如下代码:if(IS_C…

前端学习(419):京东制作页面27左侧分类上

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll1 ul{padding: 20px 0;} .grid-coll1 ul li{padding-left: 12px;}.grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-lef…

java 树结构递归设计,java实现递归树形结构

数据结构递归树,数据结构递归算法,数据结构递归,数据结构递归运算,考研数据结构考递归,数据结构递归回溯,js递归树形数据结构,数据结构分治,递归变非递归用什么数据结构......通过函数递归调用来实现树形结构数据遍历的方法,其中递归函数体实现了打印指定结点的子结点功能。本方…

解析IP地址与MAC地址

一、IP地址  对于IP地址&#xff0c;相信大家都很熟悉&#xff0c;即指使用TCP/IP协议指定给主机的32位地址。IP地址由用点分隔开的4个8八位组构成&#xff0c;如192.168.0.1就是一个IP地址&#xff0c;这种写法叫点分十进制格式。IP地址由网络地址和主机地址两部分组成&…

梯度算法的matlab程序,基于MATLAB的梯度法源代码

话不多说&#xff0c;直接上干货。这是基于MATLAB的源代码&#xff0c;目标函数我选择了一个二维函数&#xff0c;根据自己需求&#xff0c;更改目标函数&#xff0c;初始迭代点以及收敛精度第一部分&#xff1a;目标函数 根据自己需求&#xff0c;更改目标函数&#xff01;&…

UNP Chapter 22 - 信号驱动I/O

22.1. 概述 信号驱动是指当某个描述字上发生了某个事件时&#xff0c;让内核通知进程。 这里描述的信号驱动不是真正的异步I/O。 第15章描述的非阻塞I/O同样不是异步I/O。在非阻塞I/O中&#xff0c;启动I/O操作后内核并不像真正的异步I/O那样立即返回&#xff0c;它只有在进程非…

break在matlab中的用法,求助这个算法运行的时候说错误: BREAK只能在FOR或WHile使用...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼[filenamel,pathname,filterindex]uigetfile(*.*,选择图像,请选择图像)I imread(num2str(filenamel));disp(请选择添加噪声类型);disp(椒盐噪声 --1);disp(高斯噪声 --2);disp(泊松噪声 --3);disp(斑点噪声 --4);Ainput(请输入选项…

matlab双重差分模型,MATLAB中ARMA模型预测差分问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我MATLAB预测风速的程序&#xff0c;程序不是我自己写的&#xff0c;我也是拿来参考自己的毕业作业的.每条程序旁的中文是我自己的理解&#xff0c;我也不知道对不对。程序1Xload(C:\Users\asus\Desktop\1-3.txt); 这是我的历史…

[转]AS语言基础

┏━━━━━━━━━━━━━━━━━━┓ ┃ 第一部分&#xff1a;ActionScript 3 语言基础 ┃ ┗━━━━━━━━━━━━━━━━━━┛ 第2章 ActionScript 3 语言基本元素 2.1.2 数据类型概述 简单数据类型 Boolean(布尔)、int(有符整型)、Number(浮点)、String(字符…

php strpos与strrpos,PHP开发之 strpos stripos strrpos strripos的区别

前言在日常PHP开发中strpos stripos strrpos strripos这四个函数是会经常用到的&#xff0c;但是你又掌握了多少呢&#xff1f;在这里将着中就这4个函数做一个详细的解析。正文stripos — 查找字符串首次出现的位置(不区分大小写),应使用 运算符来测试此函数的返回值&#xff…

jQuery选择元素

1、jQuery包装的CSS选择器 $(" p a.speciaClass") 2、子选择器&#xff08;个人简单的认为&#xff1a;就是在jQuery选择器里面加上了一个">"操作符&#xff0c;再具有一新的特性&#xff09; $("ul#myList>li>a").fadeOut(); 3、…

php能否缓存,PHP缓存实现

PHP缓存实现classCacheExceptionextendsException {}/*** 缓存抽象类*/abstractclassCache_Abstract {/*** 读缓存变量** param string $key 缓存下标* return mixed*/abstractpublicfunctionfetch($key);/*** 缓存变量** param string $key 缓存变量下标* param string $value…