jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7
jboss4 遷移
幾周前,我發(fā)布了一個(gè)有關(guān)從Java EE 5遷移到7的博客 。這主要是關(guān)于如何使用新的Java EE 7改進(jìn)Java EE 5代碼。 現(xiàn)在,在這篇文章中,我將對(duì)應(yīng)用程序服務(wù)器端的遷移路徑進(jìn)行一些研究。
如果您使用的是Java EE 5,則很有可能正在使用以下服務(wù)器之一:
- JBoss 4倍或5倍
- 玻璃魚 2x
- Weblogic 10倍
- Websphere 7倍
還有許多其他支持Java EE 5的服務(wù)器,您可以在此處檢出它們。
序幕
我最終獲得了我在JBoss 4x上的大部分經(jīng)驗(yàn),因?yàn)楫?dāng)時(shí)我正在工作的公司已經(jīng)在他們的大多數(shù)項(xiàng)目中大量使用了它。 我對(duì)此事幾乎沒有表決權(quán),只是保持與JBoss合作的方向。
當(dāng)我們決定將我們的一個(gè)客戶端關(guān)鍵應(yīng)用程序從Java EE 5遷移到7時(shí),我們面臨著使用哪個(gè)應(yīng)用程序服務(wù)器的難題。 自從我擔(dān)任技術(shù)管理職務(wù)以來,我現(xiàn)在能夠影響該決定。 由于以下原因,我們最終選擇了Wildfly :
- 已實(shí)現(xiàn)Java EE 7完整配置文件
- 強(qiáng)大的CLI管理服務(wù)器
- 團(tuán)隊(duì)已經(jīng)熟悉Wildfly隨附的Java EE實(shí)現(xiàn)
即使這篇文章研究了JBoss和Wildfly ,但某些原則仍然適用于Application Server。 因此,我希望這對(duì)其他Application Server用戶同樣有用。 當(dāng)前,我們正在使用Wildfly 8.2.0,但本文中討論的內(nèi)容也應(yīng)與最新的Wildfly版本一起使用。
戰(zhàn)略
執(zhí)行Application Server遷移,尤其是涉及服務(wù)器之間相距甚遠(yuǎn)的遷移,絕非易事。 遷移路徑并非一帆風(fēng)順,因?yàn)槊總€(gè)應(yīng)用程序最終都會(huì)使用Application Server的不同功能。 更糟糕的是,該應(yīng)用程序甚至可能正在實(shí)現(xiàn)這些功能所支持的業(yè)務(wù)代碼,而這些功能可能在目標(biāo)遷移服務(wù)器中不可用。
無論如何,在進(jìn)行遷移項(xiàng)目時(shí)可以遵循兩種策略:
功能凍結(jié)
顧名思義,您將凍結(jié)項(xiàng)目以執(zhí)行必要的調(diào)整以遷移應(yīng)用程序。 處理復(fù)雜性可能更容易,但是另一方面,它會(huì)延遲業(yè)務(wù)功能并創(chuàng)建不可協(xié)商的期限。 要說服利益相關(guān)者采用這種策略是非常困難的,但是如果您有能力的話,那就去做。
組合式
另一個(gè)選擇是保持開發(fā)持續(xù)進(jìn)行并同時(shí)進(jìn)行遷移。 這對(duì)企業(yè)來說是最好的,但是需要更多的紀(jì)律和計(jì)劃。 您始終可以將應(yīng)用程序分區(qū)并將其拆分為模塊,然后少量遷移。 這是我通常使用的策略。
第一步
您可能需要一些時(shí)間才能完全遷移您的應(yīng)用程序。 在此期間,您需要保持舊服務(wù)器以及新服務(wù)器的運(yùn)行。 為此,您需要更新和復(fù)制環(huán)境。 就像分支代碼一樣,但是在運(yùn)行時(shí)。
您使用的支持工具可能也需要更新。 新服務(wù)器的Maven插件,即Jenkins部署,無論與Application Server進(jìn)行交互。 這是一項(xiàng)艱巨的任務(wù),因?yàn)楣芾硭羞@些額外環(huán)境和分支的復(fù)雜性并不容易。
走的路
考慮遷移時(shí),您需要擔(dān)心幾個(gè)細(xì)節(jié)。 這不是一個(gè)詳盡的列表,但可能是您將會(huì)遇到的最常見的主題。
類加載
如果您沒有遇到ClassNotFoundException , NoClassDefFoundError或ClassCastException您可能要考慮玩彩票并中獎(jiǎng)!
對(duì)于JBoss 4.x Classloader尤其如此。 當(dāng)時(shí),類加載是(仍然是,但甚至超過)一項(xiàng)昂貴的操作,因此JBoss使用了一種稱為UnifiedClassLoader東西。 這意味著應(yīng)用程序之間沒有真正的隔離。 EAR檔案可能會(huì)相互查看以加載庫。 當(dāng)然,這是要管理的主要難題。 最糟糕的部分是當(dāng)您必須使用JBoss服務(wù)器將應(yīng)用程序部署到客戶中時(shí)。 如果您無法控制它,那么當(dāng)前的部署可能會(huì)與您自己的部署發(fā)生沖突。
Wildfly引入了基于模塊的類加載,而不是通常的分層方法。 通常,除非使用文件描述符明確聲明,否則部署在Wildfly中的應(yīng)用程序?qū)o權(quán)訪問Application Server庫。 對(duì)于Java EE應(yīng)用程序,這些模塊是自動(dòng)加載的。
更換服務(wù)器時(shí),以下是與類加載相關(guān)的最常見問題:
- 坐在其他應(yīng)用程序上的缺少庫。
- 在服務(wù)器上已刪除或更新的庫上進(jìn)行中繼。
- 應(yīng)用程序上使用的庫現(xiàn)在是新服務(wù)器的一部分。
要解決此問題,您需要通過添加刪除所需的庫來調(diào)整項(xiàng)目依賴關(guān)系。 這里沒有分步指南。 每種情況都需要進(jìn)行分析并相應(yīng)解決。 這有點(diǎn)像試圖解開一個(gè)滿是結(jié)的弦。
如果您使用的是Dependency Plugin ,那么您可以使用mvn dependency:tree和mvn dependency:analyze來幫助您。
Wildfly還為您提供了一個(gè)特定的描述符文件jboss-deployment-structure.xml ,通過添加或刪除依賴項(xiàng)或更改類加載器的行為,您可以微調(diào)類加載。 這是一個(gè)例子:
jboss部署結(jié)構(gòu)
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"><ear-subdeployments-isolated>false</ear-subdeployments-isolated><deployment><dependencies><module name="org.jboss.msc" export="true"/><module name="org.jboss.as.naming" export="true"/><module name="org.jboss.as.server" export="true"/><module name="deployment.app-client.jar" export="true"/><module name="deployment.app-ear.ear.app-entity.jar" export="true"/></dependencies></deployment> </jboss-deployment-structure>這個(gè)自定義描述符正在添加來自其他部署的依賴關(guān)系,即app-client.jar ,甚至是app-ear.ear.app-entity.jar中另一個(gè)EAR的子部署。
最后,我的建議是嘗試遵守標(biāo)準(zhǔn),僅在絕對(duì)必要時(shí)才引入其他庫。 這肯定會(huì)減少您的類加載問題,并使將來更輕松地遷移到服務(wù)器的新版本甚至更改為另一臺(tái)服務(wù)器。
常規(guī)配置
在JBoss 4.x中,所有配置都分布在不同的文件中: server.xml , jboss-service.xml , login-config.xml以及許多其他文件。 您必須手動(dòng)編輯文件才能更改所需的配置。 這是一項(xiàng)繁瑣的工作,尤其是當(dāng)您無權(quán)訪問服務(wù)器并必須記錄一組更改以供他人執(zhí)行時(shí)。
在Wildfly中,大多數(shù)配置都進(jìn)入configuration/standalone.xml ,但我從未編輯過該文件。 Wildfly附帶了非常強(qiáng)大的命令行界面(CLI),可讓您編寫幾乎所有需要在服務(wù)器上執(zhí)行的更改的腳本。 以下是Undertow配置的示例:
欠佳
/subsystem=undertow/server=default-server/ajp-listener=ajp:add(socket-binding=ajp)/subsystem=undertow/server=default-server/host=app \:add( \alias=["localhost, ${app.host}"] \)/subsystem=undertow/server=default-server:write-attribute(name="default-host", value="app")/subsystem=undertow/server=default-server/host=app/filter-ref=server-header:add /subsystem=undertow/server=default-server/host=app/filter-ref=x-powered-by-header:add /subsystem=undertow/server=default-server/host=app/location="/":add (\handler=welcome-content)/subsystem=undertow/server=default-server/host=default-host/filter-ref=server-header:remove /subsystem=undertow/server=default-server/host=default-host/filter-ref=x-powered-by-header:remove:reload/subsystem=undertow/server=default-server/host=default-host/location="/":remove/subsystem=undertow/server=default-server/host=default-host:remove/subsystem=undertow/server=default-server/host=segurnet/setting=single-sign-on:add(path="/"):reload這將設(shè)置一個(gè)名為app的虛擬主機(jī),使其成為默認(rèn)主機(jī),刪除Wildfly隨附的默認(rèn)主機(jī)并激活Single Sign On。
使用腳本和CLI可以很容易地從頭啟動(dòng)新服務(wù)器。 您應(yīng)該始終喜歡這種方式來更改服務(wù)器上的配置。
數(shù)據(jù)源
在JBoss 4.x中,設(shè)置數(shù)據(jù)源只需要您將數(shù)據(jù)庫驅(qū)動(dòng)程序復(fù)制到lib文件夾,并使用數(shù)據(jù)源連接詳細(xì)信息創(chuàng)建*-ds.xml文件。
在Wildfly中 ,有些棘手,但沒什么大不了的。 將數(shù)據(jù)源設(shè)置為模塊,然后可以使用CLI將數(shù)據(jù)源連接詳細(xì)信息添加到服務(wù)器配置中。 過去,我甚至寫過一篇完整的博客文章: 使用Maven配置JBoss / Wildfly數(shù)據(jù)源 。
安全
JBoss 4.x中的安全性已在conf/login-config.xml 。 Wildfly并沒有引入太多更改,但是如果您需要實(shí)現(xiàn)自定義登錄模塊,則依賴項(xiàng)會(huì)更改。 我還寫了一個(gè)完整的博客文章: Wildfly的Custom Principal和LoginModule 。
JNDI綁定
在JBoss 4.x中通常使用@LocalBinding為您的EJB定義確切的JNDI名稱。 但是Java EE 7按作用域引入了標(biāo)準(zhǔn)JNDI名稱,這意味著您應(yīng)該遵循約定來查找EJB。
代替:
本地綁定
@Stateless @Local(UserBusiness.class) @LocalBinding(jndiBinding="custom/UserBusiness") public class UserBusinessBean implements UserBusiness {}...private UserBusiness userBusiness;try {InitialContext context = new InitialContext();userBusiness = (UserBusiness) context.lookup("custom/userBusiness"); } catch(Exception e) {}您可以:
EJB 3.1綁定
@EJB(lookup="java:global/app-name/app-service/UserBusinessBean") private UserBusiness userBusiness;當(dāng)Wildfly啟動(dòng)時(shí),您還可以在日志中檢查標(biāo)準(zhǔn)綁定:
Wildfly JNDI標(biāo)準(zhǔn)綁定
java:global/segurnet/segurnet-protocol-gu-ejb/UserBusinessBean!com.criticalsoftware.segurnet.protocol.gu.ejb.business.UserBusinessjava:app/app-service/UserBusinessBean!com.app.business.UserBusinessjava:module/UserBusinessBean!com.app.business.UserBusinessjava:global/app-name/app-service/UserBusinessBeanjava:app/app-service/UserBusinessBeanjava:module/UserBusinessBean其他的東西
這是我也寫過博客文章的更具體的主題,可能也很有趣:
- Spring Batch作為Wildfly模塊
- Wildfly,Apache CXF和@SchemaValidation
最后的話
如前所述,遷移永遠(yuǎn)不會(huì)遵循直接的路徑。 不過,您可以做一些改進(jìn)的事情。 編寫測(cè)試,測(cè)試和測(cè)試。 我有告訴你寫測(cè)試嗎? 在進(jìn)行任何遷移工作之前,請(qǐng)先執(zhí)行此操作。 即使遷移的一切看起來都很好,您也可能會(huì)在不同版本的Java EE實(shí)現(xiàn)之間遇到輕微的行為更改。
另外,不要小看這項(xiàng)工作。 使您的應(yīng)用程序與正在開發(fā)的新功能保持一致,以及更改服務(wù)器,需要您花費(fèi)時(shí)間和精力來確保一切都不會(huì)中斷。 除非我們談?wù)摰氖欠浅P〉膽?yīng)用程序,否則肯定不會(huì)花1周的時(shí)間。 我們花了將近2年的時(shí)間才能將應(yīng)用程序遷移到100萬行以上。 但是,請(qǐng)謹(jǐn)慎對(duì)待這些數(shù)字。 這些非常取決于您的團(tuán)隊(duì)動(dòng)態(tài)。
我的最終建議:如果您使用的是舊版Java EE版本,則一定要遷移。 在我的博客中了解有關(guān)從Java EE 5降級(jí)到7的Legacy的信息 。 跳躍并非易事,但是隨著Java EE發(fā)行版的每個(gè)新版本以及對(duì)標(biāo)準(zhǔn)化的關(guān)注,每次升級(jí)都將減輕痛苦。
翻譯自: https://www.javacodegeeks.com/2015/11/application-server-migration-jboss-ee5-to-wildfly-ee7.html
jboss4 遷移
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓传说对决怎么下载(安卓传说对决)
- 下一篇: crud-table_我个人的CRUD故