0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenDaylight中的OSGi

汽車電子技術(shù) ? 來(lái)源:碼農(nóng)與軟件時(shí)代 ? 作者:碼農(nóng)與軟件時(shí)代 ? 2023-02-14 15:05 ? 次閱讀

從寫單個(gè)類的打印Hello World小程序到OSGi模塊化開發(fā),確實(shí)存在較大的難度,本文將從模塊化、OSGI模型以及OSGI在OpenDaylight中的應(yīng)用等方面進(jìn)行介紹。

一、模塊化

我們學(xué)習(xí)Java語(yǔ)言時(shí),最初寫的程序便是在控制臺(tái)打印Hello World,此時(shí),我們寫的代碼放在一個(gè)類中;慢慢地,我們編寫的代碼需要放在幾個(gè)的類時(shí),我們就要考慮如何設(shè)計(jì)類與類之間的關(guān)系,你需要面向?qū)ο蟮脑O(shè)計(jì)原則和模式;工作中我們要做一個(gè)小項(xiàng)目,就可能涉及到數(shù)百個(gè)類了,我們會(huì)根據(jù)不同的業(yè)務(wù)職責(zé)將這些類進(jìn)行邏輯上的劃分,分隔不同的小模塊,每個(gè)小模塊賦予相應(yīng)的職責(zé),也就是將一個(gè)系統(tǒng)分解為多個(gè)較小的互相協(xié)作的單元,并設(shè)定單元之間的邊界來(lái)改善系統(tǒng)的維護(hù)性和封裝性。大致過(guò)程如下圖①②③所示:

圖片

至目前為止,我們所做的事情是對(duì)類進(jìn)行了邏輯的包裝,而實(shí)質(zhì)上并沒有對(duì)類進(jìn)行物理隔離。通常情況下,軟件在初始構(gòu)建時(shí),并不是很復(fù)雜,但隨著時(shí)間的推移、業(yè)務(wù)特性的增加、不規(guī)范的代碼調(diào)用以及為趕進(jìn)度而忽略架構(gòu)的設(shè)計(jì),就使得軟件變得復(fù)雜起來(lái),甚至極難維護(hù)。如同雙11爆倉(cāng)時(shí)凌亂不勘的場(chǎng)景:

圖片

圖片來(lái)自互聯(lián)網(wǎng)

那么如何降低軟件的復(fù)雜性呢?生活中的貨物運(yùn)輸或許是一個(gè)很好的借鑒例子,我們將零散的貨物打包在一起,形成封閉的空間;然后,通過(guò)標(biāo)準(zhǔn)的接口裝載到集裝箱運(yùn)輸船。

圖片

事實(shí)上,早在1972年國(guó)際軟件工程大師David Parnas在《On the Criteria To Be Used in Decomposing Systems into Modules》一文中就提出了模塊化編程的思想:“每項(xiàng)任務(wù)構(gòu)成一個(gè)獨(dú)立的、特有的程序模塊。實(shí)現(xiàn)時(shí),每個(gè)模塊及其輸入/輸出都有確定含義的......系統(tǒng)以模塊化的方式進(jìn)行維護(hù)”,其實(shí)質(zhì)就是軟件模塊劃分應(yīng)該以基于信息隱藏為目的,以職責(zé)劃分為手段,從而封裝變化。聯(lián)想到集裝箱的例子,軟件的模塊可以類比為集裝箱,如下圖所示:

圖片

我們現(xiàn)在正式介紹軟件模塊,在《Java應(yīng)用架構(gòu)設(shè)計(jì) 模式與OSGI》一書中進(jìn)行了描述:軟件模塊是可部署的、可管理的、原生可重用的、可組合的、無(wú)狀態(tài)的軟件單元,它為用戶提供了簡(jiǎn)潔的接口。

①可部署:模塊是一個(gè)獨(dú)立的部署單元,它能夠與其他軟件模塊共處。EAR、WAR以及JAR文件。

②可管理:在運(yùn)行時(shí),模塊可以進(jìn)行安裝、卸載以及更新。實(shí)體樣例:EAR、WAR以及JAR文件。

③原生可調(diào)用:模塊總是原生可調(diào)用的。也就是說(shuō),模塊暴露的操作是通過(guò)直接調(diào)用方法觸發(fā)的。

④可組合:一般指的是粗粒度的模塊是由細(xì)粒度的模塊組成的。

⑤無(wú)狀態(tài):特定版本的模塊只會(huì)存在一個(gè)實(shí)例。

由前面的分析可知,Java模塊化支持局限于細(xì)粒度的面向?qū)ο笾С?,需要有更高抽象粒度的模塊。OSGi便是Java模塊化需求其中一個(gè)解決方案。

一、OSGi

  1. 什么是OSGi?

OSGi(Open Services Gateway initiative,開放服務(wù)網(wǎng)關(guān)協(xié)議)是由 1999 年成立的 OSGi 聯(lián)盟提出的一個(gè)開放的服務(wù)規(guī)范,最早用于嵌入式設(shè)備。在2004年,Eclipse發(fā)布于基于OSGi的運(yùn)行時(shí)模型,把 Equinox 作為底層運(yùn)行平臺(tái)。借助于Eclipse,OSGi在商業(yè)化軟件企業(yè)中得到廣泛的關(guān)注?,F(xiàn)已廣泛應(yīng)用于移動(dòng)設(shè)備、桌面應(yīng)用以及企業(yè)應(yīng)用服務(wù)器。

  1. OSGi框架

OSGi框架是應(yīng)用的執(zhí)行環(huán)境。OSGi框架規(guī)范定義了OSGi的行為,現(xiàn)已有Apache Felix、Eclipse Equinox以及Knopflerfish等多個(gè)開源實(shí)現(xiàn)。OSGi的分層架構(gòu)如下:

圖片

模塊層定義了模塊,稱為Bundle,體現(xiàn)為一個(gè)JAR文件,由類文件、資源文件和MANIFEST.MF組成。和普通的jar文件唯一不同的就是MANIFEST.MF文件的內(nèi)容,基本上都是標(biāo)識(shí)Bundle的屬性,Import-Package聲明了請(qǐng)求JAR文件中的代碼所需要的外部包。其文件樣例為:

圖片

生命周期層定義了動(dòng)態(tài)安裝和管理Bundle,即可以在框架中安裝和卸載bundle,而不需要重啟應(yīng)用進(jìn)程。

服務(wù)層定義了面向服務(wù)的應(yīng)用編程模型,涉及面向服務(wù)的發(fā)布、查找和綁定交互模式:服務(wù)提供者將服務(wù)發(fā)布到服務(wù)注冊(cè)中心,然后服務(wù)請(qǐng)求者通過(guò)搜索服務(wù)注冊(cè)中心,查找可供使用的服務(wù)。這種機(jī)制稱為VM中的SOA。事實(shí)上,服務(wù)就是Java接口。

圖片

3.OSGi生態(tài)

圖片

4.Bundle交互

了解了OSGi基礎(chǔ)知識(shí)后,我們來(lái)看下Bundle交互的實(shí)現(xiàn)方式:

(1) Export和Import:即通過(guò)Package的Export和Import來(lái)進(jìn)行。服務(wù)提供者Bundle對(duì)外Export自己的package,而服務(wù)請(qǐng)求者則根據(jù)業(yè)務(wù)需要Import外部的Package;

(2) service:服務(wù)提供者Bundle對(duì)外提供Service,而服務(wù)請(qǐng)求者查找Service。而提供Service的方式又有:

①通過(guò)BundleContext(Bundle上下文)來(lái)提供和獲??;

②通過(guò)Declarative Service來(lái)實(shí)現(xiàn);

③通過(guò)Blueprint來(lái)實(shí)現(xiàn);

在這里,我們重點(diǎn)介紹第3種方式--Blueprint。Blueprint提供一個(gè)依賴注入框架來(lái)實(shí)現(xiàn)OSGI,并在OSGI Compendium R4.2里被OSGI組織標(biāo)準(zhǔn)化。Blueprint的強(qiáng)大之處在于即具有Spring強(qiáng)大且非侵入性的企業(yè)級(jí)編程模型又具有OSGi的動(dòng)態(tài)性、模塊化的特性。

Bundle間的交互使用類似Spring Bean的方式配置定義,Blueprint的XML文件定義和描述不同Bundle的組裝。一個(gè)簡(jiǎn)單的Blueprint示例如下:

圖片

XML文件的命名空間標(biāo)識(shí)blueprint 1.0.0版本。頂級(jí)的blueprint元素標(biāo)識(shí)XML文件作為一個(gè)blueprint模塊來(lái)定義;reference元素標(biāo)識(shí)從OSGi服務(wù)注冊(cè)中心為組件獲得一個(gè)服務(wù);bean元素標(biāo)識(shí)與Spring Bean相同的含義。

一、OSGi在OpenDaylight中的應(yīng)用

Java模塊化的局限和OSGi框架的模塊化標(biāo)簽,使得Java和OSGi走在了一起,進(jìn)而增加了Java模塊化開發(fā)的能力。

作為SDN控制器,OpenDaylight使用了Java語(yǔ)言編寫,SDN控制器本身的功能與協(xié)議繁多導(dǎo)致了其子項(xiàng)目眾多,如何更好地按需動(dòng)態(tài)加載所需的項(xiàng)目成為技術(shù)選型的一個(gè)重要因素。而OSGi的如下特性也使得其在OpenDaylight中發(fā)揮很大的作用:

①將一個(gè)程序打包成邏輯上獨(dú)立的JAR文件,并且只部署那些某個(gè)安裝所需要的部分。

②將一個(gè)程序打包成邏輯中獨(dú)立的JAR文件,聲明哪些代碼可以被其他JAR文件訪問(wèn),并且強(qiáng)調(diào)可見性。

③為程序提供一個(gè)插件式的擴(kuò)展機(jī)制。OSGi模塊化特別適合提供強(qiáng)大的擴(kuò)展機(jī)制,包括支持執(zhí)行時(shí)的動(dòng)態(tài)性。

OpenDaylight采用了OSGi框架之后,那開發(fā)一個(gè)應(yīng)用程序的流程又是怎樣的呢?下面給出一般方法:

①根據(jù)應(yīng)用的業(yè)務(wù)場(chǎng)景設(shè)計(jì)Bundle,并設(shè)計(jì)Bundle的服務(wù);

②使用IDE實(shí)現(xiàn)Bundle,配置Blueprint容器XML文件;

③打包和部署B(yǎng)undle的JAR文件;

④啟動(dòng)類似Karaf之類的部署環(huán)境,并根據(jù)業(yè)務(wù)需要安裝Bundle。

事實(shí)上,OpenDaylight不僅采用了OSGi框架,而且還使用了Apache Karaf這個(gè)企業(yè)級(jí)容器,下篇文章我們將探討Apache Karaf的基礎(chǔ)知識(shí)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊化
    +關(guān)注

    關(guān)注

    0

    文章

    327

    瀏覽量

    21307
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3073

    瀏覽量

    48587
  • 小程序
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    12068
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SDK-3.7.0-7 Eclipse IDE無(wú)法啟動(dòng)

    :Or.Eclipse。SWT。在Org.Eclig.OsGi.Neal.Looul.BuleleLoAD.FIDCaseCype(BuleleLoADER,Java:432)在
    發(fā)表于 12-21 15:18

    如何正確的在電腦上安裝Atollic TrueStudio軟件呢?

    !MESSAGE 操作系統(tǒng)信息:Windows 10、10.0、x86!ENTRY org.eclipse.osgi 4 0 2022-04-06 15:16:21.056!MESSAGE 自動(dòng)激活
    發(fā)表于 12-09 08:45

    為什么無(wú)法在Windows上將STM32CubeIDE從1.6.0更新到1.6.1?

    ,operand=,action=)。未找到包含以下內(nèi)容的存儲(chǔ)庫(kù):osgi.bundle、com.st.stm32cube.common.mx、6.2.1.202103241236未找到包含以下內(nèi)容
    發(fā)表于 12-27 08:17

    基于OSGI家庭網(wǎng)關(guān)的多媒體系統(tǒng)設(shè)計(jì)

    隨著家庭網(wǎng)絡(luò)技術(shù)和多媒體技術(shù)的飛速發(fā)展,如何實(shí)現(xiàn)數(shù)字家庭多媒體服務(wù)智能化和人性化已成為當(dāng)今研究的熱點(diǎn)。本文介紹一種基于OSGI家庭網(wǎng)關(guān)和UPNP AV架構(gòu)擴(kuò)展的媒體共享系統(tǒng)
    發(fā)表于 02-26 13:48 ?18次下載

    基于OSGI的智能家庭系統(tǒng)設(shè)計(jì)

    為了解決普適環(huán)境下智能家庭各類設(shè)備組網(wǎng)困難的問(wèn)題,本系統(tǒng)采用OSGi(Open Service Gateway Initiative)服務(wù)框架和LonWorks現(xiàn)場(chǎng)總線技術(shù),利用低壓電力線載波手段來(lái)設(shè)計(jì)和實(shí)現(xiàn)智能家庭系統(tǒng)。
    發(fā)表于 04-28 10:36 ?35次下載
    基于<b class='flag-5'>OSGI</b>的智能家庭系統(tǒng)設(shè)計(jì)

    OSGi原理與最佳實(shí)踐_王昊

    本書基于作者多年使用0SGi的經(jīng)驗(yàn)而編寫,涵蓋了0SGi從/kfqN深入的知識(shí)體系,從OSGi的簡(jiǎn)介開始,介紹OSGi的作用及基本概念;其后進(jìn)入OSGi實(shí)戰(zhàn),結(jié)合實(shí)例講解如何基于OSGi
    發(fā)表于 12-23 15:35 ?0次下載
    <b class='flag-5'>OSGi</b>原理與最佳實(shí)踐_王昊

    如何從零開始學(xué)OpenDaylight

    OpenDaylight的邏輯架構(gòu)分為應(yīng)用層、控制器層和數(shù)據(jù)轉(zhuǎn)發(fā)層。其中,應(yīng)用層聚焦網(wǎng)絡(luò)業(yè)務(wù)邏輯開發(fā),負(fù)責(zé)資源編排;控制器層進(jìn)行全局網(wǎng)絡(luò)的管理;數(shù)據(jù)轉(zhuǎn)發(fā)層為各種網(wǎng)絡(luò)設(shè)備,負(fù)責(zé)數(shù)據(jù)的轉(zhuǎn)發(fā)。
    的頭像 發(fā)表于 02-14 14:04 ?1941次閱讀
    如何從零開始學(xué)<b class='flag-5'>OpenDaylight</b>

    OpenDaylight的運(yùn)行環(huán)境

    OpenDaylight作為一種開源的SDN控制器,使用Java語(yǔ)言編寫,
    的頭像 發(fā)表于 02-14 14:08 ?764次閱讀
    <b class='flag-5'>OpenDaylight</b>的運(yùn)行環(huán)境

    什么是OpenDaylight的Maven

    構(gòu)建的實(shí)質(zhì)是將我們編寫的Java源文件、XML配置文件、HTML頁(yè)面、CSS和JS文件等,通過(guò)某種方式組合在一起,變?yōu)榭蓪?duì)外服務(wù)項(xiàng)目的過(guò)程。同時(shí),構(gòu)建過(guò)程很多都是沒有技術(shù)含量且重復(fù)的工作,手工操作很無(wú)趣且太麻煩。
    的頭像 發(fā)表于 02-14 15:02 ?983次閱讀
    什么是<b class='flag-5'>OpenDaylight</b>的Maven

    OpenDaylight的Karaf

    Karaf是一個(gè)現(xiàn)代的、多種形態(tài)的(polymorphic),輕量的、強(qiáng)大的、經(jīng)過(guò)OSGI認(rèn)證的企業(yè)級(jí)容器。這里的多種形態(tài)指的是它能夠容納各種應(yīng)用,諸如OSGi、Spring、war等等。單從OSGi的角度來(lái)說(shuō),Karaf是
    的頭像 發(fā)表于 02-14 15:08 ?1547次閱讀
    <b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的Karaf

    OpenDaylight的YANG

    YANG是和NETCONF相伴而生的,而NETCONF作為網(wǎng)絡(luò)管理協(xié)議,包含安全傳輸層、消息層、操作層和內(nèi)容層,其中內(nèi)容層沒有標(biāo)準(zhǔn)化,操作層允許自定義RPC,而這兩者的標(biāo)準(zhǔn)化建模就是由YANG來(lái)完成的。
    的頭像 發(fā)表于 02-14 15:10 ?1532次閱讀
    <b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的YANG

    OpenDaylight的DataStore是什么

    SDN起源于校園網(wǎng),發(fā)揚(yáng)光大于數(shù)據(jù)中心,現(xiàn)廣泛用于廣域網(wǎng),SDN控制器,可能管理著數(shù)十萬(wàn)臺(tái)軟交換機(jī),下發(fā)數(shù)百萬(wàn)乃至上千萬(wàn)條路由信息。因此,作為SDN控制器的開源項(xiàng)目OpenDaylight,無(wú)論是業(yè)務(wù)邏輯還是數(shù)據(jù)存儲(chǔ),
    的頭像 發(fā)表于 02-14 15:13 ?1339次閱讀
    <b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的DataStore是什么

    OpenDaylight的RPC &amp; Notification是什么

    我們將介紹RPC和Notification,并從進(jìn)程內(nèi)外的通信開始,著重介紹遠(yuǎn)程過(guò)程調(diào)用和發(fā)布-訂閱機(jī)制,然后分析MD-SAL的通信交互過(guò)程。
    的頭像 發(fā)表于 02-14 15:15 ?883次閱讀
    <b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的RPC &amp; Notification是什么

    OpenDaylight的MD-SAL是什么

    一般情況下,軟件系統(tǒng)的研發(fā)分為需求獲取與分析、架構(gòu)設(shè)計(jì)、代碼實(shí)現(xiàn)、系統(tǒng)發(fā)布、上線等階段。其中,架構(gòu)設(shè)計(jì)可以細(xì)分為架構(gòu)需求、分析、設(shè)計(jì)、文檔化、評(píng)審、修改和實(shí)現(xiàn)等過(guò)程,我們以簡(jiǎn)化歸一,描述為:提供UI界面和消息接口服務(wù),UI選擇B\S架構(gòu)風(fēng)格,消息可以是REST、SOAP以及AMQP等類型,數(shù)據(jù)庫(kù)采用關(guān)系型數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 02-14 15:17 ?1016次閱讀
    <b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的MD-SAL是什么

    基于OSGI的智能家庭系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《基于OSGI的智能家庭系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 10-27 10:41 ?0次下載
    基于<b class='flag-5'>OSGI</b>的智能家庭系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)