呂海東, 葛日波, 朱志剛
(大連理工大學(xué) 城市學(xué)院, 大連 116600)
基于Seneca微服務(wù)的過(guò)程監(jiān)測(cè)系統(tǒng)①
呂海東, 葛日波, 朱志剛
(大連理工大學(xué) 城市學(xué)院, 大連 116600)
針對(duì)傳統(tǒng)監(jiān)測(cè)監(jiān)控與數(shù)據(jù)管理應(yīng)用系統(tǒng)架構(gòu)復(fù)雜, 前后端開(kāi)發(fā)技術(shù)不一致, 通訊協(xié)議不統(tǒng)一, 難以實(shí)現(xiàn)高并發(fā)請(qǐng)求的問(wèn)題, 在高性能服務(wù)器平臺(tái)Node.js下, 使用全新的微服務(wù)架構(gòu)和Seneca框架技術(shù)與監(jiān)測(cè)監(jiān)控技術(shù)相結(jié)合,使用統(tǒng)一的Node.js編程模式, 標(biāo)準(zhǔn)化的REST API通訊協(xié)議, 實(shí)現(xiàn)了低成本、高性能、易維護(hù)和安全性的監(jiān)測(cè)與數(shù)據(jù)管理的企業(yè)級(jí)應(yīng)用.
微服務(wù); API網(wǎng)關(guān); 工業(yè)過(guò)程監(jiān)控系統(tǒng); Node.js; Seneca框架
當(dāng)前在開(kāi)發(fā)具有監(jiān)測(cè)監(jiān)控和數(shù)據(jù)管理相結(jié)合的軟硬件應(yīng)用系統(tǒng)時(shí), 通常都在數(shù)據(jù)采集層和數(shù)據(jù)管理層采用不同的技術(shù)和編程語(yǔ)言. 在數(shù)據(jù)采集端一般使用專門的工業(yè)控制計(jì)算機(jī), 使用C語(yǔ)言甚至是匯編語(yǔ)言完成對(duì)現(xiàn)場(chǎng)傳感器數(shù)據(jù)的采集, 而在上位機(jī)服務(wù)器端普遍使用基于JavaEE的軟件架構(gòu)技術(shù), 如使用Hibernate,Spring和Spring MVC等, 這就導(dǎo)致前端和后端開(kāi)發(fā)技術(shù)不一致, 需要熟悉不同技術(shù)的開(kāi)發(fā)人員, 導(dǎo)致項(xiàng)目投資大, 編程難度大, 開(kāi)發(fā)周期長(zhǎng), 項(xiàng)目難以維護(hù)等諸多缺陷.
如果數(shù)據(jù)采集前端和數(shù)據(jù)管理后端采用相同的軟件開(kāi)發(fā)技術(shù)和編程語(yǔ)言, 將極大的簡(jiǎn)化此類軟件系統(tǒng)的開(kāi)發(fā), 減低不同軟件技術(shù)協(xié)作的復(fù)雜性. 基于JavaScript編程語(yǔ)言的Node.js平臺(tái)出現(xiàn), 使該需求的實(shí)現(xiàn)成為可能.
為實(shí)現(xiàn)能進(jìn)行超大量并發(fā)請(qǐng)求處理的應(yīng)用開(kāi)發(fā),克服傳統(tǒng)服務(wù)器平臺(tái)的難以支持超大并發(fā)連接的實(shí)時(shí)應(yīng)用, 以全新模式工作的服務(wù)器平臺(tái)技術(shù)Node.js[1]得以快速發(fā)展. Node.js的單線程、非阻塞、異步響應(yīng)處理、事件驅(qū)動(dòng)的特性, Node.js同時(shí)支持在微型設(shè)備和大型服務(wù)器上運(yùn)行, 微型設(shè)備如樹(shù)莓派, Arduino, Intel Galileo Gen, Intel Edison Arduino, BeagleBone Black等,使得其成為當(dāng)今開(kāi)發(fā)面向工業(yè)過(guò)程監(jiān)控、物聯(lián)網(wǎng)、移動(dòng)應(yīng)用和企業(yè)級(jí)應(yīng)用的首選.
另一方面軟件開(kāi)發(fā)最新的架構(gòu)技術(shù)-微服務(wù)[2](Micro services), 由于其能使各類系統(tǒng)應(yīng)用的開(kāi)發(fā)得以全面的簡(jiǎn)化, 加快其應(yīng)用的部署和維護(hù), 克服了傳統(tǒng)單一結(jié)構(gòu)模式的軟件系統(tǒng)的固有的缺陷, 成為當(dāng)前軟件開(kāi)發(fā)的最流行技術(shù)之一.
微服務(wù)是互聯(lián)網(wǎng)云計(jì)算時(shí)代傳統(tǒng)軟件系統(tǒng)從單一整體架構(gòu)向分布式微組件結(jié)構(gòu)轉(zhuǎn)變的必然選擇. 通過(guò)將傳統(tǒng)軟件系統(tǒng)的功能拆分為可獨(dú)立開(kāi)發(fā)和部署的微服務(wù), 提高了軟件應(yīng)用系統(tǒng)的可靠性、可維護(hù)性和可伸縮性, 能適應(yīng)當(dāng)前以移動(dòng)客戶端為主要訪問(wèn)模式的超大量并發(fā)請(qǐng)求處理, 并實(shí)現(xiàn)快速響應(yīng), 以滿足移動(dòng)客戶的對(duì)系統(tǒng)性能的極高需求.
基于Node.js的微服務(wù)的發(fā)展更是以驚人的速度在進(jìn)行, 眾多基于Node.js的微服務(wù)框架紛紛出現(xiàn), 其中佼佼者Seneca[3]以其簡(jiǎn)單的REST API[4]實(shí)現(xiàn)模式, 由于其同時(shí)支持HTTP和TCP通訊協(xié)議等諸多優(yōu)點(diǎn)開(kāi)始得到了認(rèn)可和應(yīng)用.
本文結(jié)合過(guò)程監(jiān)控和微服務(wù)技術(shù), 利用Node.js服務(wù)器平臺(tái), Seneca微服務(wù)架構(gòu), 完美實(shí)現(xiàn)了一個(gè)超低成本、高性能的全新模式的監(jiān)測(cè)監(jiān)控與業(yè)務(wù)管理全集成的企業(yè)級(jí)管理系統(tǒng), 并在某大型分布式CNG加氣站管理系統(tǒng)中應(yīng)用, 從氣罐、加油機(jī)監(jiān)控, 加氣數(shù)據(jù)傳輸, 加氣卡結(jié)算, 采購(gòu), 銷售和庫(kù)存管理等實(shí)現(xiàn)全程信息化處理.
整個(gè)系統(tǒng)采用分布式架構(gòu), 包括中央服務(wù)器、監(jiān)控下位機(jī)、管理PC客戶端、移動(dòng)客戶端, 實(shí)現(xiàn)從監(jiān)控、數(shù)據(jù)傳輸、業(yè)務(wù)管理的全覆蓋, 其系統(tǒng)總體架構(gòu)參見(jiàn)圖1所示.
系統(tǒng)建設(shè)初期采用本地的服務(wù)器, 未來(lái)可升級(jí)為云主機(jī). 服務(wù)器采用Ubuntu Server15.04[5]操作系統(tǒng), 安裝Node.js的最新版V5.1, 數(shù)據(jù)的存儲(chǔ)采用MariaDB10[5],微服務(wù)實(shí)現(xiàn)使用Seneca.
儲(chǔ)氣罐和管道的監(jiān)控使用西門子PLC S3-700, 通過(guò)樹(shù)莓派2B+[6]讀取PLC的監(jiān)測(cè)數(shù)據(jù)[7], 定時(shí)調(diào)用服務(wù)器端的微服務(wù)API傳輸?shù)街醒敕?wù)器數(shù)據(jù)庫(kù)中. 樹(shù)莓派運(yùn)行Linux操作系統(tǒng)Debian, 同樣安裝Node.js, 由于上位服務(wù)器和監(jiān)測(cè)下位機(jī)相同的開(kāi)發(fā)和運(yùn)行環(huán)境, 簡(jiǎn)化系統(tǒng)的開(kāi)發(fā)成本, 加快開(kāi)發(fā)進(jìn)度.
圖1 系統(tǒng)總體架構(gòu)圖
系統(tǒng)采用基于Node.js的微服務(wù)框架Seneca實(shí)現(xiàn)所業(yè)務(wù)所需的微服務(wù). Seneca的如下優(yōu)點(diǎn)極大簡(jiǎn)化了微服務(wù)的開(kāi)發(fā)的部署.
(1) 支持多種通訊模式, 包括REST API, TCP, 消息隊(duì)列, 發(fā)布/訂閱模式等.
(2) 數(shù)據(jù)的傳輸全部采用JSON格式, 減少了網(wǎng)絡(luò)傳輸數(shù)據(jù)量, 節(jié)省了網(wǎng)絡(luò)帶寬.
(3) 微服務(wù)采用模式匹配加響應(yīng)工作, 簡(jiǎn)化了微服務(wù)的查找和調(diào)用, 克服了傳統(tǒng)的微服務(wù)的復(fù)雜的注冊(cè)和服務(wù)機(jī)制, 極大簡(jiǎn)化了微服務(wù)的部署.
整個(gè)系統(tǒng)無(wú)論是數(shù)據(jù)采集客戶端還是數(shù)據(jù)管理服務(wù)器端, 都采用Seneca框架將各種功能發(fā)布為基于REST API的微服務(wù), 通過(guò)這些API采集端和服務(wù)器端都可以進(jìn)行雙向的數(shù)據(jù)通訊, 并使用標(biāo)準(zhǔn)的JSON數(shù)據(jù)格式進(jìn)行數(shù)據(jù)的傳輸, 極大簡(jiǎn)化了系統(tǒng)的開(kāi)發(fā)難度.
為簡(jiǎn)化系統(tǒng)的投資, 本系統(tǒng)沒(méi)有采用昂貴的工業(yè)控制PC機(jī)作為下位監(jiān)測(cè)端, 而是使用廉價(jià)的用于物聯(lián)網(wǎng)系統(tǒng)的樹(shù)莓派卡片式計(jì)算機(jī), 在其內(nèi)置的Linux平臺(tái)支持下, 安裝了Node.js和Seneca框架, 使用專門用于Node.js平臺(tái)的連接各種傳感器的數(shù)據(jù)采集框架Johnny-Five. 通過(guò)Johnny-Five內(nèi)置的各種數(shù)據(jù)采集模塊, 將采集的數(shù)據(jù)轉(zhuǎn)換為JSON格式, 使用Seneca的微服務(wù)發(fā)布為REST API, 任何終端包括服務(wù)器管理層, 手機(jī)或平板, 甚至其他軟件系統(tǒng)都可以通過(guò)標(biāo)準(zhǔn)的REST API接口讀取監(jiān)測(cè)的數(shù)據(jù), 或發(fā)送執(zhí)行動(dòng)作的指令給連接的各種執(zhí)行器, 如閥門, 步進(jìn)電機(jī)等. 數(shù)據(jù)采集和控制端系統(tǒng)的微服務(wù)結(jié)構(gòu)參見(jiàn)圖2所示.
圖2 下位機(jī)采集端微服務(wù)結(jié)構(gòu)
服務(wù)器處理端同樣基于Node.js平臺(tái), 與數(shù)據(jù)庫(kù)的連接服務(wù)采用了支持ORM功能的Sails.js框架, 該框架實(shí)現(xiàn)了MVC模式, 極大簡(jiǎn)化了數(shù)據(jù)庫(kù)編程. 微服務(wù)框架Seneca調(diào)用Sail.js框架, 對(duì)外發(fā)布為支持REST API的微服務(wù), 可供各種客戶端訪問(wèn), 如Web, 手機(jī), 其他物聯(lián)網(wǎng)設(shè)備等, 服務(wù)端的微服務(wù)設(shè)計(jì)架構(gòu)參見(jiàn)圖3所示.
圖3 服務(wù)器端微服務(wù)架構(gòu)設(shè)計(jì)
每個(gè)微服務(wù)通過(guò)Seneca的role屬性實(shí)現(xiàn)服務(wù)的分類, 屬性cmd則定義服務(wù)的名稱. 當(dāng)微服務(wù)的客戶通過(guò)seneca實(shí)例傳入指定的模式信息后, Seneca根據(jù)模式匹配定位到指定的微服務(wù), 執(zhí)行回調(diào)函數(shù), 通過(guò)msg取得傳入的數(shù)據(jù)參數(shù), 使用respond對(duì)象返回微服務(wù)操作結(jié)果.
Seneca微服務(wù)可以通過(guò)多種方式調(diào)用. 在Node.js進(jìn)程內(nèi)部以及不同Node進(jìn)程之間, 都可以通過(guò)Seneca的客戶端實(shí)現(xiàn).
使用Seneca的client對(duì)象的方法act對(duì)指定的微服務(wù)進(jìn)行調(diào)用, 并且調(diào)用時(shí)依舊使用Node.js的異步非阻塞模式, 得以實(shí)現(xiàn)超大量客戶并發(fā)請(qǐng)求的快速處理.
Seneca的微服務(wù)默認(rèn)提供標(biāo)準(zhǔn)的RESTful API模式調(diào)用, 可以通過(guò)HTTP或HTTPS對(duì)微服務(wù)進(jìn)行請(qǐng)求.
如果分布式系統(tǒng)都采用Node.js進(jìn)行開(kāi)發(fā), 則直接使用Seneca的client對(duì)象對(duì)微服務(wù)進(jìn)行請(qǐng)求調(diào)用, 而采用其他技術(shù)時(shí), 可以使用HTTP REST API進(jìn)行請(qǐng)求, 如移動(dòng)客戶端的Android和iOS手機(jī). 無(wú)論哪種請(qǐng)求方式微服務(wù)的返回結(jié)果都是JSON[8]數(shù)據(jù)對(duì)象, 方便客戶端進(jìn)行數(shù)據(jù)的解析和處理.
系統(tǒng)中功能都采用微服務(wù)實(shí)現(xiàn), 核心微服務(wù)包括氣罐監(jiān)測(cè)數(shù)據(jù)、加氣機(jī)數(shù)據(jù)監(jiān)測(cè)、會(huì)員管理、加氣卡管理、CNG采購(gòu)管理、 CNG庫(kù)存管理等.
系統(tǒng)中Web客戶端使用jQuery通過(guò)REST API HTTP請(qǐng)求微服務(wù)完成對(duì)客戶的管理業(yè)務(wù).
由于定義的微服務(wù)較多, 系統(tǒng)采用Node.js的模塊機(jī)制將每個(gè)微服務(wù)定義在單獨(dú)的JavaScript文件內(nèi), 再使用Node.js和Seneca的模塊載入機(jī)制實(shí)現(xiàn)微服務(wù)的部署, 其示意加載和啟動(dòng)實(shí)現(xiàn)代碼如下:
在基于微服務(wù)架構(gòu)的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中, 為提高系統(tǒng)的安全性、可維護(hù)性和可伸縮性, 基本上都采用微服務(wù)API網(wǎng)關(guān)來(lái)接收客戶的請(qǐng)求, 將微服務(wù)與外部客戶端進(jìn)行隔離, 避免客戶端與微服務(wù)進(jìn)行直接的相互通訊, 保護(hù)微服務(wù)避免受到各種攻擊. 另外當(dāng)微服務(wù)發(fā)生改變時(shí), 只修改API Gateway, 不需要客戶端進(jìn)行任何修改. 所有客戶端都與API網(wǎng)關(guān)進(jìn)行通訊, 由網(wǎng)關(guān)實(shí)現(xiàn)動(dòng)態(tài)均衡負(fù)載, 再定位到系統(tǒng)中指定的微服務(wù).
本系統(tǒng)采用Senaca和Express[10]整合, 實(shí)現(xiàn)微服務(wù)API網(wǎng)關(guān)的Web接口, 以便微服務(wù)調(diào)用能通過(guò)企業(yè)內(nèi)部的防火墻, 提供微服務(wù)調(diào)用的對(duì)外端口. API網(wǎng)關(guān)封裝所有的微服務(wù)調(diào)用, 如數(shù)據(jù)采集、加油卡, 業(yè)務(wù)處理等,并將多個(gè)微服務(wù)的響應(yīng)結(jié)果進(jìn)行整合以單一結(jié)果發(fā)送回客戶端.
為演示一個(gè)微服務(wù)網(wǎng)關(guān)API的實(shí)現(xiàn)過(guò)程, 下面以加氣站客戶管理業(yè)務(wù)微服務(wù)API網(wǎng)關(guān)的實(shí)現(xiàn)加以說(shuō)明, 該API網(wǎng)關(guān)將代理實(shí)際微服務(wù), 供外部客戶端訪問(wèn), 并可以進(jìn)行安全性驗(yàn)證.
首先使用Node的模塊機(jī)制, 定義API網(wǎng)關(guān)的功能函數(shù), 并在函數(shù)內(nèi)部調(diào)用微服務(wù)公布的功能, 其簡(jiǎn)要實(shí)現(xiàn)代碼如下所示:
將微服務(wù)的API網(wǎng)關(guān)的實(shí)現(xiàn)代碼, 通過(guò)Seneca和Express的整合, 即可實(shí)現(xiàn)REST API模式的微服務(wù). 最后使用Express支持的中間件功能, 將Seneca的微服務(wù)和Express Web服務(wù)進(jìn)行整合, 實(shí)現(xiàn)微服務(wù)的REST API訪問(wèn)協(xié)議.
為減少系統(tǒng)的投資, 數(shù)據(jù)采集客戶端采用廉價(jià)的物聯(lián)網(wǎng)核心設(shè)備樹(shù)莓派卡片式計(jì)算機(jī)通過(guò)TCP/IP與加氣站的氣罐、加氣槍的傳感器和PLC相連. 系統(tǒng)利用樹(shù)莓派內(nèi)置的Linux操作系統(tǒng), 并安裝Node.js, 實(shí)現(xiàn)與服務(wù)器端微服務(wù)相同的編程模式, 有利于系統(tǒng)的維護(hù)和升級(jí).
樹(shù)莓派客戶端利用Node.js的johnny-five框架[11]實(shí)現(xiàn)與PLC連接, 并定時(shí)讀取監(jiān)控?cái)?shù)據(jù), 包括氣罐的壓力,容量等參數(shù). 在取得監(jiān)控?cái)?shù)據(jù)后, 使用Seneca的客戶端對(duì)象client向服務(wù)器端監(jiān)控?cái)?shù)據(jù)微服務(wù)API網(wǎng)關(guān)發(fā)送監(jiān)控?cái)?shù)據(jù), 由微服務(wù)對(duì)監(jiān)控?cái)?shù)據(jù)進(jìn)行存儲(chǔ)和處理. 傳感器數(shù)據(jù)讀取示意實(shí)現(xiàn)代碼如下:
johnny-five框架封裝了大量的傳感器和執(zhí)行器的訪問(wèn)代碼, 通過(guò)使用johnny-five可以以統(tǒng)一方式實(shí)現(xiàn)監(jiān)測(cè)監(jiān)控的編程, 簡(jiǎn)化了監(jiān)測(cè)系統(tǒng)的開(kāi)發(fā).
系統(tǒng)業(yè)務(wù)處理客戶端采用Web方式, 可以使用PC、手機(jī)、平板等訪問(wèn)由Express實(shí)現(xiàn)的Web服務(wù)器,請(qǐng)求系統(tǒng)的監(jiān)控和管理頁(yè)面. 客戶端使用HTML、JavaScript、jQuery實(shí)現(xiàn)與服務(wù)器端的微服務(wù)API網(wǎng)關(guān)進(jìn)行雙向的數(shù)據(jù)通訊.
客戶端與微服務(wù)API Gateway的通訊, 通過(guò)jQuery的AJAX JSON調(diào)用函數(shù)getJSON實(shí)現(xiàn), 其實(shí)現(xiàn)的簡(jiǎn)要示意代碼如下:
其中請(qǐng)求的地址是微服務(wù)API網(wǎng)關(guān)的REST地址,參數(shù)customerData是封裝了增加客戶表單提交的客戶數(shù)據(jù), 再使用異步響應(yīng)模式取得微服務(wù)API返回的處理結(jié)果, 使用這種異步工作模式, 將極大改善Web客戶的響應(yīng)處理速度. Web客戶端調(diào)用微服務(wù)API編程極其簡(jiǎn)單且高效的, 由此加快了企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)進(jìn)度.
此系統(tǒng)的設(shè)計(jì)與實(shí)施, 開(kāi)創(chuàng)了工業(yè)過(guò)程監(jiān)測(cè)監(jiān)控系統(tǒng)和微服務(wù)整合的低成本全新企業(yè)級(jí)互聯(lián)網(wǎng)系統(tǒng)的創(chuàng)新實(shí)踐, 通過(guò)使用廉價(jià)的物聯(lián)網(wǎng)板式計(jì)算機(jī)如樹(shù)莓派等, 極大減輕了企業(yè)的經(jīng)濟(jì)負(fù)擔(dān), 提高了企業(yè)投入技術(shù)改造的積極性. 使用全新的異步響應(yīng)式編程模式和高性能的Node.js結(jié)合, 極大簡(jiǎn)化了監(jiān)控系統(tǒng)的編程和維護(hù), 加快了系統(tǒng)的開(kāi)發(fā)和部署效率, 通過(guò)微服務(wù)技術(shù),提高了系統(tǒng)的可靠性、可維護(hù)性和可伸縮性, 未來(lái)擬采用微服務(wù)集群技術(shù), 能更好滿足了此類監(jiān)控和管理集成系統(tǒng)對(duì)性能和實(shí)時(shí)性需求.
1陸凌牛. Node. js權(quán)威指南. 北京: 機(jī)械工業(yè)出版社, 2014.
2唐文宇. 面向SOA架構(gòu)微服務(wù)的安全系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[碩士學(xué)位論文]. 南京: 南京大學(xué), 2016.
3Rodger R. Seneca Web. http://senecajs.org/2010-2015.
4Bojinov V. RESTful Web API design with Node. js. Birmingham-Mumbai: Packt Publishing, 2015.
5van Vugt S. Pro Ubuntu server administration. Berkeley,USA: Apress Publishing, 2009.
6汪鑫, 彭雨薇. 基于樹(shù)莓派的網(wǎng)絡(luò)監(jiān)控系統(tǒng)的研究與實(shí)現(xiàn).硅谷, 2014, 7(14): 25–26. [doi: 10.3969/j.issn.1671-7597.2014.14.015]
7席英杰, 劉文麗. 簡(jiǎn)述西門子S7-300/400的通訊功能及工業(yè)應(yīng)用. 自動(dòng)化與儀表, 2007, 22(1): 37–40.
8于京, 詹曉東. 一種基于JSON格式的生產(chǎn)線數(shù)據(jù)采集系統(tǒng)模型. 制造業(yè)自動(dòng)化, 2007, 34(3): 154–156.
9唐鼎, 秦小偉. 物聯(lián)網(wǎng)應(yīng)用化智能網(wǎng)關(guān)技術(shù). 信息通信技術(shù), 2013, (6): 78–82.
10Mardan A. Pro Express. JS. Berkeley: Apress Publishing, 2014.
11Tilkov S, Vinoski S. Node. js: Using JavaScript to build high-performance network programs. IEEE Internet Computing, 2010, 14(6): 80–83. [doi: 10.1109/MIC.2010.145]
SCADA Based on Seneca Micro-Service
LV Hai-Dong, GE Ri-Bo, ZHU Zhi-Gang
(City Institute, Dalian University of Technology, Dalian 116600, China)
In view of the complexity of traditional industry process monitoring system(SCADA) architecture, the inconsistency of the development technology and communication protocol between front and backend of application which could not process high concurrent requests, the innovated application which combines the SCADA and microservice framework Seneca based on Node.js server platform is developed which uses unified Node.js programming model and standardized REST API protocol. The application has low cost, high performance, easy maintenance and security of SCADA enterprise.
micro-services; API gateway; SCADA; Node.js; Seneca framework
呂海東, E-mail: haidonglu@126.com
呂海東,葛日波,朱志剛.基于Seneca微服務(wù)的過(guò)程監(jiān)測(cè)系統(tǒng).計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(7):121–125. http://www.c-s-a.org.cn/1003-3254/5829.html
2016-10-18; 收到修改稿時(shí)間: 2016-11-21