大型分布式网站的架构提供的各个服务
1)RPC远程调用
RPC的全称是RemoteProcess Call,即远程过程调用,它应用广泛,实现方式也很多,拥有包括RMI,webservice等等诸多成熟的方案,在业界得到了广泛的使用.
RPC的实现包括客户端和服务端,即服务的调用方以及服务的提供方,服务调用方发送RPC请求到服务提供方,服务提供方根据调用方提供的参数执行请求方法,将执行结果返回给调用方,一次RPC调用完成.
2)通信协议---协议栈
协议是通信的规范,根据TCP/IP协议模型,HTTP协议属于应用层协议,它构建在TCP和IP协议之上,处于TCP/IP体系架构中的最顶层,这样一来,它便不需要处理下层协议间诸如丢包补发,握手以及数据的分段和重新组装等繁琐的细节,从而使开发人员可以专注于上层应用的设计.
3)RPC通信协议的选择---TCP协议
基于TCP协议实现的RPC,由于处于协议栈的下层,能够更灵活的对协议字段进行定制,减少网络传输字段数,降低网络开销,提高性能,达到更大的吞吐量和并发数,但是需要更多的关注的底层复杂细节,实现的代价更高,较难实现跨平台的调用.
而随着请求规模的扩展,基于TCP协议RPC的实现,程序需要考虑多线程并发,锁,IO等复杂的底层细节的实现,实现起来较为复杂.在大流量高并发压力下,任意一个细小的错误,都会被无限放大,最终导致宕机.
4)RPC通信协议的选择---HTTP协议
基于HTTP协议的RPC,可以使用JSON或者XML格式的响应数据,而JSON和XML作为通用的格式标准,开源的解析工具已经相当成熟,在其上进行二次开发屏蔽了很多底层繁琐的细节,非常便捷和简单.
对于基于HTTP协议的实现来说,很多成熟的开源WEB容器已经帮其处理好这些事情,如tomcat,Jboss,Apache等,开发人员可以将更多的精力集中在业务的实现上,而非底层细节的处理.
缺点:
由于是上层协议,发送包含同等内容的信息,使用HTTP协议传输所占用的字节数肯定要比TCP协议传输所占用的字节数更多.因此,同等网络环境下,通过HTTP协议传输相同内容,效率会比基于TCP协议的数据传输要低,信息传输所占用的时间要更长.
通过代码优化实现以及使用gzip数据压缩,能够缩小这一差距.所以从实际环境中的性能和用户体验来看,基于HTTP协议的RPC还是有很大的优势的.
5)对象序列化方式的选择
对象序列化:
将对象转换为能够在网络上传输的二进制流的过程
对象的反序列化:
将二进制流恢复为对象的过程
6)序列化方式的选择
①Google的Protocol Buffers真正开源出来的时间并不长,但是其性能优异,支持跨平台,但使用其编码代码侵入性较强,需要编写proto文件,无法直接使用java等面向对象编程语言的对象.
②Hessian,相对应Protocol Buffers效率稍低,但是对各种编程语言有良好的支持,性能稳定,比java本身内置的序列化方式的效率要高很多
③java内置的序列化方式.不需要引入第三方包.使用简单.
7)远程调用的实现---基于TCP的远程调用
8)远程调用的实现----基于HTTP的远程调用
9)两种URL风格---RPC
RPC风格的URL比较好理解,直接在HTTP请求的参数中标明需要远程调用的
服务接口名称,服务需要的参数,如下所示:
http://hostname/provider.do?service=com.http.sayhello&format=json×t
amp=2013-07-07-13-22-09&arg1=arg1&arg2=arg2
hostname表示服务提供方的主机名,service表示远程调用的服务接口名称,
format表示返回参数的格式,timestamp表示客户端请求的时间戳,arg1和
arg2表示服务所需要的参数。
10)两种URL风格---Restful
POST http://hostname/people创建name为zhangsan的people记录
GET http://hostname/people/zhangsan返回name为zhangsan的people记录
PUT http://hostname/people/zhangsan提交name为zhangsan的people记录更新
DELETEhttp://hostname/people/zhangsan删除name为zhangsan的people记录
RESTful风格其中的一个思想是,通过HTTP请求对应的POST、GET、PUT、
DELETE方法,来完成对应的CRUD(增删改查[Create,retrieve(读取),update,delete]) 操作
11)两种URL风格---Restful结合RPC
POSTarg1=hello arg2=123
URL http://hostname/provider/sayhelloservice/2013-07-07-13-22-09.json
URL中hostname表示的是服务提供方的主机名,provider表示访问的是服务
提供方,sayhelloservice是对应的服务接口名称,.json表示的是需要服务端
返回的数据格式,2013-07-07-13-22-09表示的是客户端访问的时间戳,
arg1和arg2参数采用POST方式发送到服务端。