标签:之间 tty 基础 通过 方法 配置 简单 locking connector
分布式Java应用的体系结构知识简单分为:
大型应用拆分为多个子系统来实现,这些子系统可能部署在同一台机器,或者不同机器的多个不同JVM中,每个子系统对应一个JVM。但这些子系统又不是完全独立的,要相互通信来共同实现业务功能,对于此类Java引用,我们称之为分布式Java引用。通常有两种典型的方法来实现。
基于Java自身包实现消息方式的系统间通信的方式有:
在Java中可基于Socket、ServerSocket来实现TCP/IP+BIO的系统间通信。Socket用于实现建立连接及网络IO的操作,ServerSocket用于实现服务器端端口的监听及Socket对象的获取。这种简单的通信模式,运用到实际的系统中,通常需要面对的是客户端同时要发送多个请求到服务器端,服务器端则同时要接受多个连接发送的请求。 为了解决客户端同时要发送多个请求到服务器端的需求,解决办法是:
为了满足服务端能同时接受多个连接发送的请求,解决办法是:
在Java中可基于java.nio.channels中的Channel和Selector的相关类来实现TCP/IP+NIO方式的系统间通信。SocketChannel用于建立连接、监听事件及操作读写,ServerSocketChannel用于监听端口及监听连接事件,程序通过Selector来获取是否有要处理的事件。NIO是典型的Reactor模式的实现,通过注册感兴趣的事件及扫描是否有感兴趣的事件发生,从而做相应的动作。这种简单的通信模式,运用到实际的系统中,通常需要面对的是客户端同时要发送多个请求到服务器端,服务器端则同时要接受多个连接发送的请求。
为了解决客户端同时要发送多个请求到服务器端的需求,解决办法是:
为了解决服务端接受多个连接请求的需求,解决办法是:
对于高访问量的系统而言,TCP/IP+NIO方式结合一定的改造在客户端能够带来更高的性能,在服务端能支持更高的连接数。
Java对UDP/IP方式的网络数据传输同样采用Socket机制,只是没有建立连接的要求,同时无法双向通信,除非两端都是UDP Server。在Java中可基于DatagramSocket和DatagramPacket来实现UDP/IP+BIO方式的系统间通信,DatagramSocket负责监听端口及读写数据。DatagramPacket作为数据流对象进行传输。
UDP/IP通信方式的两端不建立连接,不会有TCP/IP通信连接竞争的问题,只是最终读写流的动作是同步的。客户端同时发送多个消息的请求使用多个DatagramPacket即可。服务端同时接收多个请求的需求,采用没接收到一个packet就放入一个线程中进行处理的方式来实现。
在Java中通过DatagramChannel和ByteBuffer来实现UDP/IP+NIO方式的系统间通信,DatagramChannel负责监听端口及进行读写,ByteBuffer则用于数据流传输。
对于UDP/IP方式,NIO带来的好处是只在有流要读取或可写入流时才做相应的IO操作,而不用像BIO方式直接阻塞当前线程。
以上都是基于Java包的一对一的系统间通信方式,实际场景中,可能需要将消息发送给多台机器,针对此场景有两种解决办法:
在Java应用中,多播通常用于多台机器的状态的同步。
Mina是Apache的顶级项目,基于Java NIO构建,同时支持TCP/IP和UDP/IP两种协议,Mina对外屏蔽了Java NIO使用的复杂性,并在性能上做了不少优化。
在使用Mina时,关键的类为IoConnector、IoAcceptor、IoHandler及IoSession,Mina采用Filter Chain的方式封装消息发送和接收的流程,在这个Filter Chain的过程中可进行消息的处理、消息的发送和接收等。
除了Mina之外,现在JBoss Netty也是现在一个广受关注的Java通信框架,据评测JBoss Netty的性能浩宇Mina。
使用Java包来实现基于消息方式的系统间通信还是比较麻烦。为了让开发人员更加专注于对数据进行业务处理,而不用过多关注纯技术细节,开源业界诞生了很多优秀的基于以上各种协议的系统间通信的框架,比如Mina。
标签:之间 tty 基础 通过 方法 配置 简单 locking connector
原文地址:http://www.cnblogs.com/TwoWaterLee/p/6744117.html