读书笔记--《分布式Java应用:基础与实践》 第一章:分布式Java应用

能不用分布式的情况就不要用分布式

一:分布式Java应用一般分为两种方法实现

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

1.1. 基于消息方式实现系统间的通信
(1)基于Java原生包的通信方式有4种:TCP/IP+BIO、TCP/IP+NIO、UDP/IP+BIO以及UDP/IP+NIO;

  • TCP/IP+BIO
    用Socket(客户端),ServerSocket(服务端)来实现通信,但是一方面通信过程是阻塞的,一方面创建多个连接会耗费大量资源,使用连接池可以缓解,但是连接池的数量是有上限的,数据量多的时候就不能很好应对。同理,服务器端会承受更大的考验,每个连接都需要分出一个线程监听,服务器资源很容易耗尽。一般主流框架比较少用。

  • TCP/IP+NIO
    用Channel和Selector的相关类来实现,首先向channel注册selector和感兴趣的事件(OP_CONNECT客户端连接事件,OP_ACCEPT服务器接受事件,OP_READ读事件,OP_WRITE写事件,写事件比较特殊,下面会细讲),然后调用selector.select()方法看channel是否有从相应的事件,有的话就进行处理。
    比如,一开始向服务器发起连接申请,服务接受后返回,这时候能够select到OP_CONNECT连接事件,你就可以结束连接事件,同时可以在结束过程中注册OP_READ读事件,下次如果select到读事件就可以进行读操作了。
    写操作就比较特殊了,一般情况下,如果想写信息的话直接写入流就可以,不需要进行注册监听。但是有可能出现某种情况,比如写入缓冲区满了,网络问题等导致写操作的失败,这时可以注册OP_WRITE写事件,等下次select到就可以再次进行写操作了。
    这种通信方式不阻塞,服务端可以一个线程监听,当有事件发生再扔到线程池处理,不需要像BIO那样一个连接一个线程(没有请求过来就相当于资源白白浪费了),可以处理更多的请求。

  • 两个UDP协议
    UDP/IP+BIO和UDP/IP+NIO的系统通信原理和TCP/IP差不多,这里不细讲。区别在于UDP没有连接的要求,要双向通信的话那两边都是UDP Server。还有一个点就是多播协议,传输方式是一份数据在网路传递,这样就不需要发送者重复发送了,降低整体流量。

(2)基于开源框架实现消息方式的系统间通信
书里面讲的是基于TCP/IP+NIO开发的Mina的用法,我们无需关注那些事件的注册和监听,使用起来会更加友好。但Mina的作者目前写了个新框架Netty,有空的话再具体学习Netty的用法。。。

1.2 基于远程调用方式实现系统间的通信
远程调用我的理解是服务方发布一个接口,供给客户端使用。请求参数一般为一个对象,请求方将这个对象进行序列然后传给服务方,服务再进行反序列化之后再调用接口,而后,如果有返回对象,则再将返回对象进行序列化传给客户端,客户端再进行反序列化。
之所以要进行序列化,之前有博文提过,Java对象只有Java虚拟机认,不能够直接通过网络传输或者存到别的地方,必须先序列化,Java对象想要存到Redis必须要能序列化也是这个原因
(1)Java原生的技术

  • RMI基于TCP/IP+BIO,过程和上面提的差不多
  • WebService
    WebService服务方以HTTP的方式提供服务,通过SOAP方式来进行交互,SOAP也可以理解成序列化的一种方式,首先服务端根据接口生成WSDL,然后根据WSDL封装为SOAP格式,再转换成字节流通过HTTP协议传输,Servlet再根据WSDL将数据转会Javad对象,再进行业务调用。(笔者工作中就经常接触SOAP,有一句话说得好,xml就不是给人看的)

你可能感兴趣的:(读书笔记--《分布式Java应用:基础与实践》 第一章:分布式Java应用)