RPC中間件:Tatala
這個項目最早(2008年)是用于一個網絡游戲的Cache Server,以及一個電子商務的Web Session服務。后來不斷增加新的功能,除了Java還支持C#,到現在已經可以用它來開發網絡游戲的服務器。等過些日子我還會開源網絡游戲的服務器源碼。
關于性能,當時后臺相應請求的效率是每秒10W次,現在我在自己的筆記本上測,只有一個客戶端與服務器都在一個物理機上(CPU: i7-3610QM; RAM: 8G; OS: Win7-64),每秒相應12000個請求。
Tatala最大的特點是簡單,性能是第二考慮能夠滿足大部分應用就行。因為性能可以通過增加機器得到提升,而代碼簡單意味著雇更少的人更快的開發。老板省錢,程序員輕松才是最重要的。
下面是簡單介紹。
概述
Tatala是一個簡單易用的RPC中間件,并且跨語言跨平臺。它將調用方法轉變成字節數組(包括被調用類名,目標方法名,參數序列和返回值),在socket基礎上實現客戶端和服務器之間的互相通信。
目前,Tatala支持Java的客戶端與服務器端,和C#的客戶端。
特性
* 簡單易用可以快速開發和建立網絡組件
* 跨語言跨平臺
* 高性能和分布式
* 傳輸協議為短小精悍的二進制
* 支持長短兩種socket 連接
* 客戶端與服務器端多線程處理
* 支持異步請求
* 對于大數據支持壓縮傳輸
* 能夠用于跨語言的遠程方法調用RPC,高性能的緩存服務器,分布式的消息服務,多人在線游戲服務器,等等
快速開始
下載tatala.jar 包含在你項目的classpath中。
簡單是Tatala第一考慮因素,所以用它建立RPC的方式,讓開發者感覺就像調用本地普通方法一樣簡單。不用考慮網絡,線程這些東西。
現在舉一個例子,假如我們有個服務器端的服務TestManager接口 和 TestManagerImpl實現類。
TestManager.java
Java代碼
-
public interface TestManager {
-
public String sayHello(int Id, String name);
-
}
TestManagerImpl.java
Java代碼
-
public class TestManagerImpl implements TestManager{
-
public String sayHello(int Id, String name) {
-
return "["+Id+"]"+"Hello "+name+" !";
-
}
-
}
我們還需要在服務端建立一個socket服務類來部署我們的業務邏輯,在這個例子中socket服務監聽端口是10001。
TestServer.java
Java代碼
-
public class TestServer {
-
public static void main(String args[]) {
-
int listenPort = 10001;
-
int poolSize = 10;
-
AioSocketServer server = new AioSocketServer(listenPort, poolSize);
-
server.start();
-
}
-
}
然后客戶端的代碼類似這樣:
EasyClient.java
Java代碼
-
public class EasyClient {
-
private static TransferObjectFactory transferObjectFactory;
-
private static TestManager manager;
-
-
public static void main(String[] args) {
-
transferObjectFactory = new TransferObjectFactory("test1", true);
-
transferObjectFactory.setImplClass("TestManagerImpl");
-
manager = (TestManager)ClientProxyFactory.create(TestManager.class, transferObjectFactory);
-
-
int Id = 18;
-
String name = "JimT";
-
String result = manager.sayHello(Id, name);
-
System.out.println("result: "+result);
-
}
-
}
當然我們需要把接口類(TestManager.class) 加入到客戶端的classpath里。客戶端還需要一個配置文件controller.xml列出要被客戶端調用的服務器端程序的IP, port和連接名。 (注意連接名“test1”)
controller.xml
Xml代碼
-
<connections>
-
<connection>
-
<hostIp>127.0.0.1hostIp>
-
<hostPort>10001hostPort>
-
<timeout>5000timeout>
-
<retryTime>3retryTime>
-
<name>test1name>
-
connection>
-
connections>
這就是所有代碼和配置對于建立一個Tatala RPC。
更多例子請看教程。
Tatala-中文教程
傳輸協議
在客戶端把調用的方法信息設置到transfer object里, Tatala把transfer object轉換成字節數組并且發送給服務器。在服務器端把接收到的字節數組再還原成包含調用信息的transfer object。包括被調用類名,目標方法名,參數信息和返回類型等。Tatala 執行器獲得調用信息執行目標方法。
支持類型
Tatala支持的參數和返回類型:
bool,byte,short,chat,int,long,float,double,Date,String,
byte[],int[],long[],float[],double[],String[],Serializable,WrapperClass
其它描述
需要JDK1.7,因為使用了Java AIO。
第三方類庫包括XSteam,Log4j。
License
Apache License Version 2.0