1.下载与安装

  官方网站:http://msgpack.org/

  下载地址:https://github.com/msgpack/msgpack-rpc, https://github.com/msgpack/msgpack

  安装之前确保已经装了git和maven

  1. cd /usr/local/src
  2. mkdir msgpack
  3. cd msgpack
  4. git clone git://github.com/msgpack/msgpack.git
  5. git clone git://github.com/msgpack/msgpack-rpc.git
  6. cd msgpack/java
  7. mvn package
  8. cd ../../msgpack-rpc/java
  9. mvn package

  安装成功后,将会在msgpack/msgpack/java/target目录中生成msgpack-0.*.*-devel.jar,会在msgpack/msgpack-rpc/java/target目录中生成msgpack-rpc-0.*.*-devel.jar

2.消息结构与服务接口

  定义消息类比较简单,只需要给类加上注解@MessagePackMessage即可。

  另一种不添加注解的方法是对类进行注册,如下所示:

  1. // You register your class before use.
  2. 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]。

  1. |0XXXXXXX|
  2. => unsigned 8-bit 0XXXXXXX

  negative fixnum:用1个字节保存一个整数,数值范围为[-32,-1]。

  1. |111XXXXX|
  2. => signed 8-bit 111XXXXX

  uint8:用2个字节保存一个8位的unsigned integer。

  1. |  0xcc  |XXXXXXXX|
  2. => unsigned 8-bit XXXXXXXX

  uint16:用3个字节保存一个16位的unsigned integer。

  1. |  0xcd  |XXXXXXXX|XXXXXXXX|
  2. => unsigned 16-bit big-endian XXXXXXXX_XXXXXXXX

  uint32:用5个字节保存一个32位的unsigned integer。

  1. |  0xce  |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
  2. => unsigned 32-bit big-endian XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX

  uint64:用9个字节保存一个64位的unsigned integer。

  1. |  0xcf  |XXXXXXXX| XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX |
  2. => unsigned 64-bit big-endian XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX

  int8:用2个字节保存一个8位的signed integer。

  1. |  0xd0  |XXXXXXXX|
  2. => signed 8-bit XXXXXXXX

  int16:用3个字节保存一个16位的signed integer。

  1. |  0xd1  |XXXXXXXX|XXXXXXXX|
  2. => signed 16-bit big-endian XXXXXXXX_XXXXXXXX

  int32:用5个字节保存一个32位的signed integer。

  1. |  0xd2  |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
  2. => signed 32-bit big-endian XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX

  int64:用9个字节保存一个64位的signed integer。

  1. |  0xd3  |XXXXXXXX| XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX |
  2. => signed 64-bit big-endian XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX

3.2.Nil

  1. |  0xc0  |

3.3.Boolean

  true:

  1. |  0xc3  |

  false:

  1. |  0xc2  |

3.4.Floating point

  float:用5个字节保存。

  1. |  0xca  |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
  2. => big-endian IEEE 754 single precision floating point number XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX

  double:用9个字节保存。

  1. |  0xcb  |XXXXXXXX| XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX | XXXXXXXX |
  2. => big-endian IEEE 754 single precision floating point number XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX _ XXXXXXXX

3.5.Raw bytes

  fix raw:最多保存31个字节。

  1. |101XXXXX|...N bytes
  2. => 000XXXXXX (=N) bytes of raw bytes.

  raw 16:最多保存(2^16)-1个字节,长度以unsigned 16-bit big-endian integer存储。

  1. |  0xda  |XXXXXXXX|XXXXXXXX|...N bytes
  2. => XXXXXXXX_XXXXXXXX (=N) bytes of raw bytes.

  raw 32:最多保存(2^32)-1个字节,长度以unsigned 32-bit big-endian integer存储。

  1. |  0xdb  |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|...N bytes
  2. => XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX (=N) bytes of raw bytes.

3.6.Arrays

  fix array:最多保存15个元素。

  1. |1001XXXX|...N objects
  2. => 0000XXXX (=N) elements array.

  array 16:最多保存 (2^16)-1个元素,元素的数量以unsigned 16-bit big-endian integer存储。

  1. |  0xdc  |XXXXXXXX|XXXXXXXX|...N objects
  2. => XXXXXXXX_XXXXXXXX (=N) elements array.

  array 32:最多保存 (2^32)-1个元素,元素的数量以unsigned 32-bit big-endian integer存储。

  1. |  0xdd  |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|...N objects
  2. => XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX (=N) bytes of raw bytes.

3.7.Maps

  fix map:最多保存15个元素。

  1. |1000XXXX|...N*2 objects
  2. => 0000XXXX (=N) elements map
  3. 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存储。

  1. |  0xde  |XXXXXXXX|XXXXXXXX|...N*2 objects
  2. => XXXXXXXX_XXXXXXXX (=N) elements map
  3. 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存储。

  1. |  0xdf  |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|...N*2 objects
  2. => XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX (=N) elements map
  3. where odd elements are key and next element of the key is its associate value.

4.rpc通信实现

  定义消息Message.java:

  1. package msgpack;
  2. import org.msgpack.annotation.MessagePackMessage;
  3. @MessagePackMessage
  4. public class Message {
  5. // some attributes
  6. }

  服务端实现Server.java:

  1. package msgpack;
  2. import org.msgpack.rpc.loop.EventLoop;
  3. public class Server {
  4. private int port;
  5. public Server(int port) {
  6. this.port = port;
  7. }
  8. public Message getMessage(Message msg) {
  9.     // process request
  10. return msg;
  11. }
  12. public void run() {
  13. try {
  14. EventLoop loop = EventLoop.defaultEventLoop();
  15. org.msgpack.rpc.Server svr = neworg.msgpack.rpc.Server();
  16. svr.serve(new Server(port));
  17. svr.listen(port);
  18. loop.join();
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. public static void main(String[] args) {
  24. if (args.length != 1) {
  25. System.out.println("Usage: Server port");
  26. return;
  27. }
  28. int port = Integer.parseInt(args[0]);
  29. new Server(port).run();
  30. }
  31. }

  客户端实现Client.java:

  1. package msgpack;
  2. import java.util.Arrays;
  3. import org.msgpack.rpc.loop.EventLoop;
  4. public class Client {
  5. private int port;
  6. private String host;
  7. private int size;
  8. private int count;
  9. public static interface RPCInterface {
  10. Message getMessage(Message msg);
  11. }
  12. public Client(int port, String host, int size, int count){
  13. super();
  14. this.port = port;
  15. this.host = host;
  16. this.size = size;
  17. this.count = count;
  18. }
  19. public long run() {
  20. long start = 0;
  21. long end = 0;
  22. try {
  23. EventLoop loop = EventLoop.defaultEventLoop();
  24. org.msgpack.rpc.Client client = neworg.msgpack.rpc.Client(host, port, loop);
  25. RPCInterface iface =client.proxy(RPCInterface.class);
  26. Message msg = new Message();
  27. // initiate message
  28. start = System.currentTimeMillis();
  29. for (int i = 0 ; i < count;i++) {
  30. iface.getMessage(msg);
  31. }
  32. end = System.currentTimeMillis();
  33. System.out.println(end - start);
  34. client.close();
  35. loop.shutdown();
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. return end - start;
  40. }
  41. public static void main(String[] args) {
  42. if (args.length != 4) {
  43. System.out.println("Usage: Client host port dataSize count");
  44. return;
  45. }
  46. String host = args[0];
  47. int port = Integer.parseInt(args[1]);
  48. int size = Integer.parseInt(args[2]);
  49. int count = Integer.parseInt(args[3]);
  50. new Client(port, host, size, count).run();
  51. }
  52. }

5.参考资料

  (1) MessagePack QuickStart for Java:http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+Java

RPC框架系列MessagePack相关推荐

  1. RPC框架系列——Protocol Buffers

    http://blog.jeoygin.org/2011/09/rpc-framework-protocol-buffers.html 1.下载与安装 官方网站:http://code.google. ...

  2. RPC框架系列——Avro

    1.下载与安装 官方网站:http://avro.apache.org/ 下载地址:http://labs.renren.com/apache-mirror//avro/avro-1.5.1/avro ...

  3. 使用Akka实现简单RPC框架

    使用Akka实现简单RPC框架 最近简单看了看Flink的RPC通讯相关的源码,它是通过Akka实现的,为了更好的阅读理解代码,又大体看了看Akka相关的知识.这篇文章主要记录了如果使用Akka来实现 ...

  4. server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...

    Thrift 是什么研究分布式调用链工具pinpoint的时候,在源码里看到了Thrift相关的代码,所以来了兴趣,想研究研究这个框架.Thrift 目前是 Apache 的一个项目,但是它是由fac ...

  5. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    优知学院 2019-01-22 18:43:51 之前持续分享的几十期阿里Java面试题中,几乎每次必问Dubbo,比如:"如何从0到1设计一个Dubbo的RPC框架",其实主要考 ...

  6. 新浪微博新兵训练营系列课程——平台RPC框架介绍

    新浪微博新兵训练营系列课程--平台RPC框架介绍 课程大纲 1.RPC简介 1.1 什么是RPC 1.2 RPC与其他远程调用方式比较 2.Motan RPC框架 2.1 RPC服务框架 2.2 Mo ...

  7. RPC系列之Netty实现自定义RPC框架

    进行这个章节之前,需要去看一下RMI的实现哈,如果了解过的童鞋可以直接跳过,如果没有或者不知道RMI的童鞋,移驾到下面的链接看完之后再回来继续看这篇 RPC系列之入门_阿小冰的博客-CSDN博客RPC ...

  8. RPC框架原理及从零实现系列博客(二):11个类实现简单RPC框架

    项目1.0版本源码 https://github.com/wephone/Me... 在上一博文中 跟大家讲了RPC的实现思路 思路毕竟只是思路 那么这篇就带着源码给大家讲解下实现过程中的各个具体问题 ...

  9. java rpc 框架 常用_常用的RPC架构系列---gRPC

    gRPC是谷歌的一个高性能,开源的高性能 RPC 框架,gRPC面向移动和HTTP/2设计.gRPC隐藏了底层的实现细节,包括序列化(json,xml),数据传输(TCP,HTTP,UDP),反序列化 ...

最新文章

  1. Bootstrap 栅格 样式 组件 插件
  2. 数据异常HTML,@ Html.DropDownListFor的数据绑定异常
  3. panda python_12个很棒的Pandas和NumPy函数,让分析事半功倍
  4. 转载python操作wps V9 API,测试好用
  5. excel文件修复工具_TunesKit Video Repair下载_视频文件修复工具官方版下载[修复工具]...
  6. 学习java.awt
  7. 银行叫号排队系统C语言,【分享】C语言 银行取票排队系统
  8. 爬取智联招聘岗位描述并根据描述生成词云
  9. c语言中不能在变量名函数名关键字中插入,C语言中,不能在变量名、函数名、关键字中插入空格和空行。...
  10. java 基准测试 格式_JMH java基准测试
  11. SpringBoot2 核心知识点
  12. 支持Genero BDL 4gl语言的编辑器
  13. windows删除注册表中多余信息及卸载残余应用
  14. Vant-area数据
  15. 基于opencv的BackgroundSubtractorMOG2和BackgroundSubtractorKNN通过背景减除来实现目标追踪
  16. 垃圾收集器G1和ZGC详解
  17. Unity 游戏存档框架实现
  18. c++中的前置和后置加加没你想的这么简单
  19. php微信公众号开发之网页授权
  20. 程苓峰:百度兵陷日本 市场份额跌至1%

热门文章

  1. IntelliJ IDEA 的安装、配置和使用
  2. 美人肩K线形态选股公式,选出强势整理再突破
  3. 【宋红康 MySQL数据库 】【高级篇】【02】MySQL字符集、比较规则、大小写规范、sql_mode
  4. Dell重装win7系统
  5. JavaWeb:request.getSession().invalidate()与request.getSession().removeAttribute()的区别
  6. 如何用路由器无线网络连接
  7. 平面设计学什么?培训学习与专业学习的差别
  8. 2021桂林市高考一调成绩查询,2021年广西桂林市高考生物一调试卷.docx
  9. 关于cd + 路径 无法进入指定路径的问题
  10. 排序算法之一——冒泡排序