文档章节

【转载】跨语言通信方案比较

摩云飞
 摩云飞
发布于 2014/08/12 15:46
字数 886
阅读 170
收藏 4

常用的跨语言通信方案:

  • 基于 SOAP 消息格式的 WebService ;
  • 基于 JSON 消息格式的 RESTful 服务;

以上两种方案的弊端:

  • XML 体积太大,解析性能极差;
  • JSON 体积相对较小,解析相对较快,但表达能力较弱;

于是探索一下现在比较流行的跨语言通信方案:

Google protobuf

Protocol Buffers 是 Google 公司开发的一种数据描述语言;
可用于数据存储、通信协议等方面,它不依赖于语言和平台,并且可扩展性极强;
现阶段官方支持 C++、JAVA、Python 等三种编程语言,但可以找到大量的、几乎涵盖所有语言的第三方扩展包;
消息格式定义采用 proto 文件;

应用

  • Google 内部

优点

  • 二进制消息,性能好、效率高(空间和时间效率都很不错);
  • 基于 proto 文件生成目标代码,简单易用;
  • 序列化/反序列化直接对应程序中的数据类,不需要解析后再进行映射(XML 与 JSON 也都属于这种方式);
  • 支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级;
  • 支持多种语言(可以把 proto 文件看做 IDL 文件);
  • 与 Netty 等一些框架集成;

缺点

  • 官方只支持 C++, JAVA 和 Python 语言绑定;
  • 二进制可读性差(貌似提供了 Text_Fromat 功能);
  • 二进制不具有自描述特性;
  • 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
  • 只涉及序列化和反序列化技术,不涉及 RPC 功能(类似 XML 或者 JSON 的解析器)

Apache Thrift

Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架;
现在已经转到 Apache 组织下,提供数据序列化功能和 RPC 服务能力;
支持 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等语言;
消息格式定义采用 thrift 文件;

应用

优点

  • 支持非常多的语言绑定;
  • thrift 文件生成目标代码,简单易用;
  • 消息定义文件支持注释
  • 数据结构与传输表现的分离,支持多种消息格式;
  • 包含完整的客户端/服务端堆栈,可快速实现 RPC
  • 支持同步和异步通信

缺点

  • 和 protobuf 一样不支持动态特性;

Apache Avro

Avro 出自 Hadoop 之父 Doug Cutting ;
目标是推出标准性的、用于云计算的、数据交换和存储协议;
支持 C, C++, Java, Python, Ruby, PHP 等语言;
消息格式定义采用 JSON 描述;

应用

优点

  • 二进制消息,性能好/效率高;
  • 使用 JSON 描述模式;
  • 模式和数据统一存储,消息自描述,不需要生成 stub 代码(支持生成 IDL);
  • RPC 调用在握手阶段交换模式定义;
  • 包含完整的客户端/服务端堆栈,可快速实现 RPC;
  • 支持同步和异步通信;
  • 支持动态消息;
  • 模式定义允许定义数据的排序(序列化时会遵循这个顺序);
  • 提供了基于 Jetty 内核的服务基于 Netty 的服务;

缺点

  • 只支持 Avro 自己的序列化格式;
  • 语言绑定不如 Thrift 丰富;



本文转载自:http://www.guoyukun.cn/post/protobuf-thrift-avro/

摩云飞
粉丝 375
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
轻量级RPC框架--harpc

基于Thrift的跨语言、高可用、高性能、轻量级的RPC框架。 功能介绍 跨语言通信 方便的使Java、Python、C++三种程序可以相互通信 负载均衡和容灾处理 方便的实现任务的分布式处理 支持服务的水...

dsfan
2015/10/17
5.3K
0
面向对象的 WebAPI 框架 XXL-HEX V1.1.0 发布

新版本 V1.1.0 新特性速览 1、面向对象: 一个API接口对应 "一个Handler" 和 "Requset对象/Response对象"; 针对Web API开发 (如 Android、IOS 等APP接口开发, 或者 unity3d 等游戏接口开发), ......

许雪里
2016/09/16
1K
7
面向对象的WebAPI框架--xxl-hex

《面向对象的WebAPI框架XXL-HEX》 一、简介 1.1 概述 XXL-HEX 是一个简单易用的WebAPI框架, 拥有 "面向对象、数据加密、跨语言" 的特点。目标是: 提高Web API (如 Android、IOS 等APP接口, 或...

许雪里
2015/11/29
1K
0
如何设计一个RPC系统

版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qcloud.com/community RPC是一种方便的网络通信编程...

偶素浅小浅
2016/11/07
25
0
XXL-HEX v1.2.0,面向对象的 WebAPI 框架

版本1.2.0新特性 1、Client端,新增Javascript版本实现:前端JS可使用提供的Client,直接调用XXL-HEX的加密API接口; (示例文件见 "xxl-hex/xxl-hex-example/src/main/webapp/jsclient.html...

许雪里
2016/10/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

postman批量测试

postman批量调用: 先单个调用,成功了 再save为collection 再点击三角形,点击run 设置1000次,run就可以 见《postman批量测试.docx》

Danni3
10分钟前
3
0
js 对象操作 js 对象和对象赋值 去除关联性 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

当我们在项目需要 复制一个对象到另一个对象并且 被复制的对象不能受复制后的对象的影响。 我先总结下 我们哪些方法可以复制对象 // 直接赋值var obj1 = { a: 1 };var obj2 = obj1;...

xiaogg
11分钟前
1
0
Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为C...

倚天码农
25分钟前
1
0
QML笔记-对QML中信号与槽的基本认识

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq78442761/article/details/90753986 目录 基本概念 演示...

shzwork
32分钟前
2
0
SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

xiangyunyan
51分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部