李松犁 張型龍 肖俊超
(中國科學院軟件研究所 北京 100190)
?
面向服務集成的自動化服務注冊方法
李松犁張型龍肖俊超
(中國科學院軟件研究所北京 100190)
摘要服務集成的目標是將多個服務集成到同一系統中以實現特定的業務需求。在集成過程中,由于工具、服務通常有著不同的數據標準、傳輸機制,導致了集成的困難。為了解決該問題,在服務集成系統中引入了企業服務總線ESB(Enterprise Service Bus)。目前ESB系統的配置文件能夠表達較為復雜的服務接入場景,但是根據服務的設計、架構不同,服務接入方法不同,也不支持集成系統的熱部署功能。給出一種用于描述工具、服務信息的模型SDModel(Service Description Model),并在該模型基礎上提出一種面向服務集成的自動化服務注冊方法。方法能夠利用SDModel,自動化地解析擬接入集成系統的第三方服務和工具,并實現熱部署,供應用層使用。
關鍵詞服務集成企業級服務總線自動化注冊
0引言
在軟件開發中,通常會有多種第三方提供的工具、服務被使用。通過集成這些工具和服務,能夠提升軟件開發的質量和效率。然而由于工具、服務往往由不同開發商提供,集成中很難共享數據和統一管理。
服務集成的目標是將三方服務與工具集成到同一系統中使用[1]。在集成過程中,系統能夠滿足不同類型的工具、服務接入的需求,不需要更改自身的代碼。集成后,系統能夠復用三方工具的頁面以及它所提供的服務,減少開發、集成的工作量。也可以根據特定的業務需求,將服務組合后提供給用戶使用[2]。
進行系統集成時,由于工具、服務通常有著不同的系統設計、數據標準、傳輸機制等原因,其互相之間的通信、集成較為困難。為了解決這個問題,在服務集成系統中引入了企業服務總線ESB[3],為不同的工具、服務間提供一個通信的橋梁。
系統的集成分為服務的集成和工具的集成兩種情況。當集成三方服務時,首先將服務接入ESB,通過ESB提供的通信協議、數據格式轉換功能,形成新的服務提供給系統使用。該過程中,需要向ESB提供其能夠識別、使用的配置文件。配置文件中包含了服務的輸入輸出、地址等信息。當集成三方工具時,除了將工具所提供的服務接入ESB外,還要將使用工具所需的必要信息如用戶名密碼、工具的地址等提交給系統,以便系統復用該工具的頁面。
現有ESB系統所提供的集成方法并不能較好地滿足服務集成系統的需求,具體問題如下:
1)ESB配置文件的格式和內容復雜,對用戶不友好。配置文件包含許多ESB內部組件,如數據格式轉換模塊等。這類組件和接入服務并不直接相關。另外如果配置錯誤,用戶需要花費時間來檢查和調試。
2) 由于工具、服務的種類眾多,集成中需要針對其不同的設計、架構,編寫不同的集成模塊,這將花費大量的時間。
3) 集成系統不支持熱部署功能,導致在集成工具、服務過程中,系統無法使用。只有在集成完成后,重新啟動系統,才能夠使用新的工具和服務。
針對上述問題,本文提出了面向服務集成的自動化服務注冊方法。該方法定義了一個能夠表達接入工具、服務信息的模型,利用該模型自動化的完成注冊工作。
1相關工作
一些研究提出了新的服務組合算法,解決了在Web服務注冊到ESB后,如何利用工作流系統,根據需求選擇服務,封裝組合后形成新的服務提供給用戶使用的問題[4,5];一些研究關注于如何對ESB系統上的Web服務進行管理[6-8];Tan等人按照Web服務的用途分類后,使用Petri網計算,得到服務的組合方式[9];也有的工作設計了一個分布式高可信ESB系統,在這個系統中解決了服務的組合問題[10]。上述研究重點解決了如何根據用戶的需求,整合服務的問題。但是這些研究以服務已經注冊到ESB為前提,沒有把工具和服務的注冊問題作為重點。
王路遠提出了一個ESB管理系統[11],該系統通過界面引導用戶完成服務的配置后,自動生成ESB的配置文件,來完成服務的注冊。該方法降低了用戶注冊和管理ESB的難度,但是沒有關注集成系統如何使用三方工具的問題。
邊小凡等人提出了一種快速集成工具、服務的系統模型[12]。該模型使用ESB來完成各部件之間的通信工作,并應用到了國家安全以及災難響應的場景中。文中使用了UDDI[13]來進行服務的發現和注冊,但沒有重點闡述集成系統如何使用三方工具的問題。
本文提出了一個面向服務集成的自動化服務注冊方法,其能夠解決上文描述的三個問題,方便接入新工具和服務。其包括下面兩個步驟:
1) 從實際的工具、服務中抽象出一個較為通用的服務描述模型,其能夠表達工具、服務的集成信息,以及它們的設計、架構差異;
2) 設計自動化注冊方法,利用上述模型所含有的數據完成服務、工具的注冊,并保證系統能夠使用它們。
2自動化服務注冊方法
由于工具和服務的數量眾多,為每一個都設計特定的注冊方法將耗費大量的時間,因此需要根據實際使用的軟件開發工具、服務,抽象出一個較為通用的服務描述模型SDModel。
圖1是注冊方法的架構設計。首先根據需要集成的工具、服務的信息抽象,由用戶填寫或可視化模塊生成SDModel。模型解析模塊會驗證SDModel的合法性,如果不符合系統的要求,集成過程將不會被完成。此后SDModel會被解析成兩部分數據,一是符合ESB規范的配置文件,二是存儲后供查詢的工具、服務信息。完成SDModel解析后,解析模塊向服務管理模塊發出通知,將生成的ESB配置文件交由ESB部署模塊使用。通過使用熱部署模塊,文件被配置到ESB中。這個步驟中,由于諸多原因可能造成部署的失敗,因此在部署前,狀態保存模塊會將正確運行的配置文件保存備份。一旦部署失敗,服務管理模塊會取出備份文件交給部署模塊嘗試重新部署。在部署服務中,服務地址管理模塊負責分配和回收地址供服務使用。

圖1 注冊方法設計圖
部署完成后,服務管理模塊會通知應用層模塊新的工具、服務接入完畢。應用層模塊通過服務管理模塊查找需要的服務,而后會使用接入總線服務所使用的協議和總線進行通信。到這里,ESB就完成數據格式、通信協議的統一工作,將不能夠通信的三方工具、服務連接到了一起。
為了讓自動化注冊方法實際工作,需要:
1) 定義SDModel,描述待集成的工具和服務;
2) 模型解析模塊,用于解析SDModel,生成ESB能夠識別、使用的配置文件;
3) 服務信息模塊,保存工具、服務的信息以及ESB的配置文件備份;
4)ESB配置模塊,將生成的配置文件部署到運行中的ESB中,并保證ESB的正確運行;
6) 可視化模塊,幫助用戶生成SDModel。
2.1服務描述模型

圖2 SDModel層次結構
本文參考了WSDL(WebServiceDescriptionLanguage)[14]定義服務描述模型,該模型符合標準的XML格式(
首先使用sdmodel關鍵字來定義模型。所有接入工具、服務等等信息都將寫在這個關鍵字之中。
1) 三方服務
對于待集成的三方服務集合,使用服務集合(services)來描述。對于其中的某項具體服務,使用服務(service)來描述。三方服務包括了服務描述、服務協議、輸入、輸出、期望輸出幾部分。
在橋梁和構造物的接頭、死角、加寬部分和一些壓路機無法碾壓的局部區域,可以使用1t路遙雙輪振動壓路機進行碾壓工作。
? 服務描述:包括了服務名稱(name)、簡要描述(description)和服務地址(address)三方面的信息。這里地址應當包括協議和地址兩部分。如:http://192.168.10.10/xmltojson。其中http為協議,后面部分為具體的地址。
? 服務協議:使用protocol關鍵字。服務的數據經過ESB處理后,需要再次提供給其他模塊使用,如果用戶想在這里改變數據傳輸的協議,應該使用protocol關鍵字。如果沒有,則默認為服務地址中的協議。
? 輸入:使用input關鍵字,描述服務的輸入參數。由于輸入中可能包含了若干的參數,定義param關鍵字來描述這些參數。每個參數由參數名稱(name),參數格式(param-format)和參數取值(param-value)幾部分組成。參數格式取值如XML、Object等。如果參數取值為空,則表示該參數將在ESB運行中傳入。
? 輸出:使用output關鍵字,描述服務的輸出結果。由param關鍵字描述,但是不包含參數取值。
? 期望輸出:使用expect-output關鍵字,描述用戶希望通過ESB處理后輸出的結果。由param關鍵字描述,但是不包含參數取值。
2) 三方工具
三方工具由兩部分信息組成:一是工具自身的信息,如賬戶、工具地址等;二是工具提供服務的信息。使用工具(tool)描述用具定義的開始和結尾。
? 工具描述:包括了工具名稱(name)、簡要描述(description)和工具地址(address)三方面的信息。
? 工具認證:用tool-access關鍵字描述,定義三方工具賬戶信息,其中可以包含多個賬戶(account)。每個賬戶中提供工具的用戶名、密碼。和服務的輸入輸出類似,賬戶中使用參數(param)來描述具體的用戶名和密碼。此外,對于B/S架構的工具[15],還可以添加工具的登錄信息,如工具的登錄的地址,來幫系統進行單點登錄操作。
? 工具服務:表示由工具提供的若干服務。該部分和三方服務集合(services)類似。不同的是這些服務可能沒有具體的地址,故可以不配置地址(address)。
3) 示例
下文展示了一個詳細的SDModel,其中包含了缺陷管理工具Bugzilla的工具地址,同時提供一個用戶名為123@example.com,密碼為123的賬號供集成系統使用。此外,SDModel中還定義了Bugzilla提供的getBugById服務。該服務的輸入為int格式的bugId,而輸出為xml格式的具體bug。
通過SDModel的定義,其能夠較為通用地表達三方工具、三方服務的信息。
2.2注冊方法模塊實現
1) 模型解析模塊
解析模塊首先會接收用戶上傳的SDModel,然后會驗證其正確性。
為了便于SDModel的解析和驗證,這使用了JAXP(JavaAPIforXMLProcessing)[16]。JAXP是一套用來處理XML文檔的API。其中包括了javax.xml.validation、javax.xml.parsers等多個包(package)。
驗證分為兩個階段:第一階段通過javax.xml.validation包來驗證SDModel是否符合標準XML文件的格式;第二階段驗證SDModel的完整性,如
而后,利用javax.xml.parsers包解析SDModel。將解析出的數據寫成ESB的標準配置文件。根據ESB的不同,其配置文件的格式也不同。為了解決這個問題,模塊對常見的ESB配置文件進行單獨處理,并且維護其配置文件的格式信息。如muleESB的配置文件開始和結束的標識為
2) ESB配置模塊
為了達到集成系統的熱部署功能,同時保證ESB的正常運行,ESB處理模塊會有三個主要的功能:
(1) 服務地址管理模塊。當新的服務接入到集成系統中后,需要為其分配相應的服務地址。該模塊維護一個地址池,該地址池由集成系統管理員根據擁有的IP段進行分配。地址池按順序為新的服務和工具分配IP,同時回收不再使用、注銷的服務的IP。
(2) 熱部署模塊。ESB配置文件生成后,需要把該文件部署到ESB運行環境中。對于一些ESB,如Synapse,只需將該文件放入運行環境下;而對于mule,需要將配置文件打包為發布版后,再放入運行環境。隨后重啟ESB系統(根據ESB的不同,處理方式稍有差別,如muleESB不用重啟便可完成新服務的部署,而synapse需要重啟),使新的服務和工具生效。這里使用腳本來控制ESB的啟動、停止等工作。模塊首先會判斷用戶所使用的操作系統。在Linux/Mac系統下采用shell腳本;在Windows系統下則采用bat腳本。另外,由于可能出現的網絡異常、配置文件錯誤、ESB系統異常等原因,部署可能會失敗。因而每次部署前,應當保存當前ESB上正常運行的配置文件。部署失敗時,向狀態保存模塊請求恢復之前的狀態。
(3) 狀態保存模塊。由于ESB在部署過程中可能出現的異常情況,在每次熱部署之前,該模塊會記錄下當前ESB系統中的配置信息。如果系統發生了錯誤,本模塊會負責取回最近一次的信息進行恢復。同時,還應該提醒用戶部署發生錯誤,以及錯誤原因。
通過ESB配置模塊,當集成系統接入新的工具和服務時,不再需要重啟整個系統,保證了用戶的使用。
3) 服務信息模塊
服務信息模塊將會主要保存三部分信息:
(1) 用戶管理數據,用于記錄用戶的信息,如用戶名、密碼等。
(2) 工具、服務的注冊數據。這部分信息將會用于服務管理模塊的查詢和變更工作。當集成系統需要多個工具的單點登錄功能時,該部分還會記錄工具的登錄地址等信息,以便集成系統模擬登錄取回工具的cookie。
(3) 狀態保存信息。該模塊負責維護ESB的配置文件,以及ESB是否正常工作等數據。通過設置時間間隔,模塊將定時從ESB抓取當前系統的運行信息。部署失敗時,模塊將取出最近一次正常工作的配置文件,以便ESB系統恢復運行。
4) 服務管理模塊
該模塊主要包含了兩個功能:
(1) 服務查詢模塊。當應用層模塊需要調用ESB上的服務時,會首先向該模塊發出申請。模塊查詢ESB是否存在該服務,以及該服務運行是否正常,然后把查詢的結果返回給應用層模塊。最后應用層模塊會根據該結果決定是否對服務發起http、或是其他協議的請求。例如前文中Bugzilla提供的getBugById服務,由于該服務的協議是http,應用層將會對該服務的地址發起http請求。在請求中包含有服務需要的參數bugId。ESB響應請求后,從Bugzilla查找bug數據,最后把該bug返回給應用層。此外,每次部署新工具、服務成功后,模塊會向應用層模塊發出消息,通知其可以使用這些工具和服務。
(2) 服務變更模塊。當用戶不再需要某個服務或是想對服務做出修改時,該模塊會對保存的服務信息做出相應的變更。如注銷getBugById服務,該服務的數據則會被刪除。同時模塊會定位該服務所屬的ESB配置文件,在該文件中去除不需要的服務項,最后通知ESB配置模塊,重新部署更新后的ESB配置文件。
5) 可視化模塊
對于用戶來說,手動編寫SDModel仍有一定的難度,因此可以根據具體集成系統的需求,為用戶提供兩種方式完成注冊:
(1) 對話輸入框的方式,引導用戶填寫注冊信息。
(2) 直接上傳包含有接入工具、服務信息的SDModel。此后所有的工作由模塊自動完成。該界面將會在下一章的案例分析中給出示例。
3案例分析
3.1軟件開發可信證據采集平臺介紹
本文所提出的自動化服務注冊方法已經應用在軟件開發可信證據采集平臺上。該平臺是一個Web應用工具集成系統,主要用于將軟件生命周期的相關工具,如需求管理工具Jira、缺陷管理工具Bugzilla、測試工具TestLink等,集成到同一系統后提供給用戶使用。
在用戶使用的過程中,這些接入的工具將產生許多和軟件生產相關的數據。平臺可以利用這些數據,按照可信證據的定義計算出該軟件的可信度。此外,在工具集成的基礎上,平臺還允許用戶在為本平臺定制的工作流規則下組合工具所提供的服務。例如同類工具之間的數據傳輸,將Bugzilla中的缺陷數據同步到Mantis中。該平臺的簡單架構圖如圖3所示。

圖3 采集平臺架構
在使用平臺之前,用戶需要在平臺注冊一系列工具和服務。在使用中,用戶可以選擇從平臺進入某個工具操作。也可以利用平臺的工作流系統定制出一套符合自己業務需求的流程,如通過項目中需求和測試的差值求得黑盒覆蓋率。最后由工作流引擎調用ESB上所接入的服務,返回結果給用戶。在使用平臺前,需要接入軟件生命周期中的各項工具和服務。傳統的注冊方法需要平臺針對每一個接入的工具、服務都開發一套通信組件,這增大了平臺開發的負擔。另一方面,傳統的集成方法不能夠解決集成的工具之間互相的通信問題。例如希望Bugzilla和Jira通信,則需要為兩個工具單獨的開發通信組件。那么當Bugzilla希望和另外10個工具通信時,開發工作量和難度都將增加。在引入ESB后,所有工具、服務間的通信都通過總線來完成,只需要為它們開發和ESB通信的組件即可,大大節省了集成的工作量。
這時,本文提出的注冊方法就能夠解決上文所述的集成場景。基于以上原因,平臺使用了本文所提出的自動化注冊方法,以支持平臺訪問工具,以及工作流引擎調用服務的需求。
3.2平臺注冊方法
在該平臺下,用戶可以選擇兩種方式來接入三方工具和服務:一是直接上傳SDModel;二是通過可視化界面的引導,填寫信息后,由平臺生成SDModel供自動化注冊方法使用。平臺使用了muleESB,該ESB提供了為接入工具而設計的connector機制。用戶可以將三方工具提供的API封裝為connector,接入到ESB后提供Web服務。因此當用戶需要為平臺接入新工具,且該工具沒有提供現成的服務時,還需要上傳封裝好的connector。
3.3可視化界面和單點登錄
為了進一步降低用戶在接入工具、服務時的困難,平臺設計了一套友好的可視化界面來引導用戶完成注冊工作,如圖4所示。

圖4 服務注冊界面
用戶在界面上填寫工具、服務的信息后,平臺會生成SDModel文件,供注冊方法使用。
另一方面,用戶還需要直接在登錄平臺的同時登錄接入的三方工具,因此這里需要一個單點登錄服務。對于B/S架構的工具,當用戶登錄時,工具服務器會生成若干cookie來標記用戶的信息,如加密后的用戶名、密碼,以及服務器sessionId。根據這些cookie,服務就能夠判斷用戶是否登錄。為了讓平臺模擬用戶登錄的動作,需要在SDModel的tool-access關鍵字中添加工具的登錄地址和登錄表單用戶名、密碼的ID,這里的數據還是通過param關鍵字來定義。
此外,平臺和工具的地址通常不在同一個域中,為了能夠讓平臺和工具跨域通信,將所有三方工具通過apache的反向代理設置在了同一個域下。
3.4定制業務流程
當平臺接入了服務后,用戶能夠利用這些服務定制業務流程,并使用jBPM工作流引擎[18]來驅動業務流程的執行。為了方便制定過程,平臺提供了一個可以拖拽的可視化界面,如圖5所示。圖中的每一個元素均代表一項接入的服務或工具,在定制界面下方可設定三方服務或者三方工具提供的服務,這里的每一項服務,都由ESB所提供。

圖5 業務流程定制
完成流程的定制后,平臺將驗證其是否符合執行規范。如測試服務節點必須處于需求服務節點之后。而后工作流引擎調用平臺的通信模塊,發送http或其他請求和ESB進行通信,即可運行該工作流。
最后,平臺利用自動化注冊方法完成新工具、服務的接入工作,減少了集成所花費的時間,提供了熱部署功能,滿足了應用層定制業務流程的需求。
4結語
本文通過分析發現當前服務集成系統注冊新工具、服務所存在的幾個問題:1)ESB配置文件較復雜對用戶不友好;2) 工具、服務種類眾多,開發相應的集成方法需要大量時間;3) 不支持熱部署導致重新部署系統時用戶無法使用。為了解決這些問題,首先定義了服務描述模型SDModel,利用該模型,可以較為完整地描述出用戶希望接入服務或工具的信息。在此基礎上,設計了一個基于SDModel的自動化注冊方法。該方法能夠讀取、解析SDModel,并將其轉換為對應ESB系統的配置文件,通過熱部署的方式使其生效。由于SDModel能夠較為通用表達服務、工具的信息,該方法具有一定的普適性。此外,方法提供了錯誤檢測和恢復機制,保證了集成系統可以從錯誤狀態中恢復。該方法已經在軟件開發可信證據采集平臺中實現,并取得了良好效果。
本文提出的自動化注冊方法在面對分布式部署的ESB總線時,還有一定的缺陷,不能夠根據ESB當前的負載,將服務注冊到空閑的節點上。因此這是需要進一步研究的方向。
參考文獻
[1]PapazoglouM.Service-orientedcomputing:Concepts,characteristicsanddirections[C]//WebInformationSystemsEngineering,2003.WISE2003.ProceedingsoftheFourthInternationalConferenceon.IEEE,2003:3-12.
[2]KrafzigD,BankeK,SlamaD.EnterpriseSOA:service-orientedarchitecturebestpractices[M].PrenticeHallProfessional,2005.
[3]Chappell,David.Enterpriseservicebus[M].O’ReillyMedia,Inc.2004.
[4]TangX,SunS,YuanX,etal.AutomatedWebServiceCompositionSystemonEnterpriseServiceBus[C]//SecureSoftwareIntegrationandReliabilityImprovement,2009:9-13.
[5]LiX,TangX,SongZ,etal.AFlow:AnAutomatedWebServicescompositionsystembasedontheAIplanningandworkflow[C]//ProgressinInformaticsandComputing(PIC),2010IEEEInternationalConferenceon.IEEE,2010:1067-1071.
[6]VrbaP,FuksaM,KlimaM.JADE-JBossESBgateway:Integrationofmulti-agentsystemwithenterpriseservicebus[C]//Systems,ManandCybernetics(SMC),2014IEEEInternationalConferenceon.IEEE,2014:3663-3668.
[7]HübnerJ,StollC.SCENEadmin:Acomponent-basedintegratedmanagementframeworkforwebserviceplatforms[C]//ITinMedicineandEducation(ITME),2011InternationalSymposiumon.Vol,2,IEEE,2011:77-81.
[8]YuH,MaJ,YangX.ResearchonApplicationIntegrationinDigitalCampusBasedonJBossESBPlatform[M].AdvancesinFutureComputerandControlSystems.SpringerBerlinHeidelberg,2012:319-324.
[9]TanW,FanY,ZhouM,etal.Data-drivenservicecompositioninenterpriseSOAsolutions:aPetrinetapproach[J].AutomationScienceandEngineering,IEEETransactionson,2010,7(3):686-694.
[10]YinJ,ChenH,DengS,etal.Adependableesbframeworkforserviceintegration[J].InternetComputing,IEEE,2009,13(2):26-34.
[11] 王路遠.基于ESB的Web服務注冊和管理的研究與實現[D].北京郵電大學,2011.
[12] 邊小凡,代艷紅,馬兵會.基于ESB的企業內部構件與Web服務的集成[J].計算機工程與設計,2009(4):918-920.
[13]CurberaF,DuftlerM,KhalafR,etal.UnravelingtheWebservicesweb:anintroductiontoSOAP,WSDL,andUDDI[J].IEEEInternetComputing,2002,6(2):86-93.
[14]WeerawaranaS,CurberaF,LeymannF,etal.Webservicesplatformarchitecture:SOAP,WSDL,WS-policy,WS-addressing,WS-BPEL,WS-reliablemessagingandmore[M].PrenticeHallPTR,2005.
[15]MorganJ,VenkatramanC.Embeddingwebaccessmechanisminanapplianceforuserinterfacefunctionsincludingawebserverandwebbrowser[P].U.S.PatentNo.5,956,487.21Sep.1999.
[16]Java,APIforXMLprocessing(JAXP)[OL].[2006].SunMicrosystems,http://java.sun.com/webservices/jaxp/.
[17]MuleESB[OL].[2014].MuleSoftInc.www.mulesoft.com.
[18]CumberlidgeM.BusinessProcessManagementwithJBossjBPM[M].PacktPublishingLtd,2007.
SERVICE INTEGRATION-ORIENTED AUTOMATIC SERVICE REGISTRATION METHOD
Li SongliZhang XinglongXiao Junchao
(Institute of Software,Chinese Academy of Science,Beijing 100190,China)
AbstractThe goal of service integration is to integrate multiple services into one system in order to implement specific business requirement. In the process of integration, since tools and services usually have different data standards and transfer mechanisms, these lead to the difficulty of integration. To solve the problem, we introduced the enterprise service bus (ESB) to services integration system. Currently the configuration files of ESB system can express some complicated services access scenario. However, according to the difference of services designs and architectures, the services access ways are different as well, they also not support the hot deployment function of the integration system. This paper introduces SDModel, it is a model for describing the information of tools and services. Based on this model, we propose a services integration-oriented automatic services registration method, it can makes use of SDModel, automatically parses the third party services and tools to be accessed to the integration system, and realises the hot deployment for the use in application layer.
KeywordsService integrationEnterprise service busAutomatic registration
收稿日期:2015-01-19。國家自然科學基金項目(91318301,9121 8302,61432001);國家高技術研究發展計劃項目(2012AA011206)。李松犁,碩士生,主研領域:服務集成。張型龍,碩士生。肖俊超,副研究員。
中圖分類號TP3
文獻標識碼A
DOI:10.3969/j.issn.1000-386x.2016.06.015