- 浏览: 270284 次
- 性别:
- 来自: 北京
最新评论
-
zwb5370:
为什么 Java 的 cron 规则的 周规则和 linux ...
Quartz的cron表达式 -
zjhdreams:
没说说明L W C,L C #,每个字符的含义呢?补充
Quartz的cron表达式 -
qq359907964:
呵呵,没问题了,能正常运行..
Quartz的cron表达式 -
dongcb678:
biaoming 写道看了一下文档,compass已经提供很方 ...
Compass怎样在指定alias中搜索 -
anttribe:
请问博主,源呢?你是使用哪个源? 怎么还有内核的源?我杂没找到 ...
Debian升级内核
J2EE平台提供了一个基于组件的方法,用来设计、开发、装配及部署企业应用程序。而且提供了一个多层的分布式的应用模型、组件的复用、一致化的安全模型以及灵活的事务控制模型。近年来在企业系统中得到了大量使用。随着J2EE应用服务器的大量部署和客户访问量的猛增。企业对于J2EE系统的可伸缩性和高可用性要求越来越高,特别是在电子商务和金融领域,这个问题越显的突出。如何设计和构建一个具有可伸缩的,高可用性的J2EE集群应用服务器,成为设计J2EE应用服务器设计必须考虑的问题。但J2EE应用服务器的集群是基于EJB组件的集群,和普通Web Server集群技术有很大的不同。实现的方法也根本不相同。
1 集群系统特点<o:p></o:p>
一个集群系统是一群松散结合的服务器组,形成一个虚拟的服务器,为客户端用户提供统一的服务。对于这个客户端来说,通常在访问集群系统时不会意识到它的服务是由具体的哪一台服务器提供。集群系统一般应具高可用性、可伸缩性、负载均衡、故障恢复和可维护性等特殊性能。
高 可用性是集群系统最基本的要求,它是对整个系统运行稳定性的一个评价。可伸缩性是指整个系统在随着客户端用户数量的增加而继续保持有效响应时间的能力。在 一个可伸缩性系统中,随着用户数量的增加,有效响应时间变长,成线性变化关系,这也体现一个系统的峰值负载处理能力,但随着越来越多的系统处于Internet上, 用户访问的峰值负载有效预测已变的不可能。用户访问量的猛增,使系统的有效响应时间成非线性变化,响应时间急剧变长,知道系统不堪重负而停机。一般的解决 方法就是通过提升系统硬件系统,或通过增加服务器。但是不合理的增加服务器只能使整个集群系统变的越来越庞大,系统的这种复杂化就意味系统故障率变高,随 之整个系统可靠性、可维护性都会降低。
所以,一个系统的可用性和可伸缩性是一对矛盾的关系,而且和整个集群系统的实现方法有很大的关系。
2 EJB技术<o:p></o:p>
EJB是J2EE应用平台的核心。Sun在EJB2.0规范中对EJB定义如下:EJB是用于开发和部署具多层结构的、分布式的、面向对象的Java应用系统跨平台的构件体系结构。EJB组件有三中类型:会话bean、实体bean、消息驱动bean。其中会话bean分为有状态和无状态两种。
EJB服务器的核心是提供EJB使用的一个或者多个EJB容器(Container)。EJB容器管理它所包含的EJB,为EJB组件的生存和执行提供了运行环境,同时也负责EJB的事务管理,安全管理,资源访问控制和一些异常处理。EJB容器不允许J2EE的客户端程序直接访问容器中EJB对象,当一个客户端用户想访问一个EJB, EJB规范中要求客户使用Java名字和目录接口JNDI(Java Naming and Directory Interface)API来定位Bean的home接口。 要访问EJB一般需要经过以下三步(见图1)(下面只列举Remote的调用):
1) 从JNDI中查找Bean的home接口。首先客户需要获得一个JNDI的初始化上下文,然后,客户就可以使用上下文的lookup方法从一个名字对应到它的home接口;
2) 使用home接口中的Create()方法获得Bean的Remote接口引用;
3) 通过Remote接口中的方法使用Bean中定义的方法;
一个简单访问例子如下:
// 获得JNDI初始化上下文
Context mycontext = new InitialContext( );
// 查找MyEJB,获得Home对象的引用
Object homeref = mycontext.lookup(“MyEJB”);
// Home对象造型为RMI-IIOP对象
MyBeanHome home =
(MyBeanHome)PortableRemoteObject(homeref, MyBeanHome.Class);
// 创建EJB对象,返回Remote接口
MyBeanRemote myref = home.create( );
//通过Remote接口调用EJB中实现的方法
System.out.println ( myref.getname( ));
3 EJB服务器集群<o:p></o:p>
EJB服务器的集群是基于组件的一种集群方式,和普通Web Server集群技术有很大的不同。实现的方法也不相同。又由于EJB规范中没有提供任何有关支持集群的标准,即使有的厂商在EJB服务器中提供了集群特性,但如何具体实现集群也是由厂商自己确定。实现的方法也各不相同。目前,大多数J2EE应用服务器都提供了集群功能,如Bea WebLogic应用服务器,开放源码的JBoss应用服务器,Sybase公司提供的J2EE应用服务器等都提供了集群功能。在EJB服务器集群设计 中,负载均衡(Load Balance),EJB集群和HttpSession集群技术是设计中涉及到的主要技术。其中EJB集群的实现是整个系统实现的核心。<o:p></o:p>
<o:p></o:p>
3.1负载均衡(Load Balance)<o:p></o:p>
Load Balance 主要的目的在于将访问系统的负荷分散在不同的机器上,使整个系统吞吐量和并发性得到提高, 它能让多台服务器共同承担一些繁重的计算或I/O任务,从而消除网络瓶颈,提高网络的灵活性和可靠性。常见的方法如下:
l 循环DNS<o:p></o:p>
DNS负载均衡是一种简单而有效的方法,该方法使用简单的域名查询IP地址来实现一种简单的负载均衡。任意给出一个地址,DNS服务器都有一个IP地址池与之对应。每次请求将域名转换成IP地址时,循环返回IP地址池中的下一个地址。故被称作DNS round-robin。当一个Client访问时,给请求JNDI的InitialContext客户端传递一个DNS名,作为命名服务器的URL,每个DNS名字被转换成一个不同的地址,使用这个技术,每个客户端InitailContext请求就被直接发送到不同的服务器上。 负载均衡的一大缺点是:一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(因为DNS需要一定的刷新时间)才能发挥作用,在此期间,有些客户端用户访问仍旧将发送故障服务器上。
l 软件Proxy<o:p></o:p>
软件Proxy维护连接到一系列服务器上的打开连接。当一个Client访问服务器时,先要经过这个软件代理,这个代理能通过一些负载均衡的算法(如采用类似DNS Round-robin、随机方法、访问权衡算法 )把一个用户的访问重新定向到一个服务器。这个软件代理方法能够及时发现服务器死机或没有响应,有效地避免了DNS round-robin方法中出现地故障访问。
l 硬件均衡器
这种硬件均衡器一般采用地址转换技术,将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的。一般可采用第四层(或4层以上)的交换机来实现,这种交换机是按照IP地址和TCP端口进行虚拟连接的交换,直接将数据包发送到目的计算机的相应端口。通过交换机就能将来自外部的初始连接请求,分别与内部的多个地址相联系,从而建立虚拟连接实现负载均衡。这种第四层交换基于硬件芯片,因此网络传输速度和交换速度远远超过普通软件代理方式。如采用Cisco CSS 11150(一种L4 Switch)可以实现硬件均衡。
<o:p></o:p>
3.2 EJB 集群技术<o:p></o:p>
Client端要访问EJB容器中EJB都是先要先访问JNDI命名服务器[见2节EJB技术]。所以J2EE的EJB服务器的实现集群( Cluster)核心也就围绕着JNDI。根据集群对于JNDI命名树在系统中管理和组织的不同,一般EJB集群可以分为下面三种:
1) JNDI树代理(Proxy)<o:p></o:p>
Cluster中每个J2EE Application Server都维护一个自己的本地私有JNDI树,Cluster中的每个服务器不知道其它服务器的状态和存在情况,只有Proxy服务知道Cluster中每个服务器的状态,并且可以访问Cluster中任何一个服务器上的JNDI树,这就要求每个服务器在启动和启动后要不断地和Proxy服务保持联系,以便Proxy知道它们的工作情况和Cluster所有的EJB对象。Client访问EJB对象,首先要访问JNDI Proxy,通过Proxy,可以重新定向访问到Cluster中所有的EJB对象(见图2)。这种方法的优点是实现简单,只需要设计一个JNDI Proxy代理。对于每个应用服务器不做复杂要求;而且系统的伸缩性好,要升级系统,只是简单增加服务器就可以。但这种方法有一个致命的缺点,就是Proxy服务要是失败,整个Cluster系统将无法正常工作,可靠性差。
2) 集中式JNDI树<o:p></o:p>
采用集中式集群时,整个集群系统中仅有一个主命名服务器,它负责管理和维护集群中一个全局、集中的JNDI树,集群中所有的EJB服务器在启动后,都要把要发布的对象绑定在这台命名服务器上,每个EJB服务器不需要维护自己的私有JNDI树,由这台主命名服务器来维护。假如在集群中一个EJB要在多个服务器上部署,那么每个服务器可以把同一个home对象绑定到命名服务器上,当一个客户从命名服务器请求访问这个EJB的home对象,可以将所有的home对象引用都返回给客户端,或者可以按一种均衡算法返回一个服务器的home对象引用(见图3)。这种集中式方法要提高整个系统可靠性,必须考虑命名服务器的备份问题,往往在大系统同时采用多台命名服务器,命名服务器间可以采用JNDI树复制方式,或者采用EJB服务器在多台服务器上绑定方式。例如Sybase公司的EJB应用服务器就是采用这种方式,它采用采用CORBA Cos Naming Service集中的管理Cluster中所有应用服务器的JNDI树。采用这种集中式的设计模型,系统设计简单,但同时为系统带来了集中式所固有的缺陷。首先,当系统设计中要考虑到命名服务器备份问题,而且随着集群系统越来越大,命名服务器在整个系统种瓶颈问题越显突出。
<o:p></o:p>
<v:rect id="_x0000_s1062" style="margin-top: 19.8pt; z-index: 17; left: 0px; margin-left: 90pt; width: 27pt; position: absolute; height: 70.2pt; text-align: left;"></v:rect><v:oval id="_x0000_s1063" style="margin-top: 12pt; z-index: 18; left: 0px; margin-left: 153pt; width: 54pt; position: absolute; height: 31.2pt; text-align: left;"></v:oval><v:oval id="_x0000_s1064" style="margin-top: 61.5pt; z-index: 19; left: 0px; margin-left: 153pt; width: 54pt; position: absolute; height: 31.2pt; text-align: left;"></v:oval>
3) 分布式JNDI树<o:p></o:p>
<v:line id="_x0000_s1027" style="z-index: 2; left: 0px; position: absolute; text-align: left;" from="18pt,288.6pt" to="90pt,288.6pt"></v:line><v:line id="_x0000_s1026" style="z-index: 1; left: 0px; position: absolute; text-align: left;" from="135pt,288.6pt" to="3in,366.6pt"></v:line>在这种模型中,Cluster中每台应用服务器都有自己的命名服务器,命名服务器不仅维护私有的本地JNDI树,同时维护一个全局共享JNDI树。本地JNDI树只绑定本地应用服务器中部署的对象,而全局JNDI树保存了Cluster中其他应用服务器上的本地JNDI树副本。这样Client访问任何一台命名服务器,通过它的本地私有和全局共享JNDI树就能定位整个系统中部署EJB对象。一般都是采用多播形式,当Cluster中一个应用服务器启动后,加入这个Cluster的多播组,然后再采用IP 多播技术复制它的本地JNDI树到Cluster中其他服务器上全局共享JNDI树,这样Cluster中其他服务器就拥有它的JNDI树副本。同时,这台应用服务器和Cluster中其它服务器之间一直要保持HeartBeats(心跳)检测,以随时检测其它服务器的活动状态,假如有一台服务器死机异常后,这台应用服务器就要从它的全局共享JNDI树中删除这台异常服务器JNDI副本,其它活动的服务器都要做类似的操作。这种分布式模型系统最大的优点是具有很强的伸缩性,系统中再添加一台服务器,其它的服务器可以不作任何的变动。而且整个系统采用分布式体系可用性增强,系统中任何一台服务器死机,都不会影响到整个系统的正常工作。这种方法也是目前采用最多的一种设计方法。BEA公司WebLogic应用服务器和JBoss应用服务器就采用这种设计方法。<o:p></o:p>
<o:p></o:p>
3.3 HttpSession Cluster<o:p></o:p>
在J2EE的Web程序Jsp/Servlet中经常用到Session对象,它的主要功能是记录访问端客户会话中有关信息。在一般的Web系统中,在Client访问阶段,假设系统中Server端死机后,这次Client访问中Session中保留的相关信息将全部丢失。用户下次访问就又需要重新开始建立新的Session。HttpSession Cluster的目的就是即使服务器端系统死机重新启动,上次未完成访问中的Session在系统中仍旧保存,Client可以接着完成上次未完成的访问。
在一些大型的系统中,同时又成千上万的用户同时访问,要时实的保存所有Client端的Session信息,而且以保证一旦系统失效,系统会重新载入自己的Session状态,用户能够继续操作。一般的实现HttpSession Cluster有下面两种方法:
1) 采用内存复制:
在这个方法中,当某台J2EE Server 中的某个HttpSession某个Object被修改后,或是新增一个Object后,这台Server可以采用某种通讯方式(如IP Broadcast )将这个Object传送到其它备份的J2EE Server上,让其它 J2EE Server上相同的HttpSession同步变化。
2) 集中式:
所谓的集中式处理,与上面的内存复制方法非常相似,不同的是在集中式中,Session中的Object不是送到其它的Server上,而是送到一台特定的机器上,在这台机器上Object中的信息可以采用对象序列化后文件保存,或者抽象成数据后,保存到关系数据库中。这台机器集中管理所有Cluster中的所有Session状态和信息。
4 结语<o:p></o:p>
本文在对于集群系统的方法分析侧重于JNDI树的实现问题,在实际的设计中还应该具体的考虑到两种会话Bean,实体Bean和消息驱动Bean对于集群方法实现的差异性以及它们的故障恢复技术。
发表评论
-
A4J 用户指南
2008-10-13 14:58 5672A4J 用户指南 Copy ... -
解决grails报java.lang.SecurityException:Prohibited问题
2008-08-28 18:06 3741今天有时间挨个找关于影响grails的问题,执行命令grail ... -
单个线程对多个线程的唤醒
2008-07-18 10:00 1255模拟两个线程之间的协作。 Athele 类有两个同步方法 pr ... -
hibernate usertype 如何得知自身实体状态
2008-05-07 09:37 1570hibernate usertype优劣网上有不少说法,下面是 ... -
发现一个在线学习groovy的好网站
2008-04-30 18:00 1309http://www.groovyland.net/groov ... -
今天发现个好东西--Grails
2008-04-03 20:00 1125学习Ruby,Ruby on rails是觉得他是动态语言 ... -
增强acegi ACL的拦截方法参数问题
2008-03-15 10:00 1724如果用acegi acl,你什么 ... -
acegi TransactionInterceptor遇到spring2.x
2008-03-10 21:38 2224一直使用spring2.x都没有问题,所有service都通过 ... -
lucene搜索时如果指定一个域为空呢?
2007-12-12 09:54 1410现在有个需求,搜索一个有父子关系的类别,只想搜索到是父的类别, ... -
请教compass如何映射java.util.Map类型
2007-11-08 16:11 1707现在实体设计有需要用到java.util.Map,但是在这个属 ... -
Compass怎样在指定alias中搜索
2007-11-01 09:24 2729我每个POJO都这有这样的注释 @Searchable(ali ... -
compass中如何配置分词器?
2007-09-29 09:04 4528在spring下的配置 <bean id=" ... -
集群基础知识
2007-08-29 17:37 12971.集群 集 群是提供 ... -
struts.properties详解
2007-08-17 11:53 1556struts.action.extension ... -
java如何保护领域对象
2007-06-14 18:58 2251请教个问题,JAVA如何保存WEB程序的领域对象呢,比如某个用 ... -
HttpClient
2007-06-07 02:29 2112一般的情况下我们都是使用IE或者Navigator浏览器来访问 ... -
Spring邮件抽象层和Spring中的定时调度的整合(四)
2007-04-05 18:35 17833) 写类 package exa ... -
Spring邮件抽象层和Spring中的定时调度的整合(二)
2007-04-05 18:28 1472其次: MimeMessagePreparator函数的使用 ... -
Spring邮件抽象层和Spring中的定时调度的整合(一)
2007-04-05 18:24 1984一. Spring邮件抽象层 Spri ... -
Spring邮件抽象层和Spring中的定时调度的整合(三)
2007-04-05 18:19 2164二.Spring的定时调度 Spring的定时调度有两种: ...
相关推荐
1. **高可用性**:通过镜像、复制和集群技术,ASE提供高可用性和灾难恢复能力。 2. **高性能**:利用优化的查询处理引擎和缓存机制,ASE能够处理大量并发交易和复杂查询。 3. **安全性**:ASE提供细粒度的访问...
- **集群与高可用**:EJB3允许在集群环境中部署,提高系统的可用性和可伸缩性。 - **安全性**:EJB3提供了基于角色的访问控制(RBAC)和其他安全机制,保障应用安全。 5. **EJB3 IN ACTION书籍**: "Mastering ...
JBoss的集群技术自3.0版本起就已经支持JNDI、会话状态和EJB的集群管理。4.0版本进一步增加了对JMS的集群支持。通过这种强大的集群能力,JBoss能够在多服务器环境中提供高可用性和性能优化。 总结来说,JBoss的集群...
总结起来,EJB和WebLogic的结合是构建大型企业系统的关键技术,它允许开发者专注于业务逻辑,同时享受Java EE平台带来的各种便利。深入学习和实践这个主题,将有助于提升Java EE应用的开发和管理能力。
- EJB 3.0特别强调其在分布式环境中的优势,如支持远程调用、容错机制和集群等功能,这使其成为构建大型分布式系统的理想选择。 #### 六、是否应该学习EJB 3.0 - **就业市场现状**:目前市场上对EJB 3.0的需求相对...
通过本书的学习,读者不仅可以了解到EJB的基本概念和技术细节,还能掌握如何在JBoss环境下有效地配置和部署EJB应用。对于希望深入了解EJB技术和实践的开发者来说,这本书无疑是一本非常有价值的参考书。
通过分析这些源代码,学习者可以了解如何在实际项目中整合Struts和EJB,以及如何在WebLogic上部署和运行这样的应用。 总的来说,这个"struts_ejb.rar"压缩包提供了一个很好的学习机会,让初学者能理解Java企业级...
- 对于大型应用,考虑使用集群和负载均衡等技术来提升系统的整体性能。 7. **安全性**: - 安全性是企业应用中不可忽视的一环。EJB3.0提供了多种安全机制,如认证、授权和加密等。 - 开发者可以通过配置文件或...
在实际项目中,EJB系统开发实战录会详细介绍如何从需求分析到项目实施,再到测试和上线的全过程,帮助开发者掌握EJB的使用技巧,提升企业级应用开发能力。通过阅读并实践,开发者可以深入理解EJB在大型企业级项目中...
通过分析这些代码,学习者可以深入理解EJB如何与其他Java技术如Servlet、JSP、JMS和JPA(Java Persistence API)协同工作,构建出复杂的业务解决方案。 在实践中,EJB常常与JavaServer Pages(JSP)、Servlet、Java...
- **集群支持**:WebSphere支持EJB的集群部署,提高了可用性和性能。 **2. WebLogic实现** Oracle的WebLogic Server也是一个广泛使用的EJB容器。它具有以下特点: - **高性能**:WebLogic通过优化的架构和高度可...
#### EJB集群实现 EJB(Enterprise JavaBeans)是J2EE的核心组件之一,用于实现企业级应用程序的业务逻辑。在集群环境中,EJB的实现主要包括以下几个方面: - **SMARTSTUB**:一种智能代理技术,用于处理远程调用...
WebLogic Server的核心特性包括高可用性、可扩展性和安全性,它通过集群技术可以实现负载均衡和故障恢复。 【WebLogic集群】 WebLogic集群是指一组相互协作的WebLogic Server实例,它们共享应用程序和服务,并且...
它提供了运行EJB、Servlets和JSF所需的所有环境,包括容器服务如事务管理、安全性和集群功能。开发者将编译好的Java代码部署到JBOSS服务器上,即可实现系统的运行。 5. **在线聊天功能**: 为了增强用户体验和互动...
总结,JBoss4.2.2集群配置是企业级应用的关键技术,涉及到服务器通信、会话复制、负载均衡等多个方面。通过合理的配置和性能优化,可以显著提升系统稳定性和效率。在实际操作中,务必结合具体业务需求和硬件环境,...
本文档主要关注的是IBM WebSphere在J2EE(Java 2 Platform, Enterprise Edition)、EJB(Enterprise JavaBeans)和WebService技术方面的应用与开发。 #### J2EE编程模型 J2EE是一个用于构建分布式企业级应用的标准...
- **集群与高可用性**:探讨了EJB集群的配置方法以及如何实现高可用性系统。 #### 三、关键技术点详解 ##### 1. **JavaBeans与EJB的区别** - **JavaBeans**:是基于Java的组件模型,通常用于封装数据或业务逻辑...
EJB集群 EJB(Enterprise JavaBeans)可以在JBoss集群中进行集群部署。 - **无状态会话Bean(Stateless Session Beans)**:适合于不需要维护客户端状态的应用场景。 - **有状态会话Bean(Stateful Session Beans)**:...