什么是messagepack?
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":"研发部"}}
本文深入探讨RPC远程过程调用的概念,解析MessagePack的使用和优势,并通过具体案例展示如何在RPC中集成MessagePack进行高效的数据序列化。
3209

被折叠的 条评论
为什么被折叠?



