关于远程调用实现的必要技术,笔者看到网上有几篇文档写得不错,符合我自己的实践,摘录下来跟大家一起分享。

远程调用实现的技术总体上分为以下几个方面:

1. 通信技术:远程调用就是通过网络技术将不同系统构成一个整体,因此通信技术是其重点,通信技术我这里选择的是netty技术,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty会让我们开发通信程序变得简单,高效,其效率也是非常好的,同时它还支持多种不同的网络协议。
 2. 序列化和反序列化技术:java的序列化技术是指将对象转换为byte数据,这些数据可以被还原为java对象,这种还原的过程就是反序列化了,该机制可以自动处理不同操作系统之间的差异,例如window下序列化的对象,可以在linux上进行重新构建。Java的jdk里自带了一个序列化和反序列化机制,熟悉hadoop的人知道hadoop设计了一套序列化和反序列化机制,为什么hadoop作者不选择使用java自带的序列化机制,这是因为java序列化机制非常复杂,复杂带来效率低下,java的序列化机制还有一个重要的缺点就是它序列化的二进制数据会非常大,因为java序列化时候会附带太多该对象的相关信息,过大的数据量就会影响网络传输的效率,因此hadoop自己设计了一套序列化和反序列化机制,hadoop不同节点之间的通信也是一种远程调用机制,因此我们发现好的序列化和反序列化技术对于远程调用是相当重要的。我们公司的远程调用框架序列化技术有两种一种就是java自带的序列化和反序列化机制,一种是hessian技术,它是一种更加高效的序列化和反序列化技术。
3.压缩技术:做网络编程,最稀缺的资源就是宽带资源,如果传输数据过大,那么对数据的压缩就会显得十分重要,这里我推荐一个压缩技术snappy,它是一种高效的压缩和解压缩包,google公司内部广泛使用的一种压缩技术。
4.高并发的技术:远程调用技术一定会是多线程,只有这样才能满足多个并发的处理请求,java在1.5的版本里提供了一个Executor框架,它在线程开发里引入了任务的概念,使得多线程的程序开发会更加合理和可控,关于executor的技术大家可以看看一本经典的书籍《java并发编程实践》。想让线程更加有效率,池技术也是并不可少的,apache的common-pool是一个非常好的池技术,我们可以将线程都预先创建好,然后放入到common-pool池里进行管理。
5.非侵入式:这个也可以叫做松耦合,对于java的web开发,最好的解耦方式就是使用spring技术,当我们系统里把远程调用框架引入后,配置好相关的参数,我们可以把用于远程调用的方法定义在spring的配置文件里,那么在程序里调用的时候,利用spring直接获取这个bean,那么对于远程调用的开发就和我们在action里调用server的方法没啥区别了。

6.负载均衡:分布式系统都离不开负载均衡,好的负载均衡可以充分利用好不同服务器的计算资源,提供系统的并发量和运算能力,对于网站而言(我们公司现在网站服务器不是太多)少于10台服务器可以使用多种策略:一种是简单轮询;第二种是随机方式,采用随机函数;第三种可以采用HASH技术;第四种可以采用圆周计算算法;等等。

7. 最后提到的是远程调用服务管理组件,目前在开源框架中最好的实现技术是zookeeper。
远程调用管理组件主要是通过zookeeper实现,zookeeper拥有一个层次的命名空间,它的模型是一个树状结构,树状结构是一个强大的数据类型,它几乎能存储所有不同的数据类型,我们通过zookeeper将这些信息保存起来,便于我们管理整个远程调用框架,同时zookeeper还是高可靠的,这个我在前面zookeeper文章里讲到了,这样就保证了整个远程调用框架的稳定性,实际应用中我们会将组件编译成一个jar包,不同的项目直接引用这个jar包,这样管理组件服务端和服务的提供者和调用者就联系起来。至于提供者和调用者的通信机制是直接进行,因为我们将通信程序集成在jar包里,只不过相应的管理机制抽取到外部服务端进行统一管理。