分享一个简单易用的RPC开源项目—Tatala
http://zijan.iteye.com/blog/2041894
这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务。后来不断增加新的功能,除了Java还支持C#,到现在已经可以用它来开发网络游戏的服务器。等过些日子我还会开源网络游戏的服务器源码。
关于性能,当时后台相应请求的效率是每秒10W次,现在我在自己的笔记本上测,只有一个客户端与服务器都在一个物理机上(CPU: i7-3610QM; RAM: 8G; OS: Win7-64),每秒相应12000个请求。
tatala-client-csharp已经上传,同样在笔记本上测试,一个c#客户端一个Java服务端都在一台机器上,每秒响应22000个请求。c#客户端除了性能测试的例子还有一个演示Server推送的聊天室例子。
Tatala最大的特点是简单,性能是第二考虑能够满足大部分应用就行。因为性能可以通过增加机器得到提升,而代码简单意味着雇更少的人更快的开发。老板省钱,程序员轻松才是最重要的。
开源地址:
https://github.com/zijan/Tatala
下面是简单介绍。
概述
Tatala是一个简单易用的RPC中间件,并且跨语言跨平台。它将调用方法转变成字节数组(包括被调用类名,目标方法名,参数序列和返回值),在socket基础上实现客户端和服务器之间的互相通信。
目前,Tatala支持Java的客户端与服务器端,和C#的客户端。
特性
* 简单易用可以快速开发和建立网络组件
* 跨语言跨平台
* 高性能和分布式
* 传输协议为短小精悍的二进制
* 支持长短两种socket 连接
* 客户端与服务器端多线程处理
* 支持异步请求
* 对于大数据支持压缩传输
* 能够用于跨语言的远程方法调用RPC,高性能的缓存服务器,分布式的消息服务,多人在线游戏服务器,等等
快速开始
下载tatala.jar 包含在你项目的classpath中。
简单是Tatala第一考虑因素,所以用它建立RPC的方式,让开发者感觉就像调用本地普通方法一样简单。不用考虑网络,线程这些东西。
现在举一个例子,假如我们有个服务器端的服务TestManager接口 和 TestManagerImpl实现类。
TestManager.java
- public interface TestManager {
- public String sayHello(int Id, String name);
- }
TestManagerImpl.java
- public class TestManagerImpl implements TestManager{
- public String sayHello(int Id, String name) {
- return "["+Id+"]"+"Hello "+name+" !";
- }
- }
我们还需要在服务端建立一个socket服务类来部署我们的业务逻辑,在这个例子中socket服务监听端口是10001。
TestServer.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
- 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
- <connections>
- <connection>
- <hostIp>127.0.0.1</hostIp>
- <hostPort>10001</hostPort>
- <timeout>5000</timeout>
- <retryTime>3</retryTime>
- <name>test1</name>
- </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
分享一个简单易用的RPC开源项目—Tatala的更多相关文章
- 分享一个简单易用的软件定时器模块(MultiTimer)——基于keil+stm32f103zet+hal库(裸机实现)
公众号上看到一个比较好的一个github项目:https://github.com/0x1abin/MultiTimer 今天看了看,简单的,就移植了- 且看文档的说明, ============== ...
- 一个简单易用的容器管理平台-Humpback
什么是Humpback? 在回答这个问题前,我们得先了解下什么的 Docker(哦,现在叫 Moby,文中还是继续称 Docker). 在 Docker-百度百科 中,对 Docker 已经解释得很清 ...
- C# 编写一个简单易用的 Windows 截屏增强工具
半年前我开源了 DreamScene2 一个小而快并且功能强大的 Windows 动态桌面软件.有很多的人喜欢,这使我有了继续做开源的信心.这是我的第二个开源作品 ScreenshotEx 一个简单易 ...
- .Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式
.Net Excel 导出图表Demo(柱状图,多标签页) 1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一 ...
- 分享一个简单的C#的通用DbHelper类(支持数据连接池)
每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...
- 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目
看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager
大家好, 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager . ServerFulManager 的 目标 是 实现一个 支持 ServerFu ...
- FineBI:一个简单易用的自助BI工具
过去,有关企业数据分析的重担都压在IT部门,传统BI分析更多面向的是具有IT背景的人员.但随着业务分析需求的增加,很多公司都希望为业务用户提供自助分析服务,将分析工作落实到业务人员手中.但同时,分析工 ...
随机推荐
- Andorid 反编译App
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23564065 开发的过程中,有时候可能会去使用别的app里面的图片,参考布局甚至 ...
- (原创)JAVA多线程二线程池
一,线程池的介绍 线程池包括一下三种: 线程池名称 创建方法 特点 其他 固定大小线程池 ExecutorService threadpool = Executors.newFixedThreadPo ...
- 玩 perf
有一个进程happy在执行,另一个进程spy发送了一个信号把happy给杀死了 我怎么能通过perf抓到spy进程? happy进程一直执行 在spy进程中调用kill(happy's pid) ,发 ...
- docker-compose启动的tomcat无法远程连接jmx
最近想学习下java GC优化,就用了一下VisualVM,在远程服务器启动了一个非docker的tomcat,很顺利的就连接了,但是用docker-compose启动的服务却 怎么也连不上,一定是d ...
- C3P0数据源的使用
1.C3P0数据源的使用 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.C3P0有自己的格式文件,如下 <?xml version= ...
- 安全稳定实现redis cluster自动化迁移
背景 目前redis集群最火的是codis和redis cluster(官方),但官方自带工具并没有支持密码操作.那么需要密码认证使用redis cluster集群的同学要仔细看了哦. 相信大家很多人 ...
- C/C++中的声明与定义
含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...
- java-json日期字符串转换
String valueStr = value.toString(); if(StringUtils.isBlank(valueStr) || "null".equals(valu ...
- Opencv 完美配置攻略(Win8.1 + Opencv 2.4.8 + VS 2013)
- bzoj 3295 动态逆序对 CDQ分支
容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...