多语言协作工具thrift

标签: 多语言 协作 工具 | 发表时间:2013-02-28 22:08 | 作者:yunnysunny
出处:http://blog.csdn.net

1背景

如果讨论每个语言的特点,相信各个语言的程序员都能说得天花乱坠,争的面红耳赤。但是在如今大互联网时代,没有哪种语言是银弹,各种语言都各有所长。为了截取各家之长,各种跨语言通信框架涌现出来,thrift就是其中的一个典型代表。

thrift是基于socket或者http协议来进行通信的,所以适合分布式的服务器之间进行通信。众所周知,php中是无法使内存常驻的,java、c、c++之类的就可以;对于处理html页面,php擅长,对于数据库连接java更擅长,对于高并发处理node.js erlang更擅长。thrift将各者结合起来,做到扬长避短,而且支持的语言要远远多于刚才提到几种。

关于thrift的入门介绍可以参见http://www.javabloger.com/article/apache-thrift-architecture.html

2安装

下面以java和php为例介绍一下thrift的使用。

首先从https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.tar.gz 下载最新的thrift源码和在windows下的工具https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.exe。将thrift-0.9.0.tar.gz解压到任意目录,在里面新建目录bin,将thrift-0.9.0.exe拷贝到这个目录,重命名为thrift.exe,并且将这个bin目录加入环境变量,方便以后从命令行。

进入thrift解压目录下的lib/java目录,执行ant命令(关于ant的配置,请自行搜索,当然也可以下载随后给出的ant生成物),在生成的build目录中的libthrift-0.9.0.jar和build/lib目录中的所有jar包备份出来,方便建立java项目时引用。

注意php需要配置apc支持,如果没有安装,请先安装之。

3脚本编写

新建thrift数据定义文件test.txt内容如下:

namespace java com.whyun.thrift   # 注释1   定义生成代码的命名空间,与你需要定义的package相对应。
namespace php test

struct Blog {   #  注释2.1   定义实体名称和数据结构,类似你业务逻辑中的pojo get/set
    1: string topic     #  注释2.2  参数类型可以参见 Thrift wiki   
    2: binary content  
    3: i64    createdTime
    4: string id
    5: string ipAddress
    6: map<string,string> props
  }
service ThriftCase {  #  注释3    代码生成的类名,你的业务逻辑代码需要实现代码生成的ThriftCase.Iface接口
    i32 testCase1(1:i32 num1, 2:i32 num2, 3:string  num3) #注释4.1 方法名称和方法中的入参,入参类型参见wiki
    list<string> testCase2(1:map<string,string>  num1)
    void testCase3()
    void testCase4(1:list<Blog> blog)   #  注释4.2   list 是thrift中基本数据类型中的一种,list中包含的Blog对象是上面struct中定义的
}

在test.txt所在目录下运行thrift --gen java test.txt生成java代码,运行thrift --gen php test.txt来生成php代码,运行完成后,在当前目录下回生成gen-java和gen-php两个目录。

4java代码编写

新建java项目thrift-demo,在项目中新建目录lib,将刚才安装中生成的jar包都拷贝过来,并将其添加到classpath中,将之前生成的gen-java目录下生成代码拷贝到工程中,然后新建包com.whyun.thrift.business来编写我们的处理代码,首先实现sevice的处理类,如下:

package com.whyun.thrift.business;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.thrift.TException;

import com.whyun.thrift.Blog;
import com.whyun.thrift.ThriftCase.Iface;

public class CaseImpl implements Iface {

	@Override
	public int testCase1(int num1, int num2, String num3) throws TException {
		// TODO Auto-generated method stub
		return 1;
	}

	@Override
	public List<String> testCase2(Map<String, String> num1) throws TException {
		List<String> list = new ArrayList<String>();
		list.add("aaa");
		list.add("bbb");
		return list;
	}

	@Override
	public void testCase3() throws TException {
		System.out.println("testCase3");		
	}

	@Override
	public void testCase4(List<Blog> blog) throws TException {
		System.out.println("testCase4");		
	}
}

代码片段4.1

接着编写server端程序:

package com.whyun.thrift.business;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

import com.whyun.thrift.ThriftCase;
import com.whyun.thrift.ThriftCase.Processor;

public class Server {
   public void startServer() {
       try {

           TServerSocket serverTransport = new TServerSocket(1234);

           ThriftCase.Processor process = new Processor(new CaseImpl());

           Factory portFactory = new TBinaryProtocol.Factory(true, true);

           Args args = new Args(serverTransport);
           args.processor(process);
           args.protocolFactory(portFactory);

           TServer server = new TThreadPoolServer(args);
           server.serve();
       } catch (TTransportException e) {
           e.printStackTrace();
       }
   }

   public static void main(String[] args) {
       Server server = new Server();
       server.startServer();

   }
}

代码片段4.2

5php程序编写

在apache的web根目录中新建文件夹thrift,在其下新建classes目录。在将安装步骤中thrift解压目录下的lib/php/lib目录下Thrift文件夹拷贝到新建的classes目录下,再将脚本编写步骤中gen-php目录下test文件夹拷贝到classes目录中,将test文件夹下的ThriftCase.php改名为ThriftCaseClient.php,最终形成的目录结构如下:


图5.1

在thrift目录下新建package.php,编码如下:

<?php
use Thrift\Transport\TSocket as TSocket;
use Thrift\Transport\TBufferedTransport as TBufferedTransport;
use Thrift\Protocol\TBinaryProtocol as TBinaryProtocol;

use test\ThriftCaseClient as ThriftCaseClient;

// autoload function
function __autoload($class) {
	// convert namespace to full file path
	$class = 'classes/'.str_replace('\\', '/', $class). '.php';
	require_once($class);
}

$thriftHost = '127.0.0.1'; //Thrift接口服务器IP
$thriftPort = 1234;//Thrift接口服务器端口

$socket = new TSocket($thriftHost, $thriftPort);

$socket->setSendTimeout(10000);
$socket->setRecvTimeout(20000);
$transport = new TBufferedTransport($socket);
$protocol = new TBinaryProtocol($transport);
$client = new ThriftCaseClient($protocol);
$transport->open();
$socket->setDebug(TRUE);

echo $client->testCase1(1,2,3).'<br />';
var_dump( $client->testCase2(array('xxx'=>'1','ddd'=>'2')));
?>

代码片段5.1

6运行

在eclipse中运行代码片段4.2,然后在浏览器中运行代码片段5.1,会输出(这些输出其实是由于在代码片段4.1中随便写的):

1
array(2) { [0]=> string(3) "aaa" [1]=> string(3) "bbb" }

以上java和php代码已上传到csdn。



作者:yunnysunny 发表于2013-2-28 22:08:10 原文链接
阅读:60 评论:0 查看评论

相关 [多语言 协作 工具] 推荐:

多语言协作工具thrift

- - CSDN博客云计算推荐文章
如果讨论每个语言的特点,相信各个语言的程序员都能说得天花乱坠,争的面红耳赤. 但是在如今大互联网时代,没有哪种语言是银弹,各种语言都各有所长. 为了截取各家之长,各种跨语言通信框架涌现出来,thrift就是其中的一个典型代表. thrift是基于socket或者http协议来进行通信的,所以适合分布式的服务器之间进行通信.

推荐几个简单的协作工具

- oxygen - 知乎的博客
既然是简单的协作工具,尤其强调 todo list 功能,那么选择有如下几个:. Asana – 地球上最复杂(笑)、也是最先进的基于 todo 条目的团队协作软件,是免费 web app,目前正在 beta 测试阶段. Flow – 由著名设计团队 MetaLab 出品的 UI 华丽、功能实用的协作软件,收费,具有全功能的 iOS 客户端.

Worktile:更简单高效的团队协作工具

- - TECH2IPO创见
Worktile( 官网). 产品描述:Worktile 是一款通过简单的协作、沟通和分享,实现团队交互与任务管理的轻松协作的团队协作工具. Worktile 希望做到的是一款简单、易用、开放和安全的团队协作工具. 目前这款产品以协作逻辑是以任务为项目,分支出工作台、日历、任务和消息四个主要的功能.

半数员工都在家上班的少数派,推荐这些远程协作好工具

- - 少数派
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考. 我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点. 文章代表作者个人观点,少数派仅对标题和排版略作修改. 远程办公本来是基于网络和工具的不断进化,带来的一种更先进的团队协作模式,这种模式可以突破地域限制,帮助组织面向全球招揽合适的人才,同时也有助于降低办公成本.

【转载】拖拽即可收纳富媒体内容,基于HTML5技术的Mural.ly可成为在线协作和头脑风暴的新工具

- - HTML5研究小组
如果你厌烦了传统类似word或ppt那些编辑工具,又觉得思维导图类软件的层级性还不能帮你梳理思路的话,现在可以试试 Mural.ly. Mural.ly是一个基于HTML5技术的大画板,你可将从网络中获取到的内容像挥洒染料一般放进Mural.ly. Mural.ly已向公众开放,并获得了77.5万美元的种子投资.

小团队协作,有哪些值得推荐的 Web 应用和工具软件?有什么好的做法可以作为最佳实践?

- - 知乎每日精选
以前回答过类似的问题 http://www.zhihu.com/question/20114578/answer/21067452,我觉的答案非常适合这个问题,等有机会再写一篇文章专门讨论. 大部分朋友都推荐一堆的工具,我个人认为对于创业团队未必适合使用这么多的沟通交流以及团队协作工具:. 简单统计一下,有邮件Email、即时通讯IM、日程管理 Google Calendar 、文档协作Google Docs、项目管理 Basecamp 、群组聊天 Campfire 、文件共享Dropbox、缺陷跟踪 Lighthouse ,这就已经有八个工具了,试想对于小创业公司来说,团队成员人数都不一定能有这么多,少则两三人、多则七八人.

关于多语言内容的新标识

- - Google China Blog
发表者: Christopher Semturs,软件工程师,搜索基础结构部,Google瑞士. 原文: New markup for multilingual content. 转载自: 谷歌中文网站管理员博客. 发布时间:2011年12月16日 下午 02:20:00. 针对用户使用的不同语言或所处的不同地区,每个网站都有不同的方式为用户提供合适的内容.

IObit 恶意战斗机(IObit Malware Fighter)v1.0 多语言官方正式版

- 堕海之羽 - 姥姥精品软件坊
       随着时代的“进步”,价值观的“革新”,破坏性的病毒是越来越少了,取而代之的是更多的,危害性更大的木马,恶意软件和流氓软件(灰色软件);令广大网民防不胜防,无辜受害. 所以,彻底清除木马,恶意流氓软件是系统运行顺畅,上网流畅,隐私保护,拒做“肉鸡”的最重要手段. IObit Malware Fighter (IObit恶意战斗机)就是一款专业的木马,恶意流氓软件克星.

为什么很多语言中“爸爸”“妈妈”的发音都特别相似?

- TENTiN - 果壳网 guokr.com - 果壳网
各大语系之间对母亲(ma)、父亲(pa、ba)的一致化发音确实大量存在,也是语言学家一直热衷探讨的课题. 但事实上,也有很多语言中不这样叫爸爸妈妈,满语、日语、格鲁吉亚语等语种中对父母有着特殊的发音方法,这里无法逐一展开讨论. 从发音方式上分析,婴儿出生时开口啼哭——即自然长音“a”,而吸吮母乳时由于口腔封闭,气流经由鼻腔冲出,发出了“m”,这几乎婴儿最早学会的两种发音方式.

基于axure的PRD协作

- - 幻风阁|kent.zhu'sBlog
大约1年多前我写了一篇《 基于axure的PRD写作思考》,其主旨思想是将文档版本的PRD与线框图及流程图结合起来,统一由axure来输出,降低PM与研发之间的沟通成本及交付物的传递成本. 当时这个文档是基于我做Web端产品设计的经验为蓝本完成的,这1年多来我从Web端完全转到Mobile端,还在继续的使用着这套方法.