2011-04-29 109 views
1

我使用JSP + Struts2 + Tomcat6 + Hibernate + MySQL作爲我的J2EE開發環境。由於該項目規模龐大且即將出現性能問題,因此決定將該項目部署在多臺服務器上。由於該項目是在三層體系結構中開發的,因此我們希望爲每層分配一臺獨立的機器,並通過千兆以太網連接將它們連接起來。所以我們需要一個DB-Server(MySQL),一個Logic-Server(Struts2 + POJOs)和一個Web-Server。如何在多個服務器上分發j2ee應用程序?

我想DB-Server和邏輯 - 服務器之間的通信將不會是一個問題,但連接的Web服務器和邏輯 - 服務器似乎有點莫名其妙給我。考慮到我們可能會增加下一階段各層服務器的數量,在這種情況下我有什麼選擇?

任何想法將不勝感激!

[編輯]

Tomcat是邏輯 - 服務器的一部分,它位於何處POJO和支柱走了,我的意思的Web服務器是一個前端服務器這需要用戶的請求,並把它們分派給邏輯服務器。另一方面,我們可能想要使用多個邏輯服務器。它甚至有可能嗎?

順便說一句,將JMS是任何幫助嗎?

回答

0

根據層級分發應用程序不一定是一個好主意。與單個JVM內的通信相比,網絡通信速度較慢。出於這個原因,你想盡量減少不同機器之間的通信。這通常通過提供粗粒度界面來實現,例如,

interface User 
{ 
    void setAddress(String name, 
        String street, 
        String zip, 
        String city, 
        String country); 
} 

代替

interface User 
{ 
    void setName(String name); 
    void setStreet(String street); 
    void setZip(String zip); 
    void setCity(String city); 
    void setCountry(String country); 
} 

理性的是,如果你改變一條在User對象的信息,其他部分可能被隨之改變。粗粒度接口然後確保在網絡上更少的方法調用。

+1

-1超過四個參數的方法是脆弱的,難以測試和不良的風格。此外,答案與問題無關。 :-) – 2011-04-29 10:23:07

+0

@Aaron你提到的*四*是任意的。其他消息來源說六。此外,答案與問題有關,因爲它告訴在多個服務器上分發j2ee應用程序時需要考慮什麼。如果您有理由認爲在多個服務器上分發j2ee應用程序時不需要考慮粗粒度接口,那麼您的-1就是合理的。因爲首先它需要大量的代碼和第二休眠的變化不會採取這麼友好 – Oswald 2011-04-29 10:40:32

+0

感謝您的回答,但使用粗粒度的接口不會是一個合理的選擇。 – 2011-04-29 11:48:36

1

的邏輯需要去Tomcat服務器上也是如此。沒有Web服務器的Struts是沒有意義的。

還是你的意思「Web服務器」,如「能夠理解HTTP啞文件服務器」?在這種情況下,你根本不連接它們; Web瀏覽器將爲您執行此操作:JSP/Servlet代碼將向瀏覽器發送圖像和其他靜態內容的URL,瀏覽器將使用這些URL直接從「Web服務器」下載數據。

你絕對不希望「邏輯服務器」下載東西並提供它。

+0

@Aaaron:你是絕對正確的tomcat左右,我編輯的問題得到錯誤的想法保持距離下一個觀衆。我想我會在「理解HTTP的笨文件服務器」上同意你的觀點。那麼這個是怎麼回事?只是JSP頁面?你能否更詳細地解釋你的想法? – 2011-04-29 12:25:13

+2

轉儲HTTP服務器提供CSS,JavaScript的靜態(不是說你在JSP中生成的部分),圖像,標識,不產生任何東西。 JSP與POJO一起進入邏輯服務器。 – 2011-04-29 12:27:59

+0

感謝好友,似乎有道理,但對於我擁有的JSP頁面有點麻煩。我會把它爲更多的考慮 – 2011-04-29 12:55:41

1

你甚至可以將Struts應用程序拆分爲「邏輯服務器」和Web服務器嗎?

Tomcat是一個應用服務器,因爲它可以運行你的邏輯併爲您的網頁。 如果您真的想將您的邏輯運行負載分佈到另一臺服務器上,請嘗試實施面向服務的體系結構。

我的經驗僅限於使用:JSF的前端和一些日期操作(呈現),IBM的Websphere的邏輯(工藝設計在WebSphere Integration Developer,不是純Java)和Oracle的數據庫。所有這些服務器都託管在不同的機器上。

在你的情況,你可以使用Java Web應用程序來執行你的邏輯,並且可以在其他Tomcat服務器上運行(從前端應用程序的服務器分開)。在這種情況下,您會將您的函數公開爲webservices,並讓前端應用程序調用它們。

+0

薩拉姆,我認爲你是對的,分離的tomcat和POJO甚至是不可能的,我糊塗了一會兒!我編輯了這個問題。你可能想重新考慮最後一部分。 – 2011-04-29 12:06:55

+0

我不確定你的意思是接受請求並將它們發送到服務器。這是否意味着你需要一個表單頁面(前端)將POSTS或GETS數據插入到將數據插入DB(數據層)的Java類(邏輯層)?在這種情況下,將它們放在不同的服務器上是沒有意義的。但是,如果您在前端(基於核心邏輯運行並返回數據之後)的基於服務器的重要處理負載,則可以將它們保留在不同的服務器上。 – Ali 2011-04-29 13:07:42

+0

你明白了。這就是我想到的。前端服務器POST和GET(執行操作)數據到java類(邏輯層)和邏輯層與分離的DB層進行通信。由於會有很多用戶和大量請求,最好在分離的前端服務器上管理它們,並減輕邏輯服務器的負載。仍然不同意? – 2011-04-29 15:27:05

相關問題