基於OSGi和Spring開發Web應用

2021-01-11 51CTO

作為一個新的事實上的工業標準,OSGi 已經受到了廣泛的關注, 其面向服務(接口)的基本思想和動態模塊部署的能力, 是企業級應用長期以來一直追求的目標。Spring 是一個著名的 輕量級 J2EE 開發框架,其特點是面向接口編程和非侵入式的依賴注入。將 OSGi 和 Spring 結合能充分發揮二者各自的特長,更好地滿足企業級應用開發的需求。Spring 開發組織在 2008 年發布了將 OSGi 和 Spring 結合的***個版本:Spring-DM。本文通過一個簡單實例,介紹如何利用 Spring-DM 開發基於 OSGi 和 Spring 架構的 Web 應用,同時探討其中用到的關鍵技術及其基本思想。

51CTO編輯推薦:OSGi入門與實踐全攻略

開發一個簡單的OSGi Web應用實例

一個簡單的 Web 應用

我們寫一個簡單的 Web 應用 compute.html :計算兩個數字的和或乘積。如下圖所示:

圖 1. 一個簡單例子

為了體現 OSGi bundle 的動態部署能力,我們寫兩個 service bundle,其中一個計算兩個數字的和(稱為 add bundle),另外一個計算兩個數字的積(稱為 multiply bundle)。 當我們點擊「Compute」按鈕的時候,如果此時 add bundle 被部署,則頁面將返回兩個數字的和,否則如果此時 multiply bundle 被部署,則頁面將返回兩個數字的積。開發環境準備

1.下載 Eclipse 3.4

2.獲取所有 OSGi, Equinox 和 Spring 的插件, 如下圖所示:

 

1.打開 Eclipse, 設置 target platform 為上述插件集合

基本模塊設計

該應用主要包含兩個層次: 服務層和 Web 層。Web 層基於 Spring-MVC 實現,包含處理 Web訪問相關的 bundle(本例中只有一個)。服務層包含處理數字計算的 bundle,本例中包含一個聲明服務接口的 compute interface bundle 和兩個實現該服務接口的 bundle :add bundle 和 multiply bundle。基本模塊結構如下圖所示:

圖 3. 基本框架

模塊程序實現

Step 1 :實現 Service Layer

服務層的三個 OSGi bundle 實現完畢之後如下圖所示 :

圖 4. 服務層


其中 com.zxn.example.service.compute 是聲明服務接口的 bundle。com.zxn.example.service.compute.add和com.zxn.example.service.compute.multiply 是實現了服務接口的兩個 bundle。

1.com.zxn.example.service.compute

聲明一個 Compute 接口,其中包含一個接口方法 computeNums(),如下圖所示 :


圖 5. 服務層接口 bundle

1.com.zxn.example.service.compute.add

bundle com.zxn.example.service.compute.add 的基本程序結構如下圖所示:

圖 6. 接口實現 bundle :add

在該 add bundle 中,添加一個Add類,實現Compute接口,如下圖所示:


圖 7. 接口實現代碼 :Add 類

注意到我們在 META-INF 下建了一個 spring 目錄,並且添加了一個 computeAdd-context.xml 文件。系統啟動時,Spring 將利用該xml文件創建一個 bean 實例,並把該 bean 輸出為一個 OSGi service,如下圖所示 :


圖 8. Spring 聲明文件 :computeAdd-context.xml

該xml文件中,osgi : service是 Spring-DM 輸出 OSGi service 的標記,其中的 interface屬性標明了該 service 實現的服務接口。

1.com.zxn.example.service.compute.multiply

按照與add bundle 同樣的方法,實現 multiply bundle,如下圖所示:


圖 9. 接口實現代碼:Multiply 類

類似的,添加一個 computeMultiply-context.xml 輸出 OSGi service,如下圖所示 :
圖 10. Spring 聲明文件:computeMultiply-context.xml
Step 2 :實現 Web Layer
Web 層只包含一個 bundle:com.zxn.example.web,採用 Spring-MVC 和 OSGi 構建,基本程序結構如下圖所示

圖 11. Web Layer 程序結構

 

ComputeControler.java
該JAVA類實現了 org.springframework.web.servlet.mvc.Controller,是本 web應用中核心的 servlet,負責接受並處理 web 請求。該類調用 ComputeServiceRef 的方法實現業務邏輯。該類關鍵的方法是 handleRequest(…), 如下圖所示 :

圖 12. 核心 servlet 類

 

ComputeServiceRef.java
該 JAVA 類負責引用部署的 service bundle 完成最終計算,其中的 computeService 由 Spring 根據 OSGi 中實際部署的 service 進行注入。本例中,實際部署的 service 可能是 add bundle 或者 multiply bundle。

需要特別注意的是,此處體現了 Spring-DM 的動態特性。OSGi 的動態部署能力使得 Spring 的動態服務注入成為可能。

圖 13. 服務消費類


HTTPContextResgistry.java
該 JAVA 類負責在 OSGi 環境中配置和註冊 HTTP 服務,其關鍵方法為 bean 初始化時調用的 init( ) 方法。


圖 14. 在 OSGi 環境中註冊 HTTP 服務


該 init 方法中,第六行的 getHTTPService(…) 調用 OSGi 的 ServiceTracker 來獲取 OSGi環境中註冊的 HTTP 服務的引用,如下圖所示:


圖 15. 使用 ServiceTracker 獲取 HTTP 服務


computeWeb-context.xml
該 xml 文件主要用於配置 HTTPContextResgistry bean 類,以及導入對 Compute 服務接口的引用。標記 osgi : reference 用於聲明要導入的服務接口,其 interface 屬性標明了該接口的定義,本例中為 com.zxn.example.service.compute.Compute 接口。


圖 16. Spring 聲明文件:導入服務接口


computeWeb-Dispatcher.xml
該 xml 文件用於配置 ComputeControler bean類。


圖 17. Spring 聲明文件:配置核心 servlet 類

運行程序
以往開發 J2EE 應用通常需要將應用伺服器的 runtime 集成到開發環境中才能進行程序調試,非常麻煩。基於 OSGi 的應用完全可以脫離應用伺服器運行,這使得程序開發和調試變得非常容易,直接在 Eclipse 中調試運行就可以。我們在 Eclipse 中將程序運行起來,如下圖所示:
圖18. 運行 OSGi 程序
從上圖中看到,我們同時選擇部署了 add bundle 和 multiply bundle,利用 OSGi console 察看如下:
圖 19. 察看部署的 OSGi bundle
當 OSGi 環境中同時部署有多個服務接口的實現 bundle 時,OSGi 會選擇一個默認的 bundle提供服務。本例中,Spring 會默認注入 add bundle。我們通過 web 訪問 compute.html 頁面:
圖 20. 訪問頁面


點 Compute 按鈕之後,結果頁面如下:
圖 21. 訪問結果


可以看出,是 add bundle 提供了計算服務。下面我們通過命令 <stop 76> 來停止 add bundle的服務:
圖 22. 停止 add bundle
圖 23. add bundle 狀態變為 RESOLVED
重新訪問 compute.html 頁面,結果得到的是兩個數字的乘積。可以看出,是 multiply bundl
提供了計算服務。如下圖所示:
圖 24. 再次訪問頁面

小結

作為當前頗具生命力的兩個標準和框架,OSGi 和 Spring 已經初步融合在一起。二者的結合,為開發企業級的 Web 應用同時提供了巨大的靈活性和動態部署能力。本文通過一個簡單的例子,描述如何開發一個基於 OSGi 和 Spring 的 Web 應用,並說明了開發過程中涉及到的技術關鍵點。

【編輯推薦】

初探Java企業級開源框架OSGiJava代碼的靜態編譯和動態編譯中的問題比較成為Java高手的25個學習要點

【責任編輯:

彭凡

TEL:(010)68476606】

點讚 0

相關焦點

  • 使用Spring Boot,Angular 6和Maven構建Web應用程式
    使用Maven 組合Spring Boot和Angular可能是一項具有挑戰性的任務。在這篇文章中,我們將使用Spring Boot和Angular 6創建一個簡單的Web應用程式,並將它們打包在一個war文件中。創建Maven項目首先,創建一個包含兩個模塊的Maven項目:一個用於後端,另一個用於前端。
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • web前端開發常用工具有哪些
    無論是初學小白亦或是自身前端開發人員,好用的軟體工具可以幫助他們更好的工作。下面為大家介紹一些常用的web前端開發工具:1、BootstrapBootstrap 是快速開發 Web 應用程式的前端工具包。
  • 武漢Python Web全棧開發工程師修煉價格_web前端開發培訓哪家好...
    【課程介紹】課程以python語言為主導,進行web服務相關的全棧開發,包含後端伺服器開發,部署,監控;web前端開發,前後端不分離模板模式開發,前後端分離,單獨前端部署方案。flask jinja2模板引擎使用vue的方法(前後端不分離,但html頁面使用)前後端分離vue使用方法(使用vue-cli腳手架)nginx 部署 vue項目【項目練習】日記網站開發,基於前後端分離的開發模式(flask +vue),該項目主要根據學習的知識點加以鞏固,並講解一些基礎課程中未提及的知識點,如 vue公共組建定義,路由的一些高級用法等
  • Web 設計和開發工具指南
    它通過向開發人員提供可靠的架構支持來節省開發人員的時間。 還有一個社區門戶, 允許你與像你這樣好奇的開發者互動。 此外, 它還為 Java 應用程式提供了生命周期管理支持。 它由標準化的用戶界面工具包和面向數據的組件組成。3.
  • Java經典面試題Spring是什麼 Spring框架入門詳解
    這是初級開發人員必然被問道的問題,如果你不懂Spring你就無法從事這一行業,此處僅限技術人員,公司的繼承人等其他個例不受此限制。那麼Spring是什麼呢,Spring遵循分層的結構思想什麼什麼實現了高內聚低耦合巴拉巴拉一大堆,咬文嚼字不是我的強項,直接開幹,讓你們看看Spring到底是什麼東西。
  • 基於Django和翻譯API實現web版的中英文對照翻譯(一)
    考慮到篇幅問題,我在這篇文章裡面暫時只會簡單涉及3方面的內容:翻譯API的調用Django Web應用框架的簡單說明web頁面的效果展示說句題外話,有時候你會發現調用有道翻譯api的翻譯結果,和你自己在其官方web頁面上得到結果有所不同,那是因為有道翻譯內部實際上有多個翻譯版本。在wei頁面上你可以看到所有的版本,但好像有道翻譯api卻只能得到一個固定的翻譯版本。
  • 基於Android的嵌入式Web伺服器設計
    本文主要論述了基於Android系統環境,在家庭網關中實現嵌入式Web伺服器的設計方法,介紹了i-jetty嵌入式Web伺服器,及其Web應用功能的實現。1 Android系統介紹 Android行動裝置平臺是基於Linux內核再度開發的一個開源的作業系統和軟體平臺,最早期由Google公司進行研究和開發的。後來Goog le為了推廣此技術,它和中國移動、HTC、三星、摩託羅拉等幾十家手機通信運營商和製造商,建立了開放手機聯盟,共同開發Android行動裝置平臺。
  • 基於B/S結構的網絡控制系統開發
    本文根據這一思想提出基於b/s結構進行的網絡控制,並開發了一套基於plc和交流變頻器的實時遠程控制系統,該系統集工控組態軟體、plc技術、變頻控制技術,網絡通信技術於一體。這種在20世紀90年代中期發展的,基於瀏覽器、web伺服器和應用伺服器的計算結構稱為browser/service(b /s,瀏覽器/伺服器)計算模式,b/s模式繼承傳統的c/s(客戶/伺服器)模式中的網絡軟、硬體平臺和應用,但克服了c/s模式的上述缺陷,這種新的結構具有下列優點:  (1) 應用伺服器的開發簡單  b/s結構是一個包括了客戶、web伺服器和應用伺服器的三層結構
  • 如何使用SpringCloud進行灰度發布
    在開發或者測試的時候,或者線上發布,線上服務多版本控制的時候,需要對服務提供權重路由,最常見的使用就是,一個服務有兩個版本,舊版本V1,新版本v2。在線上灰度的時候,需要通過網關動態實時推送,路由權重信息。比如95%的流量走服務v1版本,5%的流量走服務v2版本。如何使用SpringCloud進行灰度發布呢?
  • 對常見的WEB伺服器和應用伺服器的介紹
    ③ BEA WebLogicBEA WebLogic Server 是一種多功能、基於標準的web應用伺服器,為企業構建自己的應用提供了堅實的基礎。各種應用開發、部署所有關鍵性的任務,無論是集成各種系統和資料庫,還是提交服務、跨 Internet 協作,起始點都是 BEA WebLogic Server。
  • Spring Boot Admin快速打造監控平臺
    Spring Boot Admin快速打造監控平臺 使用過Spring boot的開發者都知道actuator,它是Springboot提供的用來對應用系統進行自省和監控的功能模塊,藉助於Actuator開發者可以很方便地對應用系統某些監控指標進行查看、統計等。
  • Web1.0與Web2.0和Web3.0的本質區別是什麼
    經過十多年的發展,web2.0的已經極大豐富。而web3.0才剛剛露出尖尖角,它以區塊鏈和加密貨幣為重要基礎,引導網際網路走向個人控制數據所有權,並實現個人隱私。但向真正走向web3.0,並非坦途,web2.0經過十多年的發展,由全世界如此眾多的聰明人不斷改進才取得今日的成就,而web3.0要成為主流採用的網絡,所需的時間也不可能短。
  • 基於嵌入式Web網頁控制的遠程監控模塊
    在ZLSN2000之後,上海卓嵐科技依託其自身的ZLWeb嵌入式Web伺服器技術,推出了專門針對嵌入式網頁控制的模塊——ZLSN2030.基於Web的(也就是B/S架構的)物聯網監控方案,比基於客戶端(也就是C/S的架構)要優越,這是因為監控用戶端無需安裝專用的軟體
  • Web3.js基於以太坊的Javascript API
    Version : 1.0.0-beta.36Web3.js API類型eth:Etherum區塊鏈相關方法;net:節點的網絡狀態;personal:帳戶功能和發送;db:獲取/放置本地LevelDB;shh:使用Whisper的P2P消息傳遞;安裝Web3.jsnode實例化web3首先,我們檢查是否使用的dapp
  • 14個編寫Spring MVC控制器的實用小技巧
    如:import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller
  • 基於Spring Boot + MVC 之控制器Controller實現
    在src-main-java下面,找到com.zzfeng.springbootdemo這個包,在這個包上面右擊,再分別點擊New-Package,進入創建包的面板。在New Package面板上輸入包名controller,完成包的創建。創建成功後,會在com.zzfeng.springbootdemo下面出現一個名叫controller的包。
  • Spring 的 Controller 是單例還是多例?怎麼保證並發的安全
    我們下面來簡單的驗證下:package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller
  • 結構方程模型元分析:Web應用
    結構方程模型元分析(Meta-analytic structural equation modeling)是元分析的一個非常有潛力的方向,但是對於沒有使用過R和R包的初學者而言,做結構方程模型元分析還是比較困難的。基於此,我們也專門講解了結構方程模型元分析,感興趣的讀者可以聯繫小編QQ:3417492134獲取該課程。
  • 推薦14款開源的Web應用測試工具
    1.JMeter是Apache組織的開放原始碼項目,它是功能和性能測試的工具,100%的用java實現。2.GrinderGrinder是一個負載測試框架,通過Jython來編寫測試腳本,基於HTTP的測試可以由瀏覽器來記錄整個要測試的過程。