RPC,MessagePack 的講解與案例

什麼是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":"研發部"}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章