在深入学习zookeeper的过程中,介绍一个zookeeper相关的应用实例。我将这个实例命名为远程调用服务。通过本应用实例的描述,我们将对zookeeper的应用场景有更深入的了解。远程调用是系统间的一种通信机制,另一种理解就是进程间通信。对于分布式系统的开发,远程调用技术是其核心技术。远程调用技术可以将一组计算机系统组成一个网络系统,对外提供整体服务,再由这组计算机系统组成一个更大的、性能更高的计算机系统。在之前的博客中,我介绍了一个分布式网站架构设计,其中有一个使用netty技术编写的组件,作为前端系统和服务器端系统之间的通信媒介。大型互联网公司会有很多这样的网站系统。如果每个网站都按照我博客中描述的方式开发,那么系统通信的维护和管理,以及每个系统的网络资源分配和管理都会造成严重的问题。某个问题,对于这样的问题,我给大家举个例子,大家可能比较清楚。例如,一家互联网公司有几个对外提供服务的网站。有的网站访问量大,有的访问量比较小,但是公司的宽带资源是有限的,所以我们希望对这些资源进行动态的管理和分配。如果我们网站和网站的通信功能紧耦合,那么分配这些资源的工作就会复杂繁琐,而且很容易出问题。这样的问题还有很多,这里就不做详细分析了。做软件开发,有一个原则。如果某个功能是通用的,需要统一管理,就应该把这个功能抽离成一个独立的系统或组件,给这个系统或组件一些增强。系统的功能特性必将提高整个系统的健壮性、可用性和效率。而我在分布式网站中描述的通信技术是一种远程调用技术。远程调用技术是客户端与服务器之间的通信技术。可以看成是cs架构技术的一种。有很多优秀的框架实现了远程调用,比如java自带的RMI,spring自带的Httpinvoker,webservice技术等等。但是,现有的这些技术并不能满足互联网公司的远程调用需求。今天就来说说自己构想的一套远程调用技术。这是基于我们公司一些类似软件的实践。该框架主要针对java,其他语言目前暂不支持。首先,我想总结一下远程调用技术应该包括哪些技术,它们是:通信技术:远程调用是通过网络技术形成一个完整的系统,所以通信技术是重点。我这里选择的通信技术是netty技术,Netty提供了一个异步的、事件驱动的web应用框架和工具,用于快速开发高性能、高可靠的web服务器和客户端程序。Netty会让我们开发通信程序变得简单高效,效率也非常的好。同时,它还支持多种不同的网络协议。序列化和反序列化技术:Java的序列化技术是指将对象转换为字节数据,可以还原为java对象。这个恢复过程就是反序列化。这种机制可以自动处理不同操作系统之间的差异,比如window下序列化的对象,可以在linux上重新构建。Java的jdk自带序列化和反序列化机制。熟悉Hadoop的都知道,Hadoop设计了一套序列化和反序列化机制。为什么Hadoop的作者不选择使用Java自带的序列化机制呢?这是因为java序列化机制非常复杂,带来了低效率,java序列化机制的另一个重要缺点是它序列化的二进制数据会非常大,因为java序列化会包含太多关于对象的信息,过多的数据体积会影响网络传输的效率,所以hadoop设计了一套序列化和反序列化机制,hadoop不同节点之间的通信也是一种远程调用机制,所以我们发现一个好的序列化和反序列化技术对于远程调用来说是相当重要的。我们公司的远程调用框架序列化技术有两种,一种是java自带的序列化和反序列化机制,一种是hessian技术,这是一种比较高效的序列化和反序列化技术。压缩技术:对于网络节目来说,最稀缺的资源就是宽带资源。如果传输的数据太大,那么数据压缩就会很重要。这里推荐一个压缩技术snappy,它是一种高效的压缩解压包,是Google内部广泛使用的一种压缩技术。高并发技术:远程调用技术必须是多线程的,这样才能满足多个并发处理请求。Java在1.5版本提供了Executor框架,在线程开发中引入了任务的概念,使得多线程程序开发会更加合理和可控。执行器技术可以看一本经典的书《java并发编程实践》。要让线程更高效,池技术也是必不可少的。Apache的common-pool是一个很好的池技术。我们可以预先创建线程,放到common-pool中管理。非侵入式:这也可以称为松散耦合。对于javaweb开发,最好的解耦方式就是使用spring技术。当我们在系统中引入远程调用框架并配置好相关参数后,就可以使用了。远程调用的方法定义在spring的配置文件中,所以在程序中调用的时候,使用spring直接获取bean,那么远程调用的开发与在action中调用服务器的方法没有区别。以下是示例代码:
