1.MessagePack是一個基於二進制高效的對象序列化Library用於跨語言通信。
2.它可以像JSON那樣,在許多種語言之間交換結構對象;但是它比JSON更快速也更輕巧。
3.支持Python、Ruby、Java、C/C++、Javascript 等衆多語言。
4.比Google Protocol Buffers還要快4倍
在很多地方都有“數據交換”這個概念,本文所說的“數據交換” 是指在計算機網絡中,一個系統把數據傳遞給另外一個系統。這非常類似於一個人要告訴另外一個人一件事情。
下面是一個實例:
所需jar包
rpc-engine-1.0.jar
netty-3.2.1.Final.jar
jackson-all-1.8.2.jar
log4j-1.2.15.jar
slf4j-log4j12-1.4.3.jar
slf4j-api-1.4.3.jar
lamfire-1.1.jar
javassist-3.12.1.GA.jar
package com.vo;
import java.util.List;
/**
* 傳輸對象
* @author jacky
*
*/
public class User{
/**
*
*/
private static final long serialVersionUID = 7375286040851556274L;
public Long userId;
public String username;
public List<Address> address;
public Dept dept;
}
package com.vo;
public class Address {
public String name="廣州天河";
}
package com.vo;
public class Dept {
public String name="研發部";
}
package com.vo;
/**
* @author JACKY
* @version 1.1 Rcp 開放的接口類
*/
public interface UserService {
/**
* 根據用戶id獲取用戶信息
*
* @param userId
* @return byte 使用MessagePack字節碼
*/
public byte[] getUser(Long userId);
}
package com.server;
import java.util.ArrayList;
import java.util.List;
import org.serialize.MessagePack;
import com.vo.Address;
import com.vo.Dept;
import com.vo.User;
import com.vo.UserService;
/**
* 接口服務端的實現類
*
* @author jacky
*
*/
public class UserServiceImpl implements UserService {
public byte[] getUser(Long userId) {
System.out.println("start ========userid="+userId);
// 註冊傳輸對象,非基本對象一定要註冊
// TemplateRegistry.register(User.class);
// 註冊傳輸對象
MessagePack.register(User.class);
MessagePack.register(Dept.class);
MessagePack.register(Address.class);
User user = new User();
user.userId = userId;
user.username = "sunbin";
List<Address> address = new ArrayList<Address>();
address.add(new Address());
address.add(new Address());
user.address = address;
Dept dept=new Dept();
user.dept=dept;
// 封裝成二進制傳輸
byte[] data = MessagePack.pack(user);
return data;
}
}
package com.server;
import org.serialize.rpc.Server;
import org.serialize.rpc.loop.EventLoop;
public class RpcServer {
/**
* 啓動服務端的監聽
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 獲得監聽對象
EventLoop loop = EventLoop.defaultEventLoop();
// 獲取服務對象,並把服務的監聽對象loop引入
Server sever = new Server(loop);
// 服務對象的實現
sever.serve(new UserServiceImpl());
// 添加監聽端口
sever.listen(8080);
loop.join();
}
}
package com.client;
import org.serialize.MessagePack;
import org.serialize.rpc.Session;
import org.serialize.rpc.SessionPool;
import org.serialize.rpc.loop.EventLoop;
import org.serialize.template.TemplateRegistry;
import com.lamfire.utils.JSON;
import com.vo.Address;
import com.vo.Dept;
import com.vo.User;
import com.vo.UserService;
/**
* rpc的客戶端調用
*
* @author jacky
*
*/
public class RpcClient {
public static void main(String[] args) throws Exception {
// 註冊跟服務端一樣的對象,非基本對象一定要註冊
TemplateRegistry.register(User.class);
MessagePack.register(Address.class);
MessagePack.register(Dept.class);
// 註冊跟服務端一樣的對象
// MessagePack.register(User.class);
// 獲取EventLoop對象
EventLoop loop = EventLoop.defaultEventLoop();
// 獲取session池sessionPool
SessionPool pool = new SessionPool(loop);
/**
* 服務端的host,服務端的port
*/
Session session = pool.getSession("127.0.0.1", 8080);
// 代理接口地址
UserService service = session.proxy(UserService.class);
// 接口調用
byte[] data = service.getUser(34535345l);
// 解析對封裝的對象
User user = MessagePack.unpack(data, User.class);
// 打印通過接口獲取的數據
System.out.println(JSON.toJsonString(user));
}
}
客戶端打印的信息爲
{"userId":34535345,"username":"sunbin","address":[{"name":"廣州天河"},{"name":"廣州天河"}],"dept":{"name":"研發部"}}