开发者社区> 摩云飞> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

常用的跨语言通信方案:

  • 基于 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 丰富;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
微服务6:通信之网关
微服务6:通信之网关
31 0
Go语言之通道
上一篇我们讲的原子函数和互斥锁,都可以保证共享数据的读写。但是呢,它们还是有点复杂,而且影响性能。对此,Go又为我们提供了一种工具,这就是通道。 所以在多个goroutine并发中,我们不仅可以通过原子函数和互斥锁保证对共享资源的安全访问,消除竞争的状态,还可以通过使用通道,在多个goroutine发送和接受共享的数据,达到数据同步的目的。
816 0
面试之C语言字符串操作总结大全(转载)
  趁着十一就好好补补数据结构吧,通信这个不软不硬的专业,现在还是得好好学学补习补习,,你这个非211的本科生!虽然拿到了一个offer,但是觉得时间还有,得继续拼一拼,希望不辜负! 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 s...
725 0
c语言中的字符数组与字符串
1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' )。
738 0
+关注
摩云飞
十年磨一剑,我还差几年~~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Instagram Direct 高效可靠的数据端到端传输
立即下载
通讯就是如此简单——构建简单、安全、应用丰富的企业云通信平台
立即下载
高性能Web架构之缓存体系
立即下载