應公司要求,最近在學習weblogic集羣這塊的知識,下面我把我這幾天學到的,以及過程當中遇到的問題及如何解決的,分享給你們。首先,weblogic是Orcale公司的一款產品,至於其做用,我想就不用我說了。可是關於weblogic裏面的幾個專業名詞,我想仍是有必要去說一下的。html
1.Serverjava
用過tomcat的朋友應該清楚,當咱們有多個項目部署在同一個tomcat服務器下的時候,咱們只須要啓動這個tomcat就能夠根據目錄的不一樣,訪問這些應用,此時咱們用的端口號不須要改變。在weblogic服務器中,一個server同等於一個tomcat。首先咱們在建立一個server的時候須要給它指定一個ip和端口(這個ip能夠是一臺遠程機器的ip)。建立好server之後,咱們就能夠將項目部署在其中了。若是咱們有多個項目,而且我但願每一個項目能對應不一樣的端口,那麼咱們就能夠經過建立多個server來實現。有時候咱們稱server爲'節點',因此之後聽到別人說節點的時候也不要茫然,說的就是它了。web
2.Clustertomcat
這個,就是咱們本文要講的重點,集羣。按照我我的的理解,集羣就是把具備相同應用的一些server,放在一塊兒,統一管理。舉個很簡單的例子,就是我如今有項目,我分別放在三個不一樣的server裏面(先別管我爲何放三個不一樣的server中)。那麼問題來了,我項目要有改動了怎麼辦?分別去各自的server中從新部署?別開玩笑了,萬一不是三個是十個呢?萬一不是在同一臺機器上呢(前面說了,能夠是一臺遠程機器)?服務器
咱們帶着這個問題再來看一下集羣,放在一塊兒....統一管理....併發
如今明白了吧,這就是集羣給咱們帶來的便利,將這些server加入到同一個集羣當中,若是項目有變更的話,咱們只須要在部署項目的時候,經過集羣去部署,那麼weblogic會自動幫咱們將應用分配到各個子節點中。app
3.domaindom
domian咱們有時候也會把它稱做爲'域',他就至關於一個大的容器,裏面能夠存放不少server,其中有一個默認的server,它會隨着域的啓動而啓動。有一點咱們必需要清楚,就是當你想要啓動某個domain下的server的時候,必須先啓動這個domain。Cluster和domain之間的關係也差很少如此,總之呢,先有domain再談其餘。若是還不理解,沒有關係,看完下面這幅圖,我想你大概也就明白了。jsp
到這裏我想應該都清楚什麼是集羣,以及集羣的做用了吧。接下來,我給你們講一下,通常何時須要用到集羣。工具
不知你們是否還在疑惑,前面,爲何我說要把同一個項目,分別部署到多個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>DebugConfigInfo</param-name> 5 <param-value>ON</param-value> 6 </init-param> 7 <servlet> 8 <servlet-name>HttpClusterServlet</servlet-name> 9 <servlet-class>weblogic.servlet.proxy.HttpClusterServlet</servlet-class> 10 <init-param> 11 <param-name>WebLogicCluster</param-name> 12 <param-value> 13 192.168.0.100:7100|192.168.0.133:7200 <!-- 根據我的狀況將此處改成本身設置的子節點IP和端口 --> 14 </param-value> 15 </init-param> 16 <init-param> 17 <param-name>DebugConfigInfo</param-name> 18 <param-value>ON</param-value> 19 </init-param> 20 <init-param> 21 <param-name>verbose</param-name> 22 <param-value>true</param-value> 23 </init-param> 24 </servlet> 25 26 <servlet-mapping> 27 <servlet-name>HttpClusterServlet</servlet-name> 28 <url-pattern>/</url-pattern> 29 </servlet-mapping> 30 <servlet-mapping> 31 <servlet-name>HttpClusterServlet</servlet-name> 32 <url-pattern>*.jsp</url-pattern> 33 </servlet-mapping> 34 <servlet-mapping> 35 <servlet-name>HttpClusterServlet</servlet-name> 36 <url-pattern>*.htm</url-pattern> 37 </servlet-mapping> 38 <servlet-mapping> 39 <servlet-name>HttpClusterServlet</servlet-name> 40 <url-pattern>*.html</url-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"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>測試頁面</title> </head> <body> <% String servername = System.getProperty("weblogic.Name"); PrintWriter writer = response.getWriter(); writer.write("<http><body>"+servername+"</body></html>"); System.out.println(servername); %> </body> </html>