J2EE架构下,软件的部署环境为集群的情况很多,所以针对集群环境的软件开发非常重要,所以我们在编码过程中要超前思考,以免加大后期的工作量。
了解集群
什么是集群:
web应用服务器集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样。为了均衡集群服务器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理。从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性。
集群技术的特点
高可靠性和高可用性:通过集群技术组成的系统,可以确保数据和应用程序对最终用户的高可用性和高可靠性,也就是说当主节点上的系统崩溃时,冗余节点就从替补角色转换到正式角色,并自动投入应用,从而保证了系统运行的不间断。或者检测某一个空闲服务器,将请求分发给它,对请求进行处理,而且这一过程对用户来说,是透明的,用户察觉不到!
稳定性和可伸缩性:在系统的处理能力需要增加的时候,除了通过增加集群中每个计算机节点的单机处理能力(如通过增加CPU数量、增加内存大小等手段)外,还可以通过增加集群节点数,即通过向群集添加新的计算机节点,使服务随着处理器的添加而伸缩,从而增大应用程序吞吐量,以达到增加系统的整体处理能力的目的,完成系统的扩容。
Web应用服务器集群结构图,下面例举了weblogic和websphere集群结构图
websphere集群架构图
weblogic集群架构图
排除网络设备,由上面两幅图可以观察到,应用服务器集群包含了三部分
1.Web服务器(Web Server)
Web服务器专门处理HTTP请求(request),应用的软件如Apache,IBM HTTP Server,或者自己写的代理服务等等。
2.应用程序服务器(The Application Server)
应用程序服务器是通过很多协议来为应用程序提供(serves)业务逻辑(business logic)。
3.关系数据库系统
4.消息中间件
备注:一定要清楚web服务器与应用程序服务的区别
由图我们来分析一下,集群环境下开发需要注意哪些地方?
1.Session,我们经常用session来封装用户的登录信息,那么如果集群环境下一台机器session中有,一台没用回发生什么样的情况呢?幸好各个应用服务器都有在集群环境下session复制的配置。如果配置请查阅对应的文档。另外web开发经常用到Webwork,strut2,flex等技术,他们都对sesson的封装。他们是否也能复制呢?还要测试才行,当然理论上是可以的,呵呵!还有有的时候session要保存到什么位置?也是个问题a) 内存,b) 文件 c) 数据库。根据实际情况来选择吧。
2.Cache,Cache我们经常使用(我这里只说对象级缓存),如:将一些经常用到的数据缓存到内存中。这种情况下和session有些类似。有的人实例化了一个包含HashMap的一个单例的对象,用来缓存数据,单机环境没什么问题,可是如果是集群环境呢?会怎样?所有我们引用分布式缓存或者集中式缓存,分布式缓存有很多种如ehcache,jbosscache,oscache等,集中式缓存比较典型的就是memcached。选择分布式还是集中式根据项目的需要来定了。这里就不说了。
3. 线程、定时器,如:单机环境下我们写一个单线程,如用来像其他系统上传数据(这个数据部允许多次上传),如果程序发布在集群环境下回发生什么情况?呵呵。变成多线程了。多个计算机内的单线程同时上传数据。所以这个时候考虑的地方就很多了!!是选择故障转移还是负载均衡都是考虑的范围。定时器也雷同。可以参考spring quartz 集群解决方案。
4.JDBC,JDBC注意的是数据库集群的情况,如weblogic集群架构图所示,编写程序时,获得JDBC链接可以这样写,
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //JVM加载驱动类
String url = "jdbc:oracle:thin:@(description =(address =
(protocol = tcp)(host = 192.168.1.246)(port = 1521))(address
=(protocol = tcp)(host = 192.168.1.248)(port =
1521))(load_balance= yes)(connect_data =(service_name = twjk)))";
String url = "jdbc:oracle:thin:@(description=(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.1.158)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.1.159)(PORT = 1521))(load_balance=yes)(failover=yes))(connect_data=(service_name= racdb)))";
con = DriverManager.getConnection(url, "twjkdev", "twjk");
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return con;
在服务器中配置数据源是不同的服务器配置也不一样。
如在websphere中,配置数据源的URL选项可以加入如下代码
jdbc:oracle:thin:@(description=(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.1.158)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.1.159)(PORT = 1521))(load_balance=yes)(failover=yes))(connect_data=(service_name= racdb)))
程序自己选择使用的JDBC链接 。
在weblogic中是使用多数据源的方式来实现的,服务器有负载均衡和故障转移两项选择。
5. JMS,
如:weblogic集群环境下有分布式主题,分布式队列,分布式队列与普通队列的区别?分布式队列与分布式主题的区别?点对点应用时,在集群环境下使用分布式主题还是分布式队列?
总结:关于集群应用,每个项目都有各自的特点,我的经验有限,也来个抛砖引玉吧!!如果有不正确的地方还请指教!!!!