Karaf(OSGi)+CXF荊棘之路

吐槽:不斷的JAVA新技術學習中,幸得筆者同事xunhua是大神,真的是大神級那種,一路抱大腿走過荊棘之路,真的能夠用荊棘來形容Karaf(OSGi)+ CXF的學習難度,由於國內教程少之又少,國外官方文檔儘管齊備但通篇閱讀並實戰成形,對於我這種JAVA小白簡直就是在開荒同樣...滿路荊棘。筆者JAVA很菜,文章僅供本身複習使用,不專業之處請見諒。
前言:最近因公司軟件遭受Struts漏洞攻擊,多個系統均被影響,公司高層決定去Struts化,故而尋求JAVA裏冷門技術來避規熱門框架容易被發現漏洞而遭受攻擊的風險,這個決策是很明智的,但冷門技術也意味着更少的文檔幫助,須要更深厚的開發功底才能駕馭。提到Struts就得說說早點筆者剛畢業那會(2012年)學的是J2EE,Servlet,JSP這些今天看來較原生的技術,SSH(Struts+Spring+Hibernate)那會才流行起來,短短4年發展,現在(2016年)據說流行風向已經轉到SpringMVC+Mybatis去了,因而可知JAVA不斷學習成本仍是蠻高的。如今公司讓用Karaf(OSGi)+ CXF的框架,將來OSGi也許某天也會成爲主流的吧,本文主要講解如何簡單使用Karaf+CXF進行開發。html

Karaf及OSGi:
關於這兩個東西到底是啥,理論的東西就很少談了,由於國內國外能看到教程通篇理論到底比比皆是,各類神吹上天願景無限展望的文章多如牛毛,但能落到實處的卻少之又少,簡單點OSGi是種標準而Karaf是實現了這種標準的JAVA Container。
這裏談的是Karaf不是Kafka,兩個技術名詞長得很像倒是兩碼事...看錯文章的朋友請打住。
Karaf:
簡單來講,以筆者的理解Karaf是相似於Tomcat的Java Container,但Karaf比Tomcat更 爲強大,它能以模塊化加載管理,好比你須要Spring模塊來運行Spring的程序或是如咱們須要CXF模塊來運行咱們的CXF程序,你都是徹底可定製化的,Karaf提供了強大的命令行操做功能,若是學習過Linux的朋友運用起來確定不會以爲陌生。
OSGi:
這個東西比較扯淡,有興趣的朋友自行補腦吧,推薦一篇較好的博文:
http://www.cnblogs.com/jingmo...
筆者也沒有深度解讀,由於筆者一直都是重實用輕理論的程序員,由於技術更新換代太快了,不得再也不次感嘆JAVA技術學習的成本問題。
OSGi目前理解看來是熱部署的一種實現,熱部署簡單來講就是從整站到部分的更新,早些年的網站升級更新須要停掉服務器才能進行,哪怕你只修復後端一個小小的登陸bug,隨着系統愈趨於龐大的時候,一個大的系統集羣將由許多網站集成,關閉某個站點每每會影響到其餘系統,好比筆者所呆的公司每次一個系統升級都能影響到十來個其餘系統,開發完到正式上線老是須要不斷的和其餘組進行維護時間確認再確認,由於這十來個系統裏他們也在不斷的迭代更新中,極可能會由於你關閉1小時而沒有通知到位形成整個系統癱瘓(這種事仍是常常發生的),OSGi則是以最小量進行開發和部署的,好比一個程序裏有登陸和註冊兩個功能,那麼開發時登陸和註冊這兩個功能將分別開發及打包,也就是打包出來login.jar及reg.jar兩個包,而這兩個包又組成web.jar這個程序,在使用OSGi的JAVA Container(筆者此處僅介紹Karaf,聽說還有個Camel)進行更新時,若是本次更新只是涉及Login.jar的部分,那麼咱們只須要把Login.jar部分打包放到Karaf裏,Karaf會自動幫你先暫停Login這塊的功能,但此時Reg的功能是不受影響的,快速更新完Login以後將繼續服務,整個過程不會須要整站暫停,由於你的開發針對局部,更新也是局部的,若是某次更新都涉及了Login和Reg,那麼咱們須要打包Web到Karaf,Karaf會自動處理,而與Web同級別的其餘網站好比Web—2將不受Web-1的過分影響,通常遇到此類須要整站更新的部分多半都仍是會通知其餘別人,同步進行的好,使用OSGi的好處在筆者看來,修復Bug更快速,畢竟一個大的版本都須要更新的時候,說明這個版本還不能達到release的要求。java

CXF:
一個SOA框架,至於要分出個什麼不一樣來,真的不太清楚,在筆者認爲相似於.NET裏的WCF
百度百科貌似要寫得更容易讓人明白一點:http://baike.baidu.com/link?u...linux

Maven:
打包工具,如以前提到的咱們只但願打包出login.jar、reg.jar這類最小的單元,而如何讓login.jar和reg.jar組成web.jar這些都是須要Maven去配置管理引用關係的。筆者又篇關於Maven的文章,記錄了筆者學習Maven遇到的坑。程序員

基本技術介紹完畢,進入正題:web

筆者使用版本:apache-karaf-4.0.7數據庫

1.Karaf路徑解讀apache

clipboard.png

其實同linux的路徑很類似:
/bin 存放了一些服務器操做的腳本,要啓動karaf的話,雙擊karaf.bat便可(切忌不是start.bat)
/data 存放karaf運行中的日誌、部署以後的bundle等,其中/cache即爲真正運行的bundle緩存程序,每個bundle下都會有bundle.info文件標註出部署前引用的源文件出處
/demos 官方給出的項目使用案例
/deploy 部署源文件,將打包後的jar文件拖進此文件夾,karaf即會開始自動部署到/data文件夾下
/etc karaf的環境變量文件夾,其中.properties爲karaf的配置文件,.cfg爲程序配置文件,好比你的數據庫鏈接bundle須要從配置文件中讀取數據庫地址信息,則須要在該文件夾下建立對應的cfg文件,並在Activator中進行讀取,將再後面進行詳細解讀後端

2./etc文件夾下的奧義
這個文件夾下存放了大量的配置文件,搞懂這些配置文件即是把karaf玩上更高水平的必經之路,可是對於匱乏的幫助文檔而言,實在是不小的一筆學習成本。緩存

1.config.properties
根據config.properties的開篇註釋,這個文件列出了karaf的默認參數設置,能夠修改custom.properties來複寫這個文件
其中值得提出的是karaf.framework=felix屬性,在OSGi框架中有四大金剛Knopflerfish, Apache Felix, Equinox, Spring DM,
這裏能夠切換框架,karaf支持Apache Felix及Equinox,eclipse上所使用的也是Felix框架,因此有心的朋友能夠去探索下。
關於karaf調用的java版本則是默認使用system的JAVA_HOME配置,須要更改java版本則須要賺到/bin目錄下的setenv.bat中進行修改

2.org.ops4j.pax.web.cfg
該配置文件主要設定了http的訪問端口,由於筆者用CXF,而karaf的多端口技術,據xunhua說實現起來較難,建議是兩份karaf的copy,
修改此處爲不一樣的端口來實現較容易些:org.osgi.service.http.port = 8181

3.Activator啓動入口
這個東西有點像.NET裏的global.asax文件,這個類實現了BundleActivator接口,而這個接口提供了兩個經常使用函數Start及Stop分別對應bundle啓動時調用及bundle
中止時調用,這使得咱們能夠在bundle的生命週期中去作一些事,好比在start時去讀取數據庫的配置文件。
你能夠在你的工程內編寫多個不一樣實現BundleActivator接口的Activator類用於不一樣場景的調用,但在配置時,生效的只能指定一個,而這個指定則在maven的pom.xml配置文件中。
在plugin標籤下指定bundle-Activator屬性所對應的類。服務器

clipboard.png

相關文章
相關標籤/搜索