读书笔记: 《分布式JAVA施用 基础与实践》 第一章 分布式JAVA应用
大型应用通常会拆分为多个子系统来实现,对于 JAVA 来说,这些子系统可能部署在同一台机器的多个不同的 JVM ,也可能部署在不同的机器上,但这些子系统又不是完全独立的,要相互通信来共同实现业务功能,对于此类 JAVA 应用,我们称之为分布式 JAVA 应用。
使用分布式的要点就是尽量不要使用分布式。
实现分布式系统通信,主要有两种方式:
1. 基于消息方式实现系统间的通信
1.1 基于 JAVA 自身技术实现消息方式的系统间通信。
1) TCP/IP + BIO
2) UDP/IP + BIO
3) TCP/IP + NIO
4) UDP/IP + NIO
JAVA7 开始,提供 AIO 方式,跟 NIO 一样是异步 IO ,较之 NIO , AIO 一方面简化了程序的编写,流的读取和写入都同操作系统来代替完成 Klein 一方面省去 NIO 中程序要遍历事件通知队列( Selector )的代价。 Windows 基于 IOCP 实现了 AIO , Linux 目前只有基于 epoll 模拟实现的 AIO 。
1.2 基于开源框架实现消息方式的系统间通信。
如 Apache Mina, Jboss Netty 。
2. 基于远程调用方式实现系统间的通信
2.1 RMI 方式
RMI ( Remote Method Invocation )是 JAVA 用于实现透明远程调用的重要机制。 JDK6 以前版本基于 TCP/IP + BIO 方式实现,以下是基于 RMI 的一次完整的远程通信过程:
1
)客户端发起请求,请求转交至
RMI
客户端的
stub
类;
2
)
stub
类将请求的接口、方法、参数等信息进行序列化;
3
)
基于
socket
将序列化后的流传输至服务器端;
4
)
服务器端接收到流后转发至相应的
skelton
类;
5
)
skelton
类将请求的信息反序列化后调用实际的处理类;
6
)
处理类处理完毕后将结果返回给
skelton
类;
7
)
Skelton
类将结果序列化,通过
socket
将流传送给客户端的
stub
;
8
)
stub
在接收到流后反序列化,将反序列化后的
Java Object
返回给调用者。
Spring RMI 可以简单地实现 RMI 方式的 JAVA 远程调用
2.2 WebService 方式
JDK6 集成了 WebService, 也可以使用 CXF 和 AXIS 等开源项目
另外,JMS方式,也是应用非常广泛的一种方式,不知作者为何没题,这里稍为补充一下:
JMS
即
Java
消息服务
(
Java Message Service
)
应用程序
接口是一个
Java
平台
中关于面向
消息中间件
(
MOM
)的
API
,用于在两个应用程序之间,或
分布式系统
中发送消息,进行异步通信。
以下是
JMS
中的一次远程通信的过程:
1
)客户端将请求转化为符合
JMS
规定的
Message
;
2
)通过
JMS API
将
Message
放入
JMS Queue
或
Topic
中;
3
)如为
JMS Queue
,则发送中相应的目标
Queue
中,如为
Topic
,则发送给订阅了此
Topic
的
JMS Queue
。
4
)处理端则通过轮循
JMS
Queue
,来获取消息,接收到消息后根据
JMS
协议来解析
Message
并处理。
常用的消息中间件有 IBM MQSeries , WebLogic JMS , Active MQ , JORAM , OpenJMS 等。