王善坤, 呂海東
(大連理工大學(xué)城市學(xué)院,大連 116600)
基于響應(yīng)式微服務(wù)的自主學(xué)習(xí)平臺的設(shè)計與實現(xiàn)
王善坤, 呂海東
(大連理工大學(xué)城市學(xué)院,大連 116600)
針對傳統(tǒng)軟件應(yīng)用項目的單一整體架構(gòu)的可維護(hù)性、可擴(kuò)展性和可伸縮性,以及無法適應(yīng)移動互聯(lián)網(wǎng)時代的超大規(guī)模客戶訪問的缺陷,提出了采用全新的異步、非阻塞、實時性、高并發(fā)的工作模式的基于響應(yīng)式微服務(wù)的企業(yè)級應(yīng)用架構(gòu)。在此架構(gòu)的原則指導(dǎo)下,使用全新的SPA模式,后臺Node.js和Seneca微服務(wù)以及前臺AngularJS框架實現(xiàn)了高校自主學(xué)習(xí)平臺軟件應(yīng)用系統(tǒng)。實際應(yīng)用表明,該系統(tǒng)在超大量移動客戶訪問的情況下,響應(yīng)迅速,極大超越了使用傳統(tǒng)的Java Web平臺的原有系統(tǒng)。
微服務(wù); 響應(yīng)式; 事件驅(qū)動; 單網(wǎng)頁應(yīng)用
隨著移動互聯(lián)網(wǎng)的迅猛發(fā)展,現(xiàn)代軟件應(yīng)用系統(tǒng)的需求在快速不斷的變化,與此同時使用移動終端如手機(jī)或平板訪問軟件系統(tǒng)[1]正日益普及,要求軟件系統(tǒng)必須能適應(yīng)超大并發(fā)訪問量處理與響應(yīng)。傳統(tǒng)的整體單一架構(gòu)的軟件系統(tǒng)[2]設(shè)計已無法適應(yīng)移動互聯(lián)網(wǎng)時代的快速變化,面臨著越來越多的挑戰(zhàn),包括項目的開發(fā),部署以及后續(xù)的維護(hù)都難以實現(xiàn)DevOps[3]持續(xù)交付的要求。
為適應(yīng)移動互聯(lián)網(wǎng)高速發(fā)展以及在項目開發(fā)敏捷、精益、持續(xù)交付的強(qiáng)大需求下,目前軟件項目的部署方式由傳統(tǒng)的單服務(wù)器模式向虛擬化、容器化(Docker)和云平臺轉(zhuǎn)變,導(dǎo)致微服務(wù)(Micro Service)[4]異軍突起,得到飛速的發(fā)展和應(yīng)用。
在微服務(wù)的開發(fā)方面,為適應(yīng)當(dāng)今移動互聯(lián)網(wǎng)時代大量移動客戶端設(shè)備的并發(fā)請求,使用傳統(tǒng)的、采用多線程模式的企業(yè)級架構(gòu)(如JavaEE,MS.NET和PHP)已經(jīng)難以滿足如此眾多的客戶端的超大并發(fā)請求,成為這些框架難以逾越的C10K+問題[5]。為此使用全新模式的單線程、異步工作模式和響應(yīng)式事件驅(qū)動的服務(wù)端框架技術(shù)Node.js[6]成為開發(fā)微服務(wù)的首選。
本文介紹了使用Node.js框架以及在其基礎(chǔ)上的微服務(wù)框架Seneca[7],持久層ORM框架Sequelize[8],并結(jié)合客戶端框架AngularJS[9]和Bootstrap[10]實現(xiàn)了單頁面應(yīng)用模式(SPA)[11]的基于高校校園網(wǎng)的自主學(xué)習(xí)平臺[12]的開發(fā)與實現(xiàn)。在此平臺上教師可以管理自己的課程的微課視頻,在線學(xué)習(xí)資料,在線測試題目發(fā)布,并結(jié)合微信,微博實現(xiàn)立體化的教學(xué)。學(xué)生可以通過此平臺實現(xiàn)不限時間和地點的全方位學(xué)習(xí)和測驗。
自主學(xué)習(xí)平臺軟件系統(tǒng)采用后端和前端分離的架構(gòu)設(shè)計,如圖1所示。
服務(wù)器后端采用Node.js作為基礎(chǔ)平臺,結(jié)合ORM持久層框架Sequelize和微服務(wù)框架Senecas實現(xiàn)了REST API模式的訪問模式。Web前端通過REST API訪問后端服務(wù)器,通過發(fā)送和接收J(rèn)SON數(shù)據(jù)實現(xiàn)業(yè)務(wù)處理,克服了傳統(tǒng)的Java Web由服務(wù)器端使用JSP生成HTML頁面的弊病,極大地節(jié)省了網(wǎng)絡(luò)帶寬,提高了系統(tǒng)的響應(yīng)速度。
圖1 系統(tǒng)總體架構(gòu)設(shè)計
近年來,由于傳統(tǒng)的應(yīng)用服務(wù)器如JavaEE,MS.NET和PHP都采用多線程模式處理多用戶并發(fā)請求,導(dǎo)致了著名的C10K+問題,尤其是移動互聯(lián)網(wǎng)時代,使用智能手機(jī)或平板電腦訪問軟件系統(tǒng)呈現(xiàn)爆炸性增長,進(jìn)而升級為C10M+問題,未來可能為C10G+問題,這是傳統(tǒng)系統(tǒng)難以有效解決的難題之一。
在此情況下,以解決高并發(fā)訪問能力的Node.js服務(wù)器端技術(shù)應(yīng)運而生,并迅猛發(fā)展。Node.js 使用事件驅(qū)動、異步工作模式和非阻塞I/O 模型而得以輕量和高效,非常適合開發(fā)超大并發(fā)訪問的Web應(yīng)用。
與此同時,傳統(tǒng)的單一整體設(shè)計的軟件系統(tǒng)架構(gòu)無法再快速增加或修改原有功能,而且單體式應(yīng)用也會降低開發(fā)速度。應(yīng)用程序越大,啟動時間會越長。而轉(zhuǎn)用基于微服務(wù)的架構(gòu),采用模塊化、松散耦合的方式成為現(xiàn)代軟件項目的首選,進(jìn)而微服務(wù)是互聯(lián)網(wǎng)云計算時代傳統(tǒng)軟件系統(tǒng)從單一整體架構(gòu)向分布式微組件結(jié)構(gòu)轉(zhuǎn)變的必然選擇。通過將傳統(tǒng)軟件系統(tǒng)的功能拆分為可獨立開發(fā)和部署的微服務(wù),提高了軟件應(yīng)用系統(tǒng)的可靠性、可維護(hù)性和可伸縮性,能適應(yīng)當(dāng)前以移動客戶端為主要訪問模式的超大量并發(fā)請求處理,并實現(xiàn)快速響應(yīng),以滿足移動客戶的對系統(tǒng)性能的極高需求。
Seneca是基于Node.js的微服務(wù)框架,使得開發(fā)在Node.js開發(fā)微服務(wù)變得簡單而高效,由Seneca負(fù)責(zé)生成REST API,開發(fā)者專注于業(yè)務(wù)功能即可,所有實現(xiàn)細(xì)節(jié)由Seneca負(fù)責(zé),極大地提高了微服務(wù)的開發(fā)效率,縮短了項目的開發(fā)周期,節(jié)省了開發(fā)費用。
在傳統(tǒng)的企業(yè)級項目中,由于采用Hibernate的持久層架構(gòu)技術(shù),避免了手工編寫SQL語句,提高了項目的開發(fā)速度。在Node平臺上,Sequelize框架同樣實現(xiàn)了ORM持久層功能,其在MySQL模塊的基礎(chǔ)上實現(xiàn)了對SQL操作的封裝。本項目使用Sequelize完成數(shù)據(jù)庫的CRUD操作,并使用Node.js的模塊實現(xiàn)業(yè)務(wù)處理,由Seneca微服務(wù)發(fā)布為REST API,以供客戶端Web請求訪問。
Web前端部署在單獨的Nginx高性能Web服務(wù)器上[13],完全采用HTML靜態(tài)頁面技術(shù),結(jié)合Bootstrap布局框架和AngularJS框架實現(xiàn)了單頁面應(yīng)用(SPA),將傳統(tǒng)的控制器由服務(wù)器端轉(zhuǎn)移到客戶端,使用AngularJS插件UI-Router實現(xiàn)了頁面的導(dǎo)航和SPA的子頁面嵌入。前端使用AngularJS的http和resource訪問后端的REST API服務(wù)。
前端的Nginx服務(wù)器和后端的Node.js微服務(wù)既可以部署在一個服務(wù)器中,也可以分別部署到單獨的服務(wù)器中以實現(xiàn)均衡負(fù)載處理。本系統(tǒng)中將采用了分開部署方式,各自部署在單獨的Ubuntu16.04服務(wù)器上。
企業(yè)級應(yīng)用軟件都需要與數(shù)據(jù)庫交互,實現(xiàn)傳統(tǒng)的增加、修改、刪除和查詢操作,簡稱為CRUD(Create、Retrive,Update、Delete),并專門設(shè)計了持久層(DAO-Data Access Object)實現(xiàn)此類功能。在沒有出現(xiàn)基于Node.js的DAO層框架之前,普遍使用專門的數(shù)據(jù)庫模塊,如mysql模塊實現(xiàn)與MySQL數(shù)據(jù)庫操作,并使用原始的執(zhí)行SQL語句實現(xiàn)CRUD功能,回到了操作數(shù)據(jù)庫的原始年代。
為克服原始的SQL編程模式,基于Node.js的多種持久層ORM框架出現(xiàn),包括orm,orm2和Sequelize,經(jīng)過多年的更新和完善Sequelize成為其中的佼佼者,被得以廣泛應(yīng)用。Sequelize支持多種流行數(shù)據(jù)庫包括MySQL,MariaDB,SQLite和PostgreSQL,其實現(xiàn)了與Hibernate相同的數(shù)據(jù)庫記錄到JavaScript對象的相互映射和轉(zhuǎn)換,通過操作Model對象的方法,Sequelize自動生成SQL操作并實現(xiàn)事務(wù)處理,程序1展示了使用其實現(xiàn)的持久層編程。
程序1 持久層Model定義
var Sequelize = require('sequelize');
var sequelize = new Sequelize('citylearning', 'root', 'city', {
host: 'localhost',
port:3306,
dialect: 'mysql',
ool: { max: 5, min: 0, idle: 10000 }
});
//專業(yè)Model定義
var Department=sequelize.define("Department",{
dno: {type:Sequelize.INTEGER, primaryKey: true,autoIncrement: true},
dcode: Sequelize.STRING,
dname: Sequelize.STRING
},{ tableName:"department",
timestamps: false });
Teacher.belongsTo(Department,{as:'Department',foreignKey:'DNO'});
Department.hasMany(Teacher,{as:'Teachers',foreignKey:'DNO'});
module.exports.Department=Department;
module.exports.Teacher=Teacher;
定義Model對象后,使用Sequelize框架提供的方法實現(xiàn)CRUD,其代碼示意程序2所示。
程序2:Sequelize實現(xiàn)CRUD功能的代碼。
var Model=require("../model/Model.js");
var DepartmentModel=Model.Department;
DepartmentModel.create(department);
DepartmentModel.findById(department.dno).then(function(dept) {
dept.dcode=department.dcode;
dept.dname=department.dname;
dept.save().then(function(){
resolve({result:"Y"});
});
});
通過Sequelize不再需要編寫原始的SQL語句即可實現(xiàn)持久層的CRUD功能,極大提高了基于Node.js平臺的項目的開發(fā)效率。
軟件系統(tǒng)的業(yè)務(wù)服務(wù)層用于模擬實際業(yè)務(wù)的處理,企業(yè)的每個業(yè)務(wù)處理任務(wù)在業(yè)務(wù)層都對應(yīng)一個業(yè)務(wù)方法。本系統(tǒng)中業(yè)務(wù)服務(wù)層采用Node.js的模塊機(jī)制[14]實現(xiàn),每個業(yè)務(wù)對象的業(yè)務(wù)處理都單獨編寫為一個Node.js模塊,在業(yè)務(wù)模塊內(nèi)調(diào)用前面定義的持久層方法,程序3為管理員的業(yè)務(wù)層的簡要示意代碼。
程序3:管理員業(yè)務(wù)層模塊代碼
var Promise = require('promise'); //引入promise模塊
var Model=require("./Model.js");
var Admin=Model.Admin;
var AdminBusiness={
gotAdmin:function(id){
return Admin.findById(id);
},
validate:function(id,password){
var promise = new Promise(function (resolve, reject){
Admin.findOne({ where: {aid:id,apassword:password} }).then(function(admin) {
if(admin===null){
resolve({result:"N"});
}else{ resolve({result:"Y"}); }
});
});
return promise; }
};
module.exports=AdminBusiness;
業(yè)務(wù)層調(diào)用持久層Sequelize提供的Model對象的方法實現(xiàn)對數(shù)據(jù)庫的基本操作。為使前端能訪問業(yè)務(wù)層方法,需要使用下面的微服務(wù)發(fā)布層將業(yè)務(wù)服務(wù)層方法發(fā)布為REST API。
在現(xiàn)代化企業(yè)應(yīng)用開發(fā)中,微服務(wù)架構(gòu)的日益普及是大勢所趨。相對于單一整體模式的應(yīng)用程序高昂的維護(hù)費用和基礎(chǔ)設(shè)施開銷,基于微服務(wù)的應(yīng)用程序把各種功能分開,形成一系列的微型服務(wù),可通過REST API連接和訪問這些微服務(wù)。
基于Node.js平臺的Seneca框架,提供了極其簡便的語法實現(xiàn)微服務(wù)的定義和實現(xiàn)。Seneca將每個微服務(wù)定義為Command,通過add函數(shù)將各種訪問指令發(fā)布為REST API地址。微服務(wù)定義中使用role劃分微服務(wù)類別,cmd表達(dá)微服務(wù)的動作,二者組合形成REST API URL地址。使用Seneca實現(xiàn)微服務(wù)的代碼參見程序4所示。
程序4:管理員微服務(wù)API定義代碼
var AdminBusiness=require("../business/AdminBusiness.js");
//管理員微服務(wù)API
module.exports=function AdminService(options){
this.add({role:"admin",cmd:"got"},function (msg,respond){
AdminBusiness.gotAdmin(msg.req.query.id).then(function(data){
console.log(data.dataValues);
respond(null,data.dataValues);
});
});
this.add({role:"admin",cmd:"validate"},function(msg,respond){
AdminBusiness.validate(msg.req.query.id,msg.req.query.password).then(function(data){
console.log(data);
respond(null,data);
});
});
//將微服務(wù)映射為REST API
this.act('role:web',{use:{
prefix: '/adminapi',
pin: {role:'admin',cmd:'*'},
map:{ got: {GET:true}, validate:{GET:true} }
}});
};
上述代碼定義的微服務(wù)REST API可以通過/adminapi/admin/validate/:name/:password進(jìn)行管理員的驗證,地址/adminapi/admin/got/:id取得管理員的信息。由碼可見,使用Seneca實現(xiàn)微服務(wù)是非常簡單,使得微服務(wù)編程極其高效。
現(xiàn)代軟件系統(tǒng)都需要支持不同客戶終端的訪問,如PC、手機(jī)和平板,未來更要支持各種便攜設(shè)備或物聯(lián)網(wǎng)設(shè)備等。為實現(xiàn)快速開發(fā)和部署,本系統(tǒng)主要采用Web前端,使用Bootstrap框架實現(xiàn)對手機(jī)和平板等不同屏幕尺寸的自動適應(yīng),實現(xiàn)響應(yīng)式應(yīng)用[15]。
Web前端主要采用最新的AngularJS框架實現(xiàn)單頁面應(yīng)用(SPA),使用HTML結(jié)合Angular指令實現(xiàn)Web頁面模版,通過AngularJS的service訪問后臺微服務(wù)的API,使用Angular的controller調(diào)用service實現(xiàn)與Web頁面交互。
SPA頁面的路由使用ui-router框架,該框架支持視圖的多層嵌套,克服了Angular內(nèi)置的ng-router插件只能進(jìn)行單層嵌套子頁面的弊病,可以實現(xiàn)非常復(fù)雜的Web前端頁面的實現(xiàn),程序5展示了多級嵌入頁面的路由定義代碼。
程序5:使用ui-router實現(xiàn)的多層視圖嵌入的路由定義。
var cityApp = angular.module('citylearning', ['ui.router','citylearning.admincenter']);
cityApp.config(function(stateProvider,urlRouterProvider){
stateProvider.state({
name: 'home',
url: '/home',
templateUrl:"home.html"
}).state({
name: 'admincenter.home',
url: '/home',
templateUrl:"../admincenter/main/view/home.html"
}).state({
name: 'admincenter.department',
url: '/department',
templateUrl:"../admincenter/department/view/main.html"
}).state({
name: 'admincenter.department.add',
url: '/add',
templateUrl:"../admincenter/department/view/add.html"
});
});
//系統(tǒng)主控制器
cityApp.controller("citylearning.maincontroller",function(scope,state){
$scope.showHeader=false;
$scope.toHome=function(){
$scope.showHeader=true;
$state.go("home");
};
$scope.toLessonCenter=function(){
$scope.showHeader=false;
$state.go("lessoncenter");
};
$scope.toHome();
});
AngularJS的service提供了便于各種controller訪問的共享單例模式,整個Web應(yīng)用中提供集中的機(jī)制訪問后臺微服務(wù)API。項目中使用Angular的內(nèi)置服務(wù)http訪問Seneca實現(xiàn)的微服務(wù),其實現(xiàn)示意代碼參見程序6所示。
程序6:Web前端Service定義代碼。
angular.module('citylearning.admincenter')
.service("admindepartmentservice",function(http){
//后臺專業(yè)Service
this.getlist=function(){
return http.get("http://localhost:8200/department/all");
};
this.getDepartment=function(departmentNo){
return http.get("http://localhost:8200/department/get/"+departmentNo);
};
this.add=function(department){
var url="http://localhost:8200/department/add/"+department.dcode+"/"+department.dname;
return http.get(url);
};
});
Angular中控制器負(fù)責(zé)在UI頁面和Service之間進(jìn)行協(xié)調(diào)與調(diào)用,將Service取得的服務(wù)器端JSON數(shù)據(jù)通過雙向綁定機(jī)制實現(xiàn)與頁面元素的同步更新,控制器的示意代碼如程序7所示。
程序7:控制器示意代碼
angular.module('citylearning.admincenter')
.controller("departmentcontroller",function(scope,state,departmentservice){
scope.add=function(){
admindepartmentservice.add(scope.department).then(function(data){
if(data.data.result=="Y"){
BootstrapDialog.alert('增加專業(yè)成功!');
$scope.toList();
} }); };
本課程自主學(xué)習(xí)平臺以課程視頻的播放為核心業(yè)務(wù),對系統(tǒng)的處理和響應(yīng)能力要求較高。所有的任課教師將自己教授的課程,按照每集15分鐘以內(nèi)要求制作成課程微課視頻,并上傳到平臺,同時還有課程的輔助材料,在線測試等,學(xué)生可在任何時間和地點學(xué)習(xí)課程所講知識,由于真對性強(qiáng),受到學(xué)生的普遍歡迎,高峰時間并發(fā)訪問量突破5 000人,對系統(tǒng)性能要求很高。傳統(tǒng)的基于Java Web結(jié)合SSH(Spring+Struts2+Hibernate)由于采用多線程模式處理并發(fā)請求,難以承受之高并發(fā)訪問,導(dǎo)致系統(tǒng)響應(yīng)卡頓,視頻播放不流暢,學(xué)生不滿和吐槽頻繁。采用了基于全新的異步、非阻塞、實時性、高并發(fā)的Node.js以及與微服務(wù)Seneca實現(xiàn)的該系統(tǒng)完美解決傳統(tǒng)系統(tǒng)的以上問題,尤其性能改進(jìn)巨大,系統(tǒng)完全能適應(yīng)高并發(fā)訪問,在相同的硬件環(huán)境下,不再出現(xiàn)原有系統(tǒng)的任何問題。
該測試系統(tǒng)采用具有高速數(shù)據(jù)采集卡的便攜式測試計算機(jī)為硬件平臺,軟件設(shè)計采用模塊化設(shè)計思想,提高了系統(tǒng)的可靠性和維護(hù)性。采用全新的基于微服務(wù)架構(gòu)在我院大學(xué)生自主學(xué)習(xí)平臺項目中得到實際運用,取代了原來使用Java平臺的SSH架構(gòu)的單一整體設(shè)計的系統(tǒng),經(jīng)過與原有系統(tǒng)的平行測試,新系統(tǒng)在不斷增加客戶訪問量時,性能依然維持在非常理想的水平,而原有系統(tǒng)當(dāng)并發(fā)訪問量到一定規(guī)模后,響應(yīng)延遲嚴(yán)重。實際應(yīng)用表明使用全新架構(gòu)的軟件系統(tǒng)能非常好的適應(yīng)超大規(guī)模的并發(fā)客戶訪問,并且基于微服務(wù)REST API設(shè)計的新系統(tǒng),各個模塊可以單獨開發(fā)和部署,極大提高了系統(tǒng)的可維護(hù)性和可伸縮性。
[1] 高嘉譯,高強(qiáng),等.面向移動應(yīng)用的后端服務(wù)平臺[J].計算機(jī)系統(tǒng)應(yīng)用,2014(2):22-27.
[2] 陳雋.軟件架構(gòu)復(fù)用的研究與應(yīng)用[J]. 華東師范大學(xué)學(xué)報, 2011(3).
[3] 劉春輝.DevOps:企業(yè)實現(xiàn)移動和云計算轉(zhuǎn)型的關(guān)鍵[N].人民郵電,2013-07-11(5).
[4] 陳春霞. 基于容器的微服務(wù)架構(gòu)的淺析[J]. 信息系統(tǒng)工程, 2016(3):95-96.
[5] 楊小嬌. 輕量級高并發(fā)Web服務(wù)器的研究與實現(xiàn)[D].南京:南京郵電大學(xué), 2014.
[6] 王金龍, 宋斌,丁銳. Node.js:一種新的Web應(yīng)用構(gòu)建技術(shù)[J]. 現(xiàn)代電子技術(shù), 2015(6):70-73.
[7] 俞黎敏. Web Services之REST風(fēng)格架構(gòu)設(shè)計[J]. 程序員, 2010(11):26-26.
[8] 趙婉芳,張錚.基于三層架構(gòu)體系的教學(xué)視頻點播系統(tǒng)研究與開發(fā)[J]. 數(shù)字技術(shù)與應(yīng)用, 2013(4):176-176.
[9] 董英茹. 簡談AngularJS在下一代Web開發(fā)中的應(yīng)用[J].軟件工程師,2015(5):30-31.
[10] Kim,Bohyun.Responsive Web design, discoverability, and mobile challenge[J]. Library Technology Reports, 2013(6):49-51.
[11] 穆瑞潔.單頁面網(wǎng)站導(dǎo)航設(shè)計研究[J].藝術(shù)科技, 2014(4):64-64.
[12] 岳俊梅.基于網(wǎng)絡(luò)環(huán)境的自主學(xué)習(xí)平臺設(shè)計與實現(xiàn)[J].電腦開發(fā)與應(yīng)用,2014(6):22-24.
[13] 楊偉強(qiáng). 安全高效的Nginx反向加速技術(shù)在站群中的應(yīng)用[J]. 信息系統(tǒng)工程, 2013(3):83-84.
[14] 朱建兵. 基于Node.Js高并發(fā)網(wǎng)絡(luò)應(yīng)用架構(gòu)的研究與實現(xiàn)[D]. 北京:北京郵電大學(xué), 2014.
[15] 羅予東,陳偉君,劉秀湛,劉宏威. 響應(yīng)式移動互聯(lián)的中小型企業(yè)網(wǎng)站設(shè)計[J]. 計算機(jī)與現(xiàn)代化, 2015(11):53-55.
Design and Implementing of Self-learning Platform Based on Reactive Micro Service
Wang Shankun,Lv Haidong
(City Institute Dalian University of Technology,Dalian 116600,China)
In order to overcome the weakness on maintainability, scalability, and scalability in traditional applications which can not meet the current request of access of mobile internet, a new reactive micro service application architecture which based on event-driven, asynchronous,real-time is designed in this paper. Based on this architecture a self-learning platform is implemented with SPA Web model using the new technologies each as Node.js, AngularJS and micro service framework Seneca. Real application results show that the new architecture can handle the large access and response faster than the traditional system which based on Java Web platform.
Micro service; Reactivity; Event driven; SPA
王善坤(1961-),男,大連市人,副教授,學(xué)士。研究方向:網(wǎng)絡(luò)工程、企業(yè)級應(yīng)用架構(gòu)、云計算 呂海東(1964-),男,內(nèi)蒙古興安盟,本科,副教授,研究方向:企業(yè)級應(yīng)用架構(gòu),云計算,物聯(lián)網(wǎng),大數(shù)據(jù)處理
1007-757X(2017)03-0062-05
TN919
A
2016.09.19)