应公司要求,最近在学习weblogic集群这块的知识,下面我把我这几天学到的,以及过程中遇到的问题及如何解决的,分享给大家。首先,weblogic是Orcale公司的一款产品,至于其作用,我想就不用我说了。但是关于weblogic里面的几个专业名词,我想还是有必要去说一下的。
1.Server
用过tomcat的朋友应该清楚,当我们有多个项目部署在同一个tomcat服务器下的时候,我们只需要启动这个tomcat就可以根据目录的不同,访问这些应用,此时我们用的端口号不需要改变。在weblogic服务器中,一个server同等于一个tomcat。首先我们在创建一个server的时候需要给它指定一个ip和端口(这个ip可以是一台远程机器的ip)。创建好server以后,我们就可以将项目部署在其中了。如果我们有多个项目,并且我希望每个项目能对应不同的端口,那么我们就可以通过创建多个server来实现。有时候我们称server为'节点',所以以后听到别人说节点的时候也不要茫然,说的就是它了。
2.Cluster
这个,就是我们本文要讲的重点,集群。按照我个人的理解,集群就是把具有相同应用的一些server,放在一起,统一管理。举个很简单的例子,就是我现在有项目,我分别放在三个不同的server里面(先别管我为什么放三个不同的server中)。那么问题来了,我项目要有改动了怎么办?分别去各自的server中重新部署?别开玩笑了,万一不是三个是十个呢?万一不是在同一台机器上呢(前面说了,可以是一台远程机器)?
我们带着这个问题再来看一下集群,放在一起....统一管理....
现在明白了吧,这就是集群给我们带来的便利,将这些server加入到同一个集群当中,如果项目有变动的话,我们只需要在部署项目的时候,通过集群去部署,那么weblogic会自动帮我们将应用分配到各个子节点中。
3.domain
domian我们有时候也会把它称作为'域',他就相当于一个大的容器,里面可以存放很多server,其中有一个默认的server,它会随着域的启动而启动。有一点我们必须要清楚,就是当你想要启动某个domain下的server的时候,必须先启动这个domain。Cluster和domain之间的关系也差不多如此,总之呢,先有domain再谈其他。如果还不理解,没有关系,看完下面这幅图,我想你大概也就明白了。
到这里我想应该都清楚什么是集群,以及集群的作用了吧。接下来,我给大家讲一下,一般什么时候需要用到集群。
不知大家是否还在疑惑,前面,为什么我说要把同一个项目,分别部署到多个server中呢?其实这样做的目的,是为了减轻服务器的压力,当一个web项目并发访问人数过多的时候,可能会造成服务器压力过大而崩溃,如果能将用户均匀的分散到多个服务器上,显然能够很好解决这个问。如果想让用户的访问分散到各个服务器,同时又不让客户端察觉,除了用Cluster来同步应用以外,这里我们还需要用到另一个技术,就是代理,代理服务器只有一个,用户如果要访问应用,只需要访问代理服务器就可以了,然而将用户分配至各个server的应用上的工作,则由代理来做。
有了以上基础,下面我将正式教大家部署集群和代理。
就拿上面的那幅图来举例子。假设我现在有个shop应用,我需要把它分别部署在个不同的机子上,一台IP为100,另一台IP是133。在这里,我把代理服务器和集群单独放在另一台机子上IP为125。我们把这个125:7001节点称之为管理节点,100:7100和133:7200为受管服节点。
首先先创建一个125:7001的domian(提示如果没有多台机子可以在同一台机子创建多个domain测试)
配置完管理管理服务器之后,我们来创建对应的两个子节点的domain。
前面的步骤都是一样的。
后面直接下一步,下一步。
这样第一个字节点就配好了,第二子节点也是这样配,这里我就不再重复去说了。此时启动服务器,登陆控制台,就是下面这个样子了,图中我是建了3个子节点。
再说一下通过集群配置数据源和部署应用。这里我只是简单说一下与传统方式配置数据源和部署应用的不同之处。如果对传统的部署方式不了解,可以看我写的另外一篇专门讲关于数据源配置和应用部署的文章:
配置应用的时候也是如此,注意选择集群。配置完之后呢,集群这一块基本上就结束了。哦对,还得说一下如何启动子服务。
首先我们需要启动命令行工具,运行-cmd
然后将目录切换到adminDaomain目录下
执行如上命令:startManagedWebLogic.cmd + 受管服务名(子) + 管理者IP:端口
等待片刻,直到命令行末端出现RUNNING表示子服务启动成功
接下来,我们来说一下设置代理。
我们先创建一个代理应用,这里讲取名为defalutProxy
我们只需要在web-inf下创建两个xml文件就可以了。web.xml和weblogic.xml
web.xml
1 xml version="1.0" encoding="UTF-8"?> 2 <web-app> 3 <init-param> 4 <param-name>DebugConfigInfoparam-name> 5 <param-value>ONparam-value> 6 init-param> 7 <servlet> 8 <servlet-name>HttpClusterServletservlet-name> 9 <servlet-class>weblogic.servlet.proxy.HttpClusterServletservlet-class> 10 <init-param> 11 <param-name>WebLogicClusterparam-name> 12 <param-value> 13 192.168.0.100:7100|192.168.0.133:7200 14 param-value> 15 init-param> 16 <init-param> 17 <param-name>DebugConfigInfoparam-name> 18 <param-value>ONparam-value> 19 init-param> 20 <init-param> 21 <param-name>verboseparam-name> 22 <param-value>trueparam-value> 23 init-param> 24 servlet> 25 26 <servlet-mapping> 27 <servlet-name>HttpClusterServletservlet-name> 28 <url-pattern>/url-pattern> 29 servlet-mapping> 30 <servlet-mapping> 31 <servlet-name>HttpClusterServletservlet-name> 32 <url-pattern>*.jspurl-pattern> 33 servlet-mapping> 34 <servlet-mapping> 35 <servlet-name>HttpClusterServletservlet-name> 36 <url-pattern>*.htmurl-pattern> 37 servlet-mapping> 38 <servlet-mapping> 39 <servlet-name>HttpClusterServletservlet-name> 40 <url-pattern>*.htmlurl-pattern> 41 servlet-mapping> 42 web-app>
weblogic.xml
1 DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic 810-web-jar.dtd"> 2 <weblogic-web-app> 3 <context-root>/context-root> 4 weblogic-web-app>
创建好代理应用之后,我们再返回weblogic 125:7100控制台,将应用部署到adminserver中。
后面只需要下一步下一步就可以了,很简单。代理应用的部署,与普通应用部署没什么区别。
现在,我们集群和代理统统部署好了,我们就该来测试一下效果了。
怎么测试呢?很简单。就像平常访问web应用那样访问就好了。如果分别部署在不同server中的项目都能正常访问,那说明集群这块就彻底OK了。至于代理嘛,,你就假设你管理节点里面也部署了这个项目(事实上没有不,你是知道的),然后我们就像访问其他两个子server下的项目一样去访问试试吧,如果能访问到,就说明代理也起作用了...
还有一个测试方法比较不错,写一个jsp页面,页面内容为打印当前server的名称,这样当我们在前前台通过代理访问项目的时候,就可以清楚的知道每次访问的是哪个server里面的jsp页面。
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="java.io.PrintWriter"%>测试页面 <% String servername = System.getProperty("weblogic.Name"); PrintWriter writer = response.getWriter(); writer.write(""+servername+""); System.out.println(servername); %>