RPC框架系列MessagePack
1.下载与安装
官方网站:http://msgpack.org/
下载地址:https://github.com/msgpack/msgpack-rpc, https://github.com/msgpack/msgpack
安装之前确保已经装了git和maven
- cd /usr/local/src
- mkdir msgpack
- cd msgpack
- git clone git://github.com/msgpack/msgpack.git
- git clone git://github.com/msgpack/msgpack-rpc.git
- cd msgpack/java
- mvn package
- cd ../../msgpack-rpc/java
- mvn package
安装成功后,将会在msgpack/msgpack/java/target目录中生成msgpack-0.*.*-devel.jar,会在msgpack/msgpack-rpc/java/target目录中生成msgpack-rpc-0.*.*-devel.jar
2.消息结构与服务接口
定义消息类比较简单,只需要给类加上注解@MessagePackMessage即可。
另一种不添加注解的方法是对类进行注册,如下所示:
- // You register your class before use.
- MessagePack.register(MyClass.class);
3.序列化
MessagePack在序列化数据中保存类型信息,每个数据以*type-data*或*type-length-data*模式存储。
MessagePack支持以下类型:
定长类型:
Integers:
Nil:
Boolean:
Floating point:
变长类型:
Raw bytes:
容器类型:
Arrays:
Maps:
每种类型有一或多个序列化格式。
3.1.Integer
positive fixnum:用1个字节保存一个整数,数值范围为[0,127]。
- |0XXXXXXX|
- => unsigned 8-bit 0XXXXXXX
negative fixnum:用1个字节保存一个整数,数值范围为[-32,-1]。
- |111XXXXX|
- => signed 8-bit 111XXXXX
uint8:用2个字节保存一个8位的unsigned integer。
- | 0xcc |XXXXXXXX|
- => unsigned 8-bit XXXXXXXX
uint16:用3个字节保存一个16位的unsigned integer。
- | 0xcd |XXXXXXXX|XXXXXXXX|
- => unsigned 16-bit big-endian XXXXXXXX_XXXXXXXX
uint32:用5个字节保存一个32位的unsigned integer。
- | 0xce |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
- => unsigned 32-bit big-endian XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX
uint64:用9个字节保存一个64位的unsigned integer。
- | 0xcf |XXXXXXXX| XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX |
- => unsigned 64-bit big-endian XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX
int8:用2个字节保存一个8位的signed integer。
- | 0xd0 |XXXXXXXX|
- => signed 8-bit XXXXXXXX
int16:用3个字节保存一个16位的signed integer。
- | 0xd1 |XXXXXXXX|XXXXXXXX|
- => signed 16-bit big-endian XXXXXXXX_XXXXXXXX
int32:用5个字节保存一个32位的signed integer。
- | 0xd2 |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
- => signed 32-bit big-endian XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX
int64:用9个字节保存一个64位的signed integer。
- | 0xd3 |XXXXXXXX| XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX |
- => signed 64-bit big-endian XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX
3.2.Nil
- | 0xc0 |
3.3.Boolean
true:
- | 0xc3 |
false:
- | 0xc2 |
3.4.Floating point
float:用5个字节保存。
- | 0xca |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
- => big-endian IEEE 754 single precision floating point number XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX
double:用9个字节保存。
- | 0xcb |XXXXXXXX| XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX |
- => big-endian IEEE 754 single precision floating point number XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX
3.5.Raw bytes
fix raw:最多保存31个字节。
- |101XXXXX|...N bytes
- => 000XXXXXX (=N) bytes of raw bytes.
raw 16:最多保存(2^16)-1个字节,长度以unsigned 16-bit big-endian integer存储。
- | 0xda |XXXXXXXX|XXXXXXXX|...N bytes
- => XXXXXXXX_XXXXXXXX (=N) bytes of raw bytes.
raw 32:最多保存(2^32)-1个字节,长度以unsigned 32-bit big-endian integer存储。
- | 0xdb |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|...N bytes
- => XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX (=N) bytes of raw bytes.
3.6.Arrays
fix array:最多保存15个元素。
- |1001XXXX|...N objects
- => 0000XXXX (=N) elements array.
array 16:最多保存 (2^16)-1个元素,元素的数量以unsigned 16-bit big-endian integer存储。
- | 0xdc |XXXXXXXX|XXXXXXXX|...N objects
- => XXXXXXXX_XXXXXXXX (=N) elements array.
array 32:最多保存 (2^32)-1个元素,元素的数量以unsigned 32-bit big-endian integer存储。
- | 0xdd |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|...N objects
- => XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX (=N) bytes of raw bytes.
3.7.Maps
fix map:最多保存15个元素。
- |1000XXXX|...N*2 objects
- => 0000XXXX (=N) elements map
- where odd elements are key and next element of the key is its associate value.
map16:最多保存 (2^16)-1个元素,元素的数量以unsigned 16-bit big-endian integer存储。
- | 0xde |XXXXXXXX|XXXXXXXX|...N*2 objects
- => XXXXXXXX_XXXXXXXX (=N) elements map
- where odd elements are key and next element of the key is its associate value.
map32:最多保存 (2^32)-1个元素,元素的数量以unsigned 32-bit big-endian integer存储。
- | 0xdf |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|...N*2 objects
- => XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX (=N) elements map
- where odd elements are key and next element of the key is its associate value.
4.rpc通信实现
定义消息Message.java:
- package msgpack;
- import org.msgpack.annotation.MessagePackMessage;
- @MessagePackMessage
- public class Message {
- // some attributes
- }
服务端实现Server.java:
- package msgpack;
- import org.msgpack.rpc.loop.EventLoop;
- public class Server {
- private int port;
- public Server(int port) {
- this.port = port;
- }
- public Message getMessage(Message msg) {
- // process request
- …
- return msg;
- }
- public void run() {
- try {
- EventLoop loop = EventLoop.defaultEventLoop();
- org.msgpack.rpc.Server svr = neworg.msgpack.rpc.Server();
- svr.serve(new Server(port));
- svr.listen(port);
- loop.join();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- if (args.length != 1) {
- System.out.println("Usage: Server port");
- return;
- }
- int port = Integer.parseInt(args[0]);
- new Server(port).run();
- }
- }
客户端实现Client.java:
- package msgpack;
- import java.util.Arrays;
- import org.msgpack.rpc.loop.EventLoop;
- public class Client {
- private int port;
- private String host;
- private int size;
- private int count;
- public static interface RPCInterface {
- Message getMessage(Message msg);
- }
- public Client(int port, String host, int size, int count){
- super();
- this.port = port;
- this.host = host;
- this.size = size;
- this.count = count;
- }
- public long run() {
- long start = 0;
- long end = 0;
- try {
- EventLoop loop = EventLoop.defaultEventLoop();
- org.msgpack.rpc.Client client = neworg.msgpack.rpc.Client(host, port, loop);
- RPCInterface iface =client.proxy(RPCInterface.class);
- Message msg = new Message();
- // initiate message
- …
- start = System.currentTimeMillis();
- for (int i = 0 ; i < count;i++) {
- iface.getMessage(msg);
- }
- end = System.currentTimeMillis();
- System.out.println(end - start);
- client.close();
- loop.shutdown();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return end - start;
- }
- public static void main(String[] args) {
- if (args.length != 4) {
- System.out.println("Usage: Client host port dataSize count");
- return;
- }
- String host = args[0];
- int port = Integer.parseInt(args[1]);
- int size = Integer.parseInt(args[2]);
- int count = Integer.parseInt(args[3]);
- new Client(port, host, size, count).run();
- }
- }
5.参考资料
(1) MessagePack QuickStart for Java:http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+Java
RPC框架系列MessagePack相关推荐
- RPC框架系列——Protocol Buffers
http://blog.jeoygin.org/2011/09/rpc-framework-protocol-buffers.html 1.下载与安装 官方网站:http://code.google. ...
- RPC框架系列——Avro
1.下载与安装 官方网站:http://avro.apache.org/ 下载地址:http://labs.renren.com/apache-mirror//avro/avro-1.5.1/avro ...
- 使用Akka实现简单RPC框架
使用Akka实现简单RPC框架 最近简单看了看Flink的RPC通讯相关的源码,它是通过Akka实现的,为了更好的阅读理解代码,又大体看了看Akka相关的知识.这篇文章主要记录了如果使用Akka来实现 ...
- server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
Thrift 是什么研究分布式调用链工具pinpoint的时候,在源码里看到了Thrift相关的代码,所以来了兴趣,想研究研究这个框架.Thrift 目前是 Apache 的一个项目,但是它是由fac ...
- 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架
优知学院 2019-01-22 18:43:51 之前持续分享的几十期阿里Java面试题中,几乎每次必问Dubbo,比如:"如何从0到1设计一个Dubbo的RPC框架",其实主要考 ...
- 新浪微博新兵训练营系列课程——平台RPC框架介绍
新浪微博新兵训练营系列课程--平台RPC框架介绍 课程大纲 1.RPC简介 1.1 什么是RPC 1.2 RPC与其他远程调用方式比较 2.Motan RPC框架 2.1 RPC服务框架 2.2 Mo ...
- RPC系列之Netty实现自定义RPC框架
进行这个章节之前,需要去看一下RMI的实现哈,如果了解过的童鞋可以直接跳过,如果没有或者不知道RMI的童鞋,移驾到下面的链接看完之后再回来继续看这篇 RPC系列之入门_阿小冰的博客-CSDN博客RPC ...
- RPC框架原理及从零实现系列博客(二):11个类实现简单RPC框架
项目1.0版本源码 https://github.com/wephone/Me... 在上一博文中 跟大家讲了RPC的实现思路 思路毕竟只是思路 那么这篇就带着源码给大家讲解下实现过程中的各个具体问题 ...
- java rpc 框架 常用_常用的RPC架构系列---gRPC
gRPC是谷歌的一个高性能,开源的高性能 RPC 框架,gRPC面向移动和HTTP/2设计.gRPC隐藏了底层的实现细节,包括序列化(json,xml),数据传输(TCP,HTTP,UDP),反序列化 ...
最新文章
- Bootstrap 栅格 样式 组件 插件
- 数据异常HTML,@ Html.DropDownListFor的数据绑定异常
- panda python_12个很棒的Pandas和NumPy函数,让分析事半功倍
- 转载python操作wps V9 API,测试好用
- excel文件修复工具_TunesKit Video Repair下载_视频文件修复工具官方版下载[修复工具]...
- 学习java.awt
- 银行叫号排队系统C语言,【分享】C语言 银行取票排队系统
- 爬取智联招聘岗位描述并根据描述生成词云
- c语言中不能在变量名函数名关键字中插入,C语言中,不能在变量名、函数名、关键字中插入空格和空行。...
- java 基准测试 格式_JMH java基准测试
- SpringBoot2 核心知识点
- 支持Genero BDL 4gl语言的编辑器
- windows删除注册表中多余信息及卸载残余应用
- Vant-area数据
- 基于opencv的BackgroundSubtractorMOG2和BackgroundSubtractorKNN通过背景减除来实现目标追踪
- 垃圾收集器G1和ZGC详解
- Unity 游戏存档框架实现
- c++中的前置和后置加加没你想的这么简单
- php微信公众号开发之网页授权
- 程苓峰:百度兵陷日本 市场份额跌至1%
热门文章
- IntelliJ IDEA 的安装、配置和使用
- 美人肩K线形态选股公式,选出强势整理再突破
- 【宋红康 MySQL数据库 】【高级篇】【02】MySQL字符集、比较规则、大小写规范、sql_mode
- Dell重装win7系统
- JavaWeb:request.getSession().invalidate()与request.getSession().removeAttribute()的区别
- 如何用路由器无线网络连接
- 平面设计学什么?培训学习与专业学习的差别
- 2021桂林市高考一调成绩查询,2021年广西桂林市高考生物一调试卷.docx
- 关于cd + 路径 无法进入指定路径的问题
- 排序算法之一——冒泡排序