TatalaRPC中間件
這個(gè)項(xiàng)目最早(2008年)是用于一個(gè)網(wǎng)絡(luò)游戲的Cache Server,以及一個(gè)電子商務(wù)的Web Session服務(wù)。后來(lái)不斷增加新的功能,除了Java還支持C#,到現(xiàn)在已經(jīng)可以用它來(lái)開發(fā)網(wǎng)絡(luò)游戲的服務(wù)器。等過(guò)些日子我還會(huì)開源網(wǎng)絡(luò)游戲的服務(wù)器源碼。
關(guān)于性能,當(dāng)時(shí)后臺(tái)相應(yīng)請(qǐng)求的效率是每秒10W次,現(xiàn)在我在自己的筆記本上測(cè),只有一個(gè)客戶端與服務(wù)器都在一個(gè)物理機(jī)上(CPU: i7-3610QM; RAM: 8G; OS: Win7-64),每秒相應(yīng)12000個(gè)請(qǐng)求。
tatala-client-csharp已經(jīng)上傳,同樣在筆記本上測(cè)試,一個(gè)c#客戶端一個(gè)Java服務(wù)端都在一臺(tái)機(jī)器上,每秒響應(yīng)22000個(gè)請(qǐng)求。c#客戶端除了性能測(cè)試的例子還有一個(gè)演示Server推送的聊天室例子。
Tatala最大的特點(diǎn)是簡(jiǎn)單,性能是第二考慮能夠滿足大部分應(yīng)用就行。因?yàn)樾阅芸梢酝ㄟ^(guò)增加機(jī)器得到提升,而代碼簡(jiǎn)單意味著雇更少的人更快的開發(fā)。老板省錢,程序員輕松才是最重要的。
下面是簡(jiǎn)單介紹。
概述
Tatala是一個(gè)簡(jiǎn)單易用的RPC中間件,并且跨語(yǔ)言跨平臺(tái)。它將調(diào)用方法轉(zhuǎn)變成字節(jié)數(shù)組(包括被調(diào)用類名,目標(biāo)方法名,參數(shù)序列和返回值),在socket基礎(chǔ)上實(shí)現(xiàn)客戶端和服務(wù)器之間的互相通信。
目前,Tatala支持Java的客戶端與服務(wù)器端,和C#的客戶端。
特性
* 簡(jiǎn)單易用可以快速開發(fā)和建立網(wǎng)絡(luò)組件
* 跨語(yǔ)言跨平臺(tái)
* 高性能和分布式
* 傳輸協(xié)議為短小精悍的二進(jìn)制
* 支持socket長(zhǎng)連接
* 客戶端與服務(wù)器端多線程處理
* 支持異步請(qǐng)求
* 對(duì)于大數(shù)據(jù)支持壓縮傳輸
* 支持服務(wù)器端主動(dòng)推送消息
* 客戶端程序可以捕獲服務(wù)端拋出的異常,使客戶端支持事務(wù)回滾
* 支持Google Protocol Buffers作為對(duì)象序列化進(jìn)行網(wǎng)絡(luò)傳輸
* 支持在服務(wù)端注冊(cè)多個(gè)filter,在調(diào)用業(yè)務(wù)代碼之前預(yù)處理傳入的數(shù)據(jù),注入業(yè)務(wù)邏輯,如權(quán)限檢查等
* 能夠用于跨語(yǔ)言的遠(yuǎn)程方法調(diào)用RPC,高性能的緩存服務(wù)器,分布式的消息服務(wù),多人在線游戲服務(wù)器,等等
快速開始
下載tatala.jar 包含在你項(xiàng)目的classpath中。
簡(jiǎn)單編程是Tatala第一考慮因素,所以用它建立RPC的方式,讓開發(fā)者感覺就像調(diào)用本地普通方法一樣簡(jiǎn)單。不用考慮網(wǎng)絡(luò),線程這些東西。
現(xiàn)在舉一個(gè)例子,假如我們有個(gè)服務(wù)器端的服務(wù)ExampleManager接口 和 ExampleManagerImpl實(shí)現(xiàn)類。
ExampleManager.java
public interface ExampleManager{
public String sayHello(int Id, String name);
}
ExampleManagerImpl.java
public class ExampleManagerImpl implements ExampleManager{
public String sayHello(int Id, String name) {
return "["+Id+"]"+"Hello "+name+" !";
}
}
我們還需要在服務(wù)端建立一個(gè)socket服務(wù)類來(lái)部署我們的業(yè)務(wù)邏輯,在這個(gè)例子中socket服務(wù)監(jiān)聽端口是10001。 ExampleServer.java
public class ExampleServer {
public static void main(String args[]) {
int listenPort = 10001;
int poolSize = 10;
AioSocketServer server = new AioSocketServer(listenPort, poolSize);
erver.start();
}
}
然后客戶端的代碼類似這樣:
EasyClient.java
public class EasyClient {
private static TransferObjectFactory transferObjectFactory;
private static ExampleManager manager;
public static void main(String[] args) {
transferObjectFactory = new TransferObjectFactory("127.0.0.1", 10001, 5000);
transferObjectFactory.setImplClass("ExampleManagerImpl");
manager = (ExampleManager)ClientProxyFactory.create(ExampleManager.class, transferObjectFactory);
String result = manager.sayHello(18, "JimT");
System.out.println("result: "+result);
}
}
創(chuàng)建一個(gè)TransferObjectFactory對(duì)象,設(shè)置server端的IP地址,端口號(hào)和超時(shí)時(shí)間。設(shè)置被調(diào)用的實(shí)現(xiàn)類的類名,建立proxy,調(diào)用方法。當(dāng)然我們需要把接口類(ExampleManager.class) 加入到客戶端的classpath里。這就是建立一個(gè)Tatala RPC的所有代碼,不需要任何配置文件,是不是很簡(jiǎn)單?
更多例子請(qǐng)看教程。
Tatala-中文教程
傳輸協(xié)議
在客戶端把調(diào)用的方法信息設(shè)置到transfer object里, Tatala把transfer object轉(zhuǎn)換成字節(jié)數(shù)組并且發(fā)送給服務(wù)器。在服務(wù)器端把接收到的字節(jié)數(shù)組再還原成包含調(diào)用信息的transfer object。包括被調(diào)用類名,目標(biāo)方法名,參數(shù)信息和返回類型等。Tatala 執(zhí)行器獲得調(diào)用信息執(zhí)行目標(biāo)方法。
支持類型
Tatala支持的參數(shù)和返回類型:
bool,byte,short,chat,int,long,float,double,Date,String,
byte[],int[],long[],float[],double[],String[],Serializable,Protobuf, WrapperClass
其它描述
需要JDK1.7,因?yàn)槭褂昧薐ava AIO。
第三方類庫(kù)包括Protobuf,Log4j。
License
Apache License Version 2.0
