`

分布式java应用学习笔记一

阅读更多

基于消息方式实现系统间的通信

常用的通信协议:

tcp/ip保证数数据传输的可靠性,会牺牲性能

udp/ip双方不建立联接,面是发送到网上进行传递,性能较好

 

系统间通信对数据的处理

同步IO常用的是

(BlockingIO)当发起读写操作时,均为阻塞方式,只有当操作完成后才会释放

资源

NIONon-BlockingIO)基于事件驱动的,实际上采用的reactor模式2,发起读写操作

时是非阻塞方式,linux2.6以后版本采用epoll3方式来实现NIO

异步操作方式;AIO(基于事件戏动)采用proactor模式4直接调用APIreadwrite

方法

读取:操作系统将可读的流传达入read方法的缓冲区,通知应用

写入:操作系统把write方法写入的流写入完毕时通知应用程序

Windows基于locp实现了AIOlinux目前只有基于epoll模拟实现的AIO(只有jdk7才支持AIO)

 

 

实现方式:

TCP/IP+BIO

采用socketserverSocket来实现,

客户端的关键代码

publicvoidclient()throwsUnknownHostException,IOException{

Socketsocket=newSocket("服务器ip/域名",123);

//读取服务器返回流

BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));

//向服务器写入的流

PrintWriterout=newPrintWriter(socket.getOutputStream());

//向服务器发送信息

out.println("hello");

//阻塞读取服务端的返回信息

in.readLine();

}

服务器端的关键代码

publicvoidserver()throwsIOException{

//监听的端口

ServerSocketserverSocket=newServerSocket(123);

//设置超时时间

//serverSocket.setSoTimeout(11);

//接收客户端建立联接的请求

//也是通过socket.getInputStream()和socket.getOutputStream();

//来进行读写操作,该方法会一直阻塞到有发送建立联接的请求

Socketsocket=serverSocket.accept();

}

一般是采用联接池的方式来维护socket(容易出现服务器持掉的现象),所以要根据情况设置超时时间,为了能够同时接收多个连接请求,就要在accept取得socket后,将此socket放到一个线程中单独处理,通常称为一连接一线程,防止资源耗尽,必须限制线程数量,这就造成了BIO的情况下服务端能支撑的连接数是有限的

 

 

TCP/IP+NIO

采用channelselector来实现

publicvoidclient()throwsIOException{

SocketChannelsocketChannel=SocketChannel.open();

 

//设置为非阻塞模式

socketChannel.configureBlocking(false);

//接着返回false,表示正在建立连接

socketChannel.connect(newSocketAddress(){

});

Selectorselector=Selector.open();

//注册selector和感受性趣的连接事件

socketChannel.register(selector,SelectionKey.OP_CONNECT);

//阻塞至有感性趣的事件发生,直到达超时时间

//如果希望一直等,就调用无参的select方法

intnKeys=selector.select();

//如果不阻塞直接返回目前是否有感性趣的事件发生

//selector.selectNow();

 

//nKeys>0说明有感兴趣的事发生

SelectionKeysKey=null;

if(nKeys>0){

Set<SelectionKey>keys=selector.selectedKeys();

for(SelectionKeykey:keys){

//

if(key.isConnectable()){

SocketChannelsc=(SocketChannel)key.channel();

//非阻塞式

sc.configureBlocking(false);

//注册感性趣的IO事件,通常不常注册写事件

//在缓冲区未满的情况,是一直可写的

sc.register(selector,SelectionKey.OP_READ);

//完成连接的建立

sc.finishConnect();

}

//有流可以读取

elseif(key.isReadable()){

ByteBufferbuffer=ByteBuffer.allocate(1024);

SocketChannelsc=(SocketChannel)key.channel();

intreadBytes=0;

try{

intret=0;

try{

while((ret=sc.read(buffer))>0){

readBytes+=ret;

}

}finally{

buffer.flip();

}

}finally{

if(null!=buffer){

buffer.clear();

}

 

}

}elseif(key.isWritable()){

//取消对OP_WRITE事件的注册

key.interestOps(key.interestOps()&(~SelectionKey.OP_WRITE));

SocketChannelsc=(SocketChannel)key.channel();

//阻塞操作,直到写入缓冲区或出现异常,返回的为成功写入的字节数

//当发送缓冲区已满,返回0

intwrittenedSize=sc.write(ByteBuffer.allocate(1024));

//如果未写入,则继续注册感性趣的事件

if(writtenedSize==0){

key.interestOps(key.interestOps()|SelectionKey.OP_WRITE);

}

}

selector.selectedKeys().clear();

}

//对于要写入的流

intwSize=socketChannel.write(ByteBuffer.allocate(1024));

}

 

}

 

publicvoidserver()throwsIOException{

ServerSocketChannelssc=ServerSocketChannel.open();

ServerSocketserverSocket=ssc.socket();

//绑定监听的接口

serverSocket.bind(newInetSocketAddress(123));

ssc.configureBlocking(false);

//注册感兴趣的连接建立事件

ssc.register(Selector.open(),SelectionKey.OP_ACCEPT);

//和客户端同样的方式对selector.select进行轮询,只是添加了一个如下方法

Set<SelectionKey>keys=selector.selectedKeys();

for(SelectionKeykey:keys){

//

if(key.isAcceptable()){

ServerSocketChannelserverSocketChannel=(ServerSocketChannel)key.channel();

SocketChannelsocketChannel=serverSocketChannel.accept();

if(null==socketChannel){

continue;

}

socketChannel.configureBlocking(false);

socketChannel.register(selector,SelectionKey.OP_READ);

}

}

 

}

 

 

UDP/IP+BIO

采用socket由于UDP/IP是无连接的,要进行双向通信,必须两端都成为UDPserver

基于datagramSocketDatagramPacket

客户端和服务器端的代码如下:

//如果双向通信,必须启动一个监听端口,承担服务器的职责

publicvoidclentOrServer(){

try{

DatagramSocketserverSocket=newDatagramSocket(123);

byte[]buffer=newbyte[65507];

DatagramPacketreceivePackep=newDatagramPacket(buffer,buffer.length);

DatagramSocketsocket=newDatagramSocket();

DatagramPacketpacket=newDatagramPacket(datas,datas.length,server,port);

//阻塞发送pack到指定的服务器和端口,

//网络io异常抛出ioexception,

//连不上目标端口porUnreachableException

socket.send(packet);

//阻塞并同步读取流信息,如接收到的流信息比packet长度长

//则删除更长信息,

serverSocket.setSoTimeout(100);//设置读取流的超时时间

serverSocket.receive(receivePackep);

}catch(SocketExceptione){

e.printStackTrace();

}

}

UDP/IP+NIO

采用datagrameChannelbyteBuffer来实现

//一对一的系统间的通信

publicvoidclent(){

try{

DatagramChannelreceiveChannel=DatagramChannel.open();

//非阻塞模式

receiveChannel.configureBlocking(false);

DatagramSocketsocket=receiveChannel.socket();

socket.bind(newInetSocketAddress(123));

 

Selectorselector=Selector.open();

receiveChannel.register(selector,SelectionKey.OP_ACCEPT);

//可象TCP/IP+NIO中对selector的遍历一样

DatagramChannelsendChannel=DatagramChannel.open();

sendChannel.configureBlocking(false);

SocketAddresstarget=newInetSocketAddress("127.0.0.1",123);

sendChannel.write(ByteBuffer.allocate(1024));

}catch(IOExceptione){

e.printStackTrace();

}

}

 

 

 

try{

DatagramChannelreceiveChannel=DatagramChannel.open();

//非阻塞模式

receiveChannel.configureBlocking(false);

DatagramSocketsocket=receiveChannel.socket();

socket.bind(newInetSocketAddress(123));

 

Selectorselector=Selector.open();

receiveChannel.register(selector,SelectionKey.OP_ACCEPT);

//可象TCP/IP+NIO中对selector的遍历一样

DatagramChannelsendChannel=DatagramChannel.open();

sendChannel.configureBlocking(false);

SocketAddresstarget=newInetSocketAddress("127.0.0.1",123);

sendChannel.write(ByteBuffer.allocate(1024));

}catch(IOExceptione){

e.printStackTrace();

}

}

 

基于开源框架实现消息方式的系统间通信

 

Minaapache的开源项目,基于是javaNIO构建

关键类为:

loConnector配置客户端的消息处理器io事件处理线程池消息发送/接收的

Filterchain

loAcctptor配置服务器端的io事件处理线程池消息发送/接收的filterChain

loHandler作为mina和应用的接口底层发生事件mina会通知应用实现的

handler

loSession类似于socketChannel的封装,可以进行连接的控制及流信息的输出

它采用filterchain的方式封装消息发送和接收

 

 

 

基于远程调用方式实现系统间的通信

这种方式主要用来实现基于RMIwebservice的应用

RMI(remotemethodinvocation)java用于实现远程调用的重要机制

 

Webservice

 

基于开源框架实现远程调用方式的系统间通信

SpringRMI

 

分享到:
评论

相关推荐

    Java分布式应用学习笔记01分布式Java应用和SOA

    ### 实现分布式Java应用的挑战与解决方案 尽管Java提供了丰富的库和技术栈来支持分布式应用的开发,但在实际应用中仍面临许多挑战,例如: - **一致性问题**:在分布式系统中保持数据的一致性是一项复杂任务,需要...

    Java【分布式】学习笔记01分布式Java应用

    从给定的文件信息来看,标题和描述都指向了“Java分布式学习笔记01分布式Java应用”,这显然是关于Java在分布式环境下的应用和技术的学习资料。虽然提供的部分内容由于格式问题难以直接解析,但我们可以根据标题、...

    Java分布式应用学习笔记

    Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...

    对于\"Java分布式应用学习笔记\"的整理

    分布式系统和SOA的介绍与应用 前言 随着系统规模的扩大,分布式架构的应用变得越来越广泛。...在Java领域,分布式应用的学习和实践是一个非常重要的方向,这对于理解和掌握现代企业级应用架构具有重要意义。

    Java分布式应用学习笔记07线程池应用

    ### Java分布式应用学习笔记07线程池应用 在深入探讨Java分布式应用中线程池的应用之前,我们先来理解一下线程池的基本概念及其在并发编程中的重要性。线程池是Java并发编程的核心技术之一,它通过复用一组预创建的...

    Java分布式应用学习笔记-谈JVM.doc

    【Java分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...

    Java分布式应用学习笔记09JMX-MBean的介绍

    ### Java分布式应用学习笔记09JMX-MBean的介绍 #### MBean概念及作用 MBean,即Managed Bean,是在JMX(Java Management Extensions)框架中用于管理资源的一种特殊Java对象。通过MBean,可以方便地对应用程序进行...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    ### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    在Java分布式应用开发中,多线程环境下的并发同步是至关重要的一个环节。并发同步器在多线程编程中起到协调各个线程访问共享资源,确保数据一致性与程序正确性的关键作用。本篇笔记将深入探讨Java中的并发同步机制,...

    Java分布式应用学习笔记05多线程下的并发同步器

    ### Java分布式应用学习笔记05多线程下的并发同步器 #### 1. 前言 在现代软件开发中,特别是在分布式系统和高性能计算领域,有效地管理多线程之间的协同工作至关重要。Java语言提供了丰富的工具和API来帮助开发者...

    Java分布式应用学习笔记08JMX规范与各种监控场景.pdf

    Java Management Extensions (JMX) 是Java平台上的一个标准,它定义了一种管理和监控Java应用程序的...无论是简单的本地程序还是复杂的分布式系统,JMX都是一个强大的工具,帮助我们更好地理解和控制我们的Java应用。

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    ### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...

    (完整版)最全的java学习笔记(必看).pdf

    Java学习笔记 Java是一种流行的编程语言,广泛应用于Android应用程序开发、Web应用程序开发、桌面应用程序开发等领域。以下是Java学习笔记的摘要信息: 一、Java技术基础 * 1.1 编程语言:Java是一种面向对象的...

    分布式技术相关知识学习笔记

    【分布式技术相关知识学习笔记】 分布式技术是现代软件开发中的重要组成部分,它涉及多种技术手段,如CORBA、ORB、RPC、RMI以及中间件等,旨在解决大型系统中复杂度、扩展性和高可用性的问题。本笔记将重点讨论EJB...

    [实战]Java分布式高级架构师课程学习笔记.docx

    【Java分布式高级架构师课程学习笔记】 在Java分布式高级架构师的学习过程中,涵盖了多个关键领域的技术,包括数据库的高可用方案、缓存系统、消息中间件以及分布式协调服务。以下是对这些主题的深入探讨: 1. **...

    Java分布式应用学习笔记09JMX-MBean的介绍.doc

    java

Global site tag (gtag.js) - Google Analytics