1. 咱们不由要问,什么是"服务集群"?什么是"企业级开发"?
既然说了EJB 是为了"服务集群"和"企业级开发",那么,总得说说什么是所谓的"服务
集群"和"企业级开发"吧!
这个问题其实挺关键的,由于J2EE 中并无说明白,也没有具体的指标或者事例告诉
广大程序员何时用EJB 何时不用。因而你们都产生一些联想,认为EJB"分布式运
算"指得是"负载均衡"提升系统的运行效率。然而,估计不少人都搞错了,这个"服务群集"
和"分布式运算"并无根本解决运行负载的问题,尤为是针对数据库的应用系统。
为何?
咱们先把EJB 打回原形给你们来慢慢分析。 java
2. 把EJB 掰开了揉碎了
咱们把EJB 的概念好好的分析一下,看看能发现些什么蛛丝马迹。 mysql
3.1 EJB 概念的剖析
咱们先看一下,EJB 的官方解释:
商务软件的核心部分是它的业务逻辑。业务逻辑抽象了整个商务过程的流程,并使用计
算机语言将他们实现。
……
J2EE 对于这个问题的处理方法是将业务逻辑从客户端软件中抽取出来,封装在一个组
件中。这个组件运行在一个独立的服务器上,客户端软件经过网络调用组件提供的服务以实
现业务逻辑,而客户端软件的功能单纯到只负责发送调用请求和显示处理结果。在J2EE 中,
这个运行在一个独立的服务器上,并封装了业务逻辑的组件就是EJB(Enterprise Java
Bean)组件。
这其中咱们主要关注这么几点,咱们来逐条剖析:
剖析1:所谓:"业务逻辑"
咱们注意到在EJB 的概念中主要提到的就是"业务逻辑"的封装,而这个业务逻辑究竟是
什么?说的那么悬乎,其实这个所谓的"业务逻辑"咱们彻底能够理解成执行特定任务的"类
"。
剖析2:所谓:"将业务逻辑从客户端软件中抽取出来,封装在组件中……运行在一个服
务器上"
既然咱们知道了"业务逻辑"的概念就是执行特定任务的"类",那么,什么叫"从客户端
软件中抽取出来"?其实,这个就是把原来放到客户端的"类",拿出来不放到客户端了,放
到一个组件中,并将这个组件放到一个服务器上去运行。
3.2 把EJB 这个概念变成大白话
变成大白话就是,"把你编写的软件中那些须要执行制定的任务的类,不放到客户端软
件上了,而是给他打成包放到一个服务器上了"。
3.3 发现问题了
无论是用"八股文"说,仍是用大白话说这个EJB 概念都提到了一个词--"客户端软件"。
"客户端软件"?难道EJB 的概念中说的是C/S 软件?
是的,没错!
EJB 就是将那些"类"放到一个服务器上,用C/S 形式的软件客户端对服务器上的"类"进
行调用。
快崩溃了吧!
EJB 和JSP 有什么关系?EJB 和JSP 有关系,可是关系还真不怎么大,至可能是在JSP 的
服务器端调用远端服务上的EJB 类,仅此而已。 程序员
4 .1 EJB 的最底层到底是什么
咱们揭开了EJB"八股"概念的真谛,那么,再来分析EJB 的底层实现技术,经过底层实
现技术来分析EJB 的工做方式。 sql
4.2 EJB 的实现技术
EJB 是运行在独立服务器上的组件,客户端是经过网络对EJB 对象进行调用的。在Java
中,可以实现远程对象调用的技术是RMI,而EJB 技术基础正是RMI。经过RMI 技术,J2EE
将EJB 组件建立为远程对象,客户端就能够经过网络调用EJB 对象了。
4.3 看看RMI 是什么东东
在说RMI 以前,须要理解两个名词:
对象的序列化
分布式计算与RPC
名词1:对象的序列化
对象的序列化概念:对象的序列化过程就是将对象状态转换成字节流和从字节流恢复对
象。将对象状态转换成字节流以后,能够用java.io 包中的各类字节流类将其保存到文件中,
或者经过网络链接将对象数据发送到另外一个主机。
上面的说法有点"八股",咱们不妨再用白话解释一下:对象的序列化就是将你程序中实
例化的某个类的对象,好比,你自定一个类MyClass,或者任何一个类的对象,将它转换成
字节数组,也就是说能够放到一个byte 数组中,这时候,你既然已经把一个对象放到了byte
数组中,那么你固然就能够随便处置了它了,用得最多的就是把他发送到网络上远程的计算
机上了。如图2 11所示。 数据库
名词2:分布式计算与RPC
RPC 并非一个纯粹的Java 概念,由于在Java 诞生以前就已经有了RPC 的这个概念,RPC
是"Remote Procedure Call"的缩写,也就是"远程过程调用"。在Java 以前的大多数编程语
言,如,Fortran、C、COBOL 等等,都是过程性的语言,而不是面向对象的。因此,这些编
程语言很天然地用过程表示工做,如,函数或子程序,让其在网络上另外一台机器上执行。说
白了,就是本地计算机调用远程计算机上的一个函数。
如图2 12所示。 编程
名词3:两者结合就是RMI
RMI 英文全称是"Remote Method Invocation",它的中文名称是"远程方法调用",它就
是利用Java 对象序列化的机制实现分布式计算,实现远程类对象的实例化以及调用的方法。
说的更清楚些,就是利用对象序列化来实现远程调用,也就是上面两个概念的结合体,利用
这个方法来调用远程的类的时候,就不须要编写Socket 程序了,也不须要把对象进行序列
化操做,直接调用就好了很是方便。
远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这
种机制,某一台计算机上的对象在调用另一台计算机上的方法时,使用的程序语法规则和
在本地机上对象间的方法调用的语法规则同样。
如图2 13所示。数组
4.4 优势
这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI 规则设计程
序,能够没必要再过问在RMI 之下的网络细节了,如:TCP 和Socket 等等。任意两台计算机
之间的通信彻底由RMI 负责。调用远程计算机上的对象就像本地对象同样方便。
RMI 可将完整的对象做为参数和返回值进行传递,而不只仅是预约义的数据类型。也就
是说,能够将相似Java 哈西表这样的复杂类型做为一个参数进行传递。
4.5 缺点
若是是较为简单的方法调用,其执行效率也许会比本地执行慢不少,即便和远程Socket
机制的简单数据返回的应用相比,也会慢一些,缘由是,其在网络间须要传递的信息不只仅
包含该函数的返回值信息,还会包含该对象序列化后的字节内容。
4.6 EJB 是以RMI 为基础的
经过RMI 技术,J2EE 将EJB 组件建立为远程对象,EJB 虽然用了RMI 技术,可是却只需
要定义远程接口而无需生成他们的实现类,这样就将RMI 技术中的一些细节问题屏蔽了。
但无论怎么说,EJB 的基础仍然是RMI,因此,若是你想了解EJB 的原理,只要把RMI
的原理搞清楚就好了。你也就弄清楚了何时用EJB 何时不须要用EJB 了。 服务器
5. EJB 中所谓的"服务群集"
既然已经知道了,RMI 是将各类任务与功能的类放到不一样的服务器上,而后经过各个服
务器间创建的调用规则实现分布式的运算,也就明白EJB 所谓的"服务群集"的概念。
就是将原来在一个计算机上运算的几个类,分别放到其余计算机上去运行,以便分担运
行这几个类所须要占用的CPU 和内存资源。同时,也能够将不一样的软件功能模块放到不一样的
服务器上,当须要修改某些功能的时候直接修改这些服务器上的类就好了,修改之后全部客
户端的软件都被修改了。如图2 14所示。 网络
6. 这种部署难道是无懈可击
图2 14所示的这个"服务群集"看似"无懈可击",实际上是它这个图没有画完整,咱们来
把这个图画完整,再来看看有什么问题没有。
6.1 瓶颈在数据库端
仔细观察以后,发现这种配置是有瓶颈的,如图2 15所示。 架构
咱们看看图2 15的结构图,如今若是想实现各个服务器针对同一个数据库的查询,那
么,无论你部署多少个功能服务器,都须要针对一个数据库服务器进行查询操做。也就是说,
无论你的"计算"有多么"分布"也一样须要从一台服务器中取得数据。虽然,看起来将各个功
能模块分布在不一样的服务器上从而分担了各个主计算机的CPU 资源,然而,真正的瓶颈并不
在这里,而是,数据库服务器那里。数据库服务器都会很是忙的应付各个服务器的查询及操
做请求。
所以,经过这个结构图使咱们了解到了EJB 根本不能彻底解决负载的问题,由于,瓶颈
并不在功能模块的所在位置,而是在数据库服务器这里。
6.2 假如分开数据库,数据共享怎么办
有的读者必定会想到下面的这个应用结构,如图2 16所示。
就是把每个功能服务器后面都部署一个数据库,这样不就解决了上节所说的问题了
吗?是的解决了数据库查询负载的问题,然而又出现了新的问题,就是"数据共享"的问题就
又不容易解决了。
6.3 网络面临较大压力,让你的应用慢如老牛
咱们再向前翻看看如图2 15所示的这种架构中存在两个网络,一个是"A 网"一个是"B
网",这两个网络是不一样的。"B 网"每每是局域网,通常带宽是10M/100M,速度较快,所以
到还好说,然而,"A 网"每每是互联网或者是利用电信网络互联××× 网或称广域网。"A 网"
的特色是带宽通常较窄,如ADSL 的网络仅仅有512K-2M 的带宽,因为广域网互联的成本较
高,因此通常不会有较高的带宽。
而在这个网络上偏偏跑的是功能模块和客户端软件之间交换的数据,而这部分数据偏偏
优点很是占用带宽的。
所以,这个应用架构其运行速度能够想见是多么的慢了。说句不夸张的话,有点想老牛
拉破车同样的慢。
一个如老牛的系统:
目前在中国互联网作运营商网络管理系统的一个大公司,它的一个早期的网管软件就是
采用了这种架构来作的C/S 结构的应用系统。
有一次,我做为评估者来对其应用系统进行评估,将其部署到一个非运营商大型的网络
中的时候,便出现了咱们上述描述的状况,速度已经到了难以忍受的地步,打开一个流量图,
有时候须要用15分钟的时间才能呈现完整。然而,该系统在开发阶段并无发现这个问题,
为何呢?由于,他们没有考虑到应用的实际用户链接网络的复杂性,从而给该公司形成较
大损失,以致于,这个开发架构被最终遗弃。
7. EJB 活学活用,J2EE 不是必须使用EJB
经过上面小节的讲解彷佛好像EJB 和开发Web 应用的B/S 结构的系统关系并不大,其实
倒也否则。咱们若是把"客户端程序"理解成某一台服务器,这样也是能够被应用的,并且,
若是是服务器互相之间作EJB 的调用的话,也就不存在广域网带宽限制的问题了。
可是,以下状况尽可能就不要使用EJB 了:
一、较为简单的纯Web 应用开发,不须要用EJB。
二、须要与其余服务程序配合使用的应用,但调用或返回的自定义的网络协议能够解决
的应用程序,不须要使用EJB。
三、较多人并发访问的C/S 结构的应用程序,尽可能不要使用EJB。
总结:
a.EJB实现原理: 就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通讯。
b.RMI实现原理 :就是经过Java对象可序列化机制实现分布计算。
c.服务器集群: 就是经过RMI的通讯,链接不一样功能模块的服务器,以实现一个完整的功能。