本文共 2868 字,大约阅读时间需要 9 分钟。
目录
远程调用,是指进程间的功能调用。进程和进程既可以在于同一台计算机,也可以存在于不同的计算机上。远程并不是指距离上的远程,而是指由于进程和进程之间彼此隔离,跨越进程的边界,才叫远程。Web API就是一种可以被远程调用的服务。让我们来了解一下什么是远程调用,以及为什么Web API这种远程过程调用方式这么流行。
利用计算机的套接字,开启TCP/UDP端口来传递数据,是最古老的一种远程调用方式,所谓套接字(socket)是指源IP地址加端口号和目标IP地址加端口号的组合。套接字可以清晰地表明数据从哪里传递到哪里,并可以清晰地表明调用服务的客户端和提供服务的服务端。因为端口号在特定时间只能被一个程序占用。
套接字的传输协议一般是TCP或者UDP协议。TCP或者UDP协议位于OSI七层协议的传输层,这就意味着调用和提供服务的两端必须要自己定义传输数据的应用层协议。同时,最简单的套接字通信是阻塞式的。为了实现阻塞式的套接字通信和业务逻辑之间的协同,程序员往往需要自行控制套接字线程和业务逻辑线程之间的同步操作。这就给程序员编程带来了较大的复杂性。当然,后来的Windows也提供了异步套接字API,其本质是通过隐藏窗口的消息泵来控制数据的收发,系统开销较大。鉴于此,绝大多数的介绍Windows和Linux开发的书籍都会把套接字编程作为一个单独的章节来讲。
目前Windows上仍有很多服务程序采用套接字的通信机制。如下图所示,TCPView工具显示本机有很多的基于套接字的远程调用通信。
另一个基于套接字的著名服务是SQL Server。大家都知道SQL Server的服务是通过默认端口1433提供的。任意客户端如SQL Management Studio、sqlcmd.exe等都是需要通过链接SQL服务器的1433端口,并传递SQL语句给服务器获取查询结果。
20世纪90年代,组件技术非常盛行。微软推出了COM,UNLX世界推出了CORBA。组件技术在当时的技术条件下,很好地解决了程序功能之间的耦合度和多态问题,使得程序员可以开发一些功能通用的代码,再将这些代码像推积木一样组成一个具有特定功能的程序。
微软推出的组件技术叫做COM,为了让COM组件的服务端和客户端之间进行通讯(其实这也是远程调用),微软设计了一个名为远程过程调用(RPC)的协议。RPC协议很好地解决了在调用端和服务端之间传递基础类型数据,如整形、浮点等,同时也支持传递由这些基础数据类型构成的结构体。这一下子就把程序员从封装数据包、验证数据包、解析数据包的繁杂编程工作中解放了出来。程序员需要操作的是业务数据和业务实体,由面向数据流编程变成了变相对象编程。
RPC协议同时还提供了IMarshal接口,这个接口可以支持程序员自定义一些特殊类型数据的传输方式,充分展现了RPC协议灵活的一面。
当然,RPC议在广泛应用的同时,也饱受话病。10年前的冲击波病毒和震荡波病毒就是利用了微软RPC协议栈的一个溢出缺陷而大肆流行的。这种利用溢出缺陷的病毒随着程序逐渐采用了更安全的、支持边界检查的C++运行库(CRT)之后,问题得以解决。
至今COM技术仍是微软在桌面领域普遍使用的一种远程调用技本。每台Windows计算机上都运行着数百个COM组件。因此,RPC协议仍是一种重要的远程调用协议。
随着互联网技术在21世纪初的逐渐流行,人们越来越意识到在异构平台之间的通信是非常重要的。之前我们提到的套接字通信和RPC协议通信,都是基于二进制流的通信。在异构平台上,这就变得很难处理。因为不同结构的计算机系统在处理字节对齐和字节序上都有着自己的处理方式。举个例子,一个16位的整型数字,在Intel和AMDx86系统芯片上,都是低8位在前,高8位在后的。如果直接把这两个字节的信息直接以二进制流的形式传给一个高8位在前,低8位在后的系统,那么接收端得到的整型数值就完全不一样了。
同时,出于人们普遍对安全的重视,传输层的防火墙往往会屏藏掉绝大多数的接口,使得套接字通信时,服务无法再像以前那样随意定义端口。于是,在互联网范图内,人们需要使用一种兼容异构平台的数据格式且使用互联网最标准的协议来传输的通信方式。
这种方式就是XML Webservice。所谓XML Webservice,就是只以XML这种可读的文本规范来定义服务端和客户端调用规则,使用应用层HTTP协议(传输层是TCP协议)作为传输协议的一种通信方式。使用XML的好处是,无论XML数据是ASCII编码,还是UNICODE编码,字符编码都是国际标准,都会被任意一种流行的操作系统所识别。使用HTTP作为传输协议的好处是,HTTP协议是互联网的基础协议,即使其他端口或者通信协议都被防火墙阻挡,HTTP协议的80端口总是要开启的,不存在链路上的障碍。
XML Web Service的出现使得Window+.NET和Linux+Java之间互相调用成为了可能。但也存在着协议栈复杂、安全性差等问题。因为Web Service自己来说,完整地实现一个Web Service需要WSDL、SOAP、UDDI等XML规范的支撑。而且Web Service在计之初并没有考虑到安全机制,这就使得服务器端限制客户端的访问往往变得较为复杂。
随着程序功能不断地发展,以及基于Javascript语言的前端技术的突飞猛进,人们迫切需要一种轻量级的远程调用方式分离前后端的开发,并实现复杂的业务逻辑。于是RESTful API诞生了。所谓RESTful API,是利用HTTP谓词作为操作命令,对数据进行操作的一种API接口。Web API是微软ASP.NET对RESTful API的一种实现。
使用RESTful API有如下几个好处:
(1) 通过使用标准的HTTP协议谓词和状态码定义调用规则。数据的增、删、改、查操作对应着HTTP协议的POST、DELETE、UPDATE、GET等谓词,同时使用标准HTTP状态码返回操作的执行状态。(2) RESTful API更加开放,RESTFUL API的调用完全构建在HTTP协议之上,与语言无关。只要某种语言的函数库具备调用HTTP协议的能力就可以具备访问RESTful API的能力。
(3) RESTful API通过URL串进行表意,使得API更加直观和容易理解。
(4) 用户在使用RESTful API时偏爱使用JSON和构建在JSON上的Odata数据格式。这使得调用端可以更轻快地处理数据。尤其是Javascript,早已内置了对JSON的支持。
基于以上原因, Web API变得越来越流行,逐渐替代了Webservice的方式成为业界主流。目前绝大多数互联网公司的服务接口都是以Web API的形式提供的。
PS:以上内容来自读书内容。
转载地址:http://wtzhj.baihongyu.com/