本文从概念及用法等层面对Thrift进行一个总结,对于IDL方式的实现还没有实际进行过相关代码编写。
定义
Thrift 最初由Facebook开发,而后捐献给Apache,目前已广泛应用于业界。Thrift 正如其官方主页介绍的,“是一种可扩展、跨语言的服务开发框架”。目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。关于Thrift的详细可以参Apache Thrift - 可伸缩的跨语言服务开发框架(https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/) Thrift入门与实战(https://segmentfault.com/a/1190000008606491),对IDL方式进行了介绍及代码编写。
SOAP:基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
具体关于SOAP的介绍可以参见http://www.w3school.com.cn/soap/soap_syntax.asp
Thrift注解与IDL对比
thrift作为跨语言的RPC框架,得到大量使用,而thrift支持注解格式与idl生成JavaBean两种方式。总结两者的特点如下:
注解格式的优势:
- IDE代码简洁;2. java间相互调用时,JavaBean是可以直接共享的;3. 支持java的Deprecated语法。
在这里穿插介绍一下java注解:
Java中的注解/注释详解(Override/Deprecated/SuppressWarning)
Java中的注释主要有以下三种:Override/Deprecated/SuppressWarning,接下来我们主要讨论这3个注解的内容。
一,什么是注释(注解) 在Java中,注解和注释,我们可以理解为同一个概念。说起注释,我们需要先知道什么是元metadata,这个单词我们国内一般翻译为元数据,所谓元数据,就是数据的数据。也就是说,元数据存在的意义,就是为了描述数据。有了元数据的概念以后,我们就可以把注释称作Java代码的元数据。二,Override 这个注释的作用,是用来标识当前的方法,是否覆盖了它的父类中的方法。为什么要用Override注释呢?个人的理解,它更多的起到的作用是规范Java代码的编写,方便程序员使用,减少产生BUG的机会。关于这一点,我们可以通过下面2种方式来证明。第一种方式:源代码经过编译后,用反编译工具JD打开后,所有Override注释的部分都没有了;第二种方式:从JVM的角度来看,在Class文件的结构中,没有注释内容的定义。
三,Deprecated Deprecated注释是一个标记注释。所谓标记注释,就是已经过期或者即将过期的方法,不推荐我们使用。这个方法不推荐使用的原因,可能是存在安全问题,或者是有了更好的方法来替代他。源代码中加入这个标记后,并不影响程序的编译,但加上这个标记后,编译器会显示一些警告信息。例如当我们使用myeclipse写代码时,使用提示功能:String str = “yangcq”;str.当我们输入str.以后,myeclipse会提示String类的所有可用方法,这时,我们找到getBytes这个方法,发现有些不同,方法前面多了一个斜线。这个就是过期的方法,说明getBytes方法使用了@Deprecated注释。
四,SuppressWarnings SuppressWarnings的作用,通过英文单词的意思,就可以看出来。Suppress是阻止的意思,Suppress Warnings就是阻止警告信息的提示。在Java中,如果一个方法存在未经检查或者不安全的操作,编译器会提示警告信息。例如我们最常见的Map和List泛型的问题,请看下面的写法:Map map = new HashMap();Map
Thrift注解开发规范
现在很多依赖facebook swift项目的注解实现部分,例如@ThriftService与@ThriftMethod等使用