微内核架构模式
寫本篇主要是用來后面寫一篇可擴展性軟件設計打好基礎。?
微內核定義: ?
???? 微內核是內核的一種精簡形式。將通常與內核集成在一起的系統服務層被分離出來,變成可以根據需求加入選件? 這樣就可提供更好的可擴展性和更加有效的應用環境。使用微內核設計,對系統進行升級,只要用新模塊替換舊模塊,不需要改變整個操作系統。?
微內核架構模式來源于操作系統,本文主要講解微內核模式在應用軟件中的如何實現。?
微內核架構模式組成: ?
一般由下面幾個部分組成:微內核、內核、擴展服務(我更喜歡叫做擴展插件)。?
內核由幾個最基本服務組成,微內核完成加載內核里所有的基本服務。?
內核基本服務在應用軟件中通常是指那些與業務無關的服務,如資源加載服務等。?
整個系統就是由微內核、內核(即幾個基本服務,廣義來講我稱它為插件,所以是容器自帶的幾個默認插件,能提供基本服務)、擴展服務(廣義來講我稱它為插件,只不過是業務系統寫的插件讓微內核擴展進來的)。?
抽象來講就是由微內核和許多插件組成。如下圖?
?
微內核做了什么事??
微內核主要負責插件的生命周期管理,插件的加載,替換,卸載。?
對于加載,替換,卸載都有兩種方式,靜態與動態。動態的更加復雜。?
插件是什么??
插件一般由以下幾部分組成:插件暴露的接口(我一般稱為叫API),插件內部實現,插件擴展點以及插件配置。插件擴展點我一般設計為SPI,因為它符合(java中的API/SPI的概念,關于API/SPI請參考 API/SPI可擴展設計原則 )。
整個插件組成示意圖如下?
?
以讀數據插件為例,讀數據插件主要提供讀數據服務,插件暴露接口叫做DataReadAPI。假設是網站前臺系統。插件的內部實現是先讀緩存,后讀數據庫。把讀緩存與讀數據庫抽象出來一個接口叫DataReadSPI。在內部實現只要讀取插件擴展點getExtensions(DataReadSPI.java)得到一個DataReadSPI列表,順序執行即可(順序執行必須是前面執行的結果為空時再往下執行)。?
如果實現了擴展點有兩個:如圖中的DataReadCacheImpl和DataReadDBImpl,那這兩個擴展點在插件配置時把緩存配在前面。于是就形成先讀緩存,如果緩存讀不到就讀數據。?
看一下代碼比較容易明白 ?
Java代碼?? 微內核框架端?? public?interface?Plugin?{?? ?????? ????void?init(PluginContext?pluginContext);?? ?????? ????<T>?List<T>?getExtension(Class<T>?extensionClassName);?? }?? ?? public?class?PluginManager?{?? ?? ????public?static?<T?extends?Plugin>?T?getPlugin()?? ????{?? ????????//返回插件?? ????????return?null;?? ????}?? ???? }?? ?? public?interface?DataReadAPI?extends?Plugin?{?? ?? ????Object?read(String?key);?? }?? ?? public?interface?DataReadSPI?{?? ????Object?read(String?key);?? }?? ?? public?class?DefaultDataReadImpl?extends?AbstractPlugin?implements?DataReadAPI?{?? ?? ????@Override?? ????public?Object?read(String?key)?{?? ????????List<DataReadSPI>?extensions?=?getExtension(DataReadSPI.class);?? ????????for?(DataReadSPI?extension?:?extensions)?{?? ????????????Object?result?=?extension.read(key);?? ????????????if?(result?!=?null)?{?? ????????????????return?result;?? ????????????}?? ????????}?? ????????return?null;?? ????}?? }??
Java代碼?? 客戶端或叫應用端代碼及配置,即微內核框架的使用端?? public?class?DataReadCacheImpl?implements?DataReadSPI?{?? ?? ????@Override?? ????public?Object?read(String?key)?{?? ????????return?null;?? ????}?? }?? ?? public?class?DataReadDBImpl?implements?DataReadSPI?{?? ?? ????@Override?? ????public?Object?read(String?key)?{?? ????????return?null;?? ????}?? }?? ?? 插件擴展的配置文件?? <plugins>?? ????<plugin?id="dataReadAPIPluginID">?? ????????<extensions>?? ????????????<extension?interfaceClassName="com.liyh.devine.web.spi.DataReadSPI">?? ????????????????<implements>?? ????????????????????<implment?beanName="DataReadCacheImpl"?/>?? ????????????????????<implment?beanName="DataReadDBImpl"?/>?? ????????????????</implements>?? ????????????</extension>?? ????????</extensions>?? ????</plugin>?? </plugins>?? ?? 業務代碼?? public?class?Client?{?? ????public?static?void?main(String[]?args)?? ????{?? ????????DataReadAPI?dataReadAPI?=?PluginManager.getPlugin("dataReadAPI");?? ????????Object?result?=?dataReadAPI.read("key");?? ????????System.out.println(result);?? ????}?? }??
解釋一下: ?
客戶端使用框架提供的插件服務,即插件暴露的API--->DataReadAPI,框架滿足不了客戶端的功能可以實現自己的擴展,如DataReadCacheImpl,DataReadDBImpl。插件一般會提供默認的實現,只不過本例默認實現為空,只是簡單調用一下擴展點的功能就返回了。?
這里比較巧, API與SPI是一樣的,其實一般SPI是API實現過程中開放的擴展點,一般可以比較小。比如RenderAPI,用于渲染的API,它的SPI可能就是一個PullToolFacotry,PullToolFacotry主要返回PullTool。當應用使用微內核框架的Render插件時,可以擴展自己的PullTool返回給框架。?
總結 ?
微內核模式的核以是插件管理與及協調插件之間的調用。插件是可以整個被替換,插件本身是一個很大粒度的擴展點。同時插件可以提供自己的小粒度擴展點。這樣整個系統就是由一個微內核加很多插件組成一個具備很強的擴展性的系統。
微內核定義: ?
???? 微內核是內核的一種精簡形式。將通常與內核集成在一起的系統服務層被分離出來,變成可以根據需求加入選件? 這樣就可提供更好的可擴展性和更加有效的應用環境。使用微內核設計,對系統進行升級,只要用新模塊替換舊模塊,不需要改變整個操作系統。?
微內核架構模式來源于操作系統,本文主要講解微內核模式在應用軟件中的如何實現。?
微內核架構模式組成: ?
一般由下面幾個部分組成:微內核、內核、擴展服務(我更喜歡叫做擴展插件)。?
內核由幾個最基本服務組成,微內核完成加載內核里所有的基本服務。?
內核基本服務在應用軟件中通常是指那些與業務無關的服務,如資源加載服務等。?
整個系統就是由微內核、內核(即幾個基本服務,廣義來講我稱它為插件,所以是容器自帶的幾個默認插件,能提供基本服務)、擴展服務(廣義來講我稱它為插件,只不過是業務系統寫的插件讓微內核擴展進來的)。?
抽象來講就是由微內核和許多插件組成。如下圖?
?
微內核做了什么事??
微內核主要負責插件的生命周期管理,插件的加載,替換,卸載。?
對于加載,替換,卸載都有兩種方式,靜態與動態。動態的更加復雜。?
插件是什么??
插件一般由以下幾部分組成:插件暴露的接口(我一般稱為叫API),插件內部實現,插件擴展點以及插件配置。插件擴展點我一般設計為SPI,因為它符合(java中的API/SPI的概念,關于API/SPI請參考 API/SPI可擴展設計原則 )。
整個插件組成示意圖如下?
?
以讀數據插件為例,讀數據插件主要提供讀數據服務,插件暴露接口叫做DataReadAPI。假設是網站前臺系統。插件的內部實現是先讀緩存,后讀數據庫。把讀緩存與讀數據庫抽象出來一個接口叫DataReadSPI。在內部實現只要讀取插件擴展點getExtensions(DataReadSPI.java)得到一個DataReadSPI列表,順序執行即可(順序執行必須是前面執行的結果為空時再往下執行)。?
如果實現了擴展點有兩個:如圖中的DataReadCacheImpl和DataReadDBImpl,那這兩個擴展點在插件配置時把緩存配在前面。于是就形成先讀緩存,如果緩存讀不到就讀數據。?
看一下代碼比較容易明白 ?
Java代碼??
Java代碼??
解釋一下: ?
客戶端使用框架提供的插件服務,即插件暴露的API--->DataReadAPI,框架滿足不了客戶端的功能可以實現自己的擴展,如DataReadCacheImpl,DataReadDBImpl。插件一般會提供默認的實現,只不過本例默認實現為空,只是簡單調用一下擴展點的功能就返回了。?
這里比較巧, API與SPI是一樣的,其實一般SPI是API實現過程中開放的擴展點,一般可以比較小。比如RenderAPI,用于渲染的API,它的SPI可能就是一個PullToolFacotry,PullToolFacotry主要返回PullTool。當應用使用微內核框架的Render插件時,可以擴展自己的PullTool返回給框架。?
總結 ?
微內核模式的核以是插件管理與及協調插件之間的調用。插件是可以整個被替換,插件本身是一個很大粒度的擴展點。同時插件可以提供自己的小粒度擴展點。這樣整個系統就是由一個微內核加很多插件組成一個具備很強的擴展性的系統。
總結
- 上一篇: 《软件架构设计》读书笔记
- 下一篇: 面向服务架构