999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Vert.X企業(yè)級Web應(yīng)用設(shè)計(jì)與實(shí)現(xiàn)

2015-07-25 06:51:38呂海東葛日波
微型電腦應(yīng)用 2015年11期

呂海東,葛日波

0 引言

當(dāng)前由于移動互聯(lián)網(wǎng)的飛速發(fā)展,智能手機(jī)和平板請求訪問Web應(yīng)用極為普遍,進(jìn)而產(chǎn)生大量移動客戶端訪問Web應(yīng)用導(dǎo)致Web Server無法滿足如此巨大的高并發(fā)性訪問需求,即所謂的C10K問題,當(dāng)并發(fā)連接超過10,000以上時(shí)使用傳統(tǒng)技術(shù)會引發(fā)暫停,類似微信的實(shí)時(shí)數(shù)據(jù)傳輸類應(yīng)用尤為突出。

傳統(tǒng)的企業(yè)級 Web應(yīng)用一般使用基于 Oracle公司的JavaEE的JSSHA(JavaEE+Struts+Spring+Hibernate+AJAX)框架[3],或基于微軟 DOTNET平臺開發(fā),它們都使用多線程技術(shù)實(shí)現(xiàn)多連接請求,因此都面臨C10K性能瓶頸,要解決大并發(fā)客戶的請求只能進(jìn)行服務(wù)器群集,導(dǎo)致系統(tǒng)設(shè)備投資巨大,中小企業(yè)難以承受。

為解決以上問題,最先出現(xiàn)的解決方案就是Node,js技術(shù),通過采用單線程、非阻塞、異步工作模式、事件循環(huán)機(jī)制很好解決了C10K問題,一般情況下單CPU服務(wù)器即可支持超萬個并發(fā)連接。其后Vert.x在Node.js的優(yōu)點(diǎn)之上,將基礎(chǔ)平臺移到JVM上,引入分布式并發(fā)機(jī)制以及自動支持多核CPU的能力,在一個單CPU八核的Intel E5服務(wù)器上即可支持?jǐn)?shù)十萬并發(fā)連接請求,因此Vert.x必將成為未來開發(fā)移動Web應(yīng)用的首選平臺。

本文重點(diǎn)介紹了使用Vert.x服務(wù)器框架實(shí)現(xiàn)企業(yè)級Web應(yīng)用的設(shè)計(jì)和實(shí)現(xiàn),并結(jié)合一個使用微信公共平臺技術(shù)的Web應(yīng)用的開發(fā)進(jìn)行說明。

1 Vert.x概述

Vert.x是基于JVM平臺的輕量級,高性能的服務(wù)器端框架。專門用于開發(fā)移動應(yīng)用,Web和企業(yè)級應(yīng)用,它的核心特點(diǎn)是單線程,非阻塞,事件驅(qū)動模型,多樣性,高并發(fā)。

Vert.x的核心是Vert.x實(shí)例[4],它是運(yùn)行所有Vert.x組件的容器,Vert.x框架自動識別CPU內(nèi)核個數(shù),在每個內(nèi)核上都創(chuàng)建一個實(shí)例,并把所有組件同時(shí)部署在每個實(shí)例中,實(shí)現(xiàn)組件的并行運(yùn)行,并內(nèi)置機(jī)制自動執(zhí)行動態(tài)負(fù)載均衡,當(dāng)一個事件接收時(shí)自動選擇空閑的組件執(zhí)行,從而實(shí)現(xiàn)高并發(fā)Web應(yīng)用。更進(jìn)一步Vert.x實(shí)例可以分布到多個服務(wù)器上,實(shí)現(xiàn)分布式處理,實(shí)現(xiàn)系統(tǒng)的可伸縮性,實(shí)現(xiàn)超大量級并發(fā)請求。

Vert.x使用基于角色的事件循環(huán)監(jiān)測的并發(fā)模式(Actor-like Concurrency Model)[5],徹底地解決了C10K問題。Vert.x基本編程組件稱為Verticle,可將企業(yè)級應(yīng)用的各個功能分解為眾多Verticle,每個Verticle執(zhí)行單一的業(yè)務(wù)功能,所有Verticle都獨(dú)立運(yùn)行在Vert.x實(shí)例一個線程中,而非傳統(tǒng)的多線程模式。當(dāng)應(yīng)用業(yè)務(wù)復(fù)雜,使用的Verticle較多時(shí),可以使用模塊(Module)機(jī)制將相似功能的 Verticle打包到模塊中,整個項(xiàng)目就是由不同的模塊組成,載入模塊時(shí),模塊中包含的Verticle會自動載入Vert.x實(shí)例中運(yùn)行。

Verticle之間不能直接調(diào)用和傳遞數(shù)據(jù),只能通過在分布式Event Bus上發(fā)布和接收事件完成。Verticle通過在Event Bus上注冊事件處理器來接收事件和事件中攜帶的數(shù)據(jù),也可以向Event Bus上發(fā)送事件和傳輸數(shù)據(jù)。

事件的發(fā)送和接收可以采用3種模式:

(1)發(fā)布-訂閱模式:一個Event Bus上的事件可以被所有注冊的接收者接收,實(shí)現(xiàn)群發(fā)功能,如數(shù)據(jù)的檢索和顯示等。

(2)點(diǎn)對點(diǎn)模式:一個事件只能被一個接收者接收,完成定點(diǎn)數(shù)據(jù)傳輸功能,如工作流審批等業(yè)務(wù)可以通過此模式完成。

(3)請求-回復(fù)模式:在點(diǎn)對點(diǎn)基礎(chǔ)上增加自動回復(fù)功能,可以實(shí)現(xiàn)對用戶的操作結(jié)果提示功能。

使用Vert.x框架設(shè)計(jì)實(shí)現(xiàn)企業(yè)級應(yīng)用的核心工作就是編寫完成實(shí)現(xiàn)各種業(yè)務(wù)功能的 Verticle,定義各種 Event Bus的事件地址和事件處理器注冊,通過在Event Bus發(fā)布和接收事件,業(yè)務(wù)Verticle之間完成間接調(diào)用,以此實(shí)現(xiàn)整個系統(tǒng)的業(yè)務(wù)功能。

2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

2.1 系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)

傳統(tǒng)的企業(yè)級應(yīng)用設(shè)計(jì)開發(fā)中,如基于 JSSHA(JavaEE+Struts+Spring+Hibernate+Ajax),通常采用分層的架構(gòu)設(shè)計(jì),將整個項(xiàng)目分解為數(shù)據(jù)服務(wù)層(DS-DataBase Service),數(shù)據(jù)訪問層(DAO-Data Access Object),業(yè)務(wù)層(Bo-Business Object),數(shù)據(jù)傳輸層(DTO-Data Transfer Object),控制層(CO-Controller Object),視圖層(VO-View Object)。

本文使用Vert.x開發(fā)設(shè)計(jì)了基于微信公共平臺的高校學(xué)生課程考勤系統(tǒng),由于在每節(jié)課的課前和課后需要學(xué)生使用微信掃描投影布顯示的二維碼進(jìn)行課程的簽到,全校平均一萬多學(xué)生同時(shí)進(jìn)行掃描并接收處理,使用傳統(tǒng)的Tomcat服務(wù)器,無法完成如此高并發(fā)的請求,因此在綜合評估Node.js和Vert.x后,最終選擇Vert.x框架實(shí)現(xiàn)。

由于Vert.x框架出現(xiàn)較晚,并沒有一個成熟的應(yīng)用開發(fā)架構(gòu),目前還處于探索和創(chuàng)新階段。本文借鑒JSSHA架構(gòu)成熟的分層設(shè)計(jì)技術(shù),采用了類似的架構(gòu)設(shè)計(jì),系統(tǒng)總體組成參如圖1所示:

圖1 基于Vert.x的企業(yè)級應(yīng)用架構(gòu)組成

另外在開發(fā)語言選擇時(shí),雖然Vert.x支持多語言開發(fā),如 Java、JavaScript、CoffeeScript、Ruby、Python or Groovy等,考慮到Vert.x的異步編程模式,使用Java編程代碼量過大,不適合異步編程,JavaScript是最佳選擇,內(nèi)置的回調(diào)函數(shù)是實(shí)現(xiàn)異步編程的最佳選擇。

2.2 數(shù)據(jù)服務(wù)層設(shè)計(jì)實(shí)現(xiàn)

數(shù)據(jù)服務(wù)層組件Verticle負(fù)責(zé)連接MySQL數(shù)據(jù)庫,執(zhí)行 SQL語句,完成數(shù)據(jù)的增刪改查操作。該層選擇成熟的第三方模塊 io.vertx~mod-mysql-postgresql_2.10~0.3.1[6],實(shí)現(xiàn)操作MySQL數(shù)據(jù)庫,并使用異步工作模式,通過在Event Bus上發(fā)送事件,完成對數(shù)據(jù)表的 SQL操作。該層的核心實(shí)現(xiàn)示意代碼如下程序所示。

部署該模塊并傳入數(shù)據(jù)庫配置信息即可,參數(shù) address表示模塊監(jiān)聽的事件地址,通過向地址city.oa.lesson.dao發(fā)送事件,并傳遞標(biāo)準(zhǔn)的SQL 動作即可實(shí)現(xiàn)對數(shù)據(jù)庫的操作。

2.3 數(shù)據(jù)訪問層(DAO)設(shè)計(jì)實(shí)現(xiàn)

數(shù)據(jù)訪問層負(fù)責(zé)對業(yè)務(wù)對象的持久化操作,實(shí)現(xiàn)與Hibernate相同的功能。每個數(shù)據(jù)表的讀寫設(shè)計(jì)為一個Verticle,將所有表的數(shù)據(jù)訪問Verticle打包到DAO模塊中。如下代碼為分院管理的DAO層實(shí)現(xiàn)示意代碼。

MySQL模塊接收標(biāo)準(zhǔn)化的Action參數(shù),以此完成SQL執(zhí)行并返回執(zhí)行結(jié)果。

2.4 業(yè)務(wù)層(BO)設(shè)計(jì)實(shí)現(xiàn)

業(yè)務(wù)層模塊包含實(shí)現(xiàn)各種業(yè)務(wù)功能的 Verticle,一般情況下將每個業(yè)務(wù)對象的管理形成單獨(dú)的模塊,如本系統(tǒng)中的分院模塊,專業(yè)模塊,班級和選課模塊等。業(yè)務(wù)模塊接收界面模塊發(fā)出的業(yè)務(wù)處理請求事件,對傳輸?shù)膮?shù)進(jìn)行解析,發(fā)出對DAO層調(diào)用的事件,完成業(yè)務(wù)處理。由于編程代碼較多,只簡要示意對分院增加的代碼。

2.5 控制層(CO)設(shè)計(jì)實(shí)現(xiàn)

使用 Vert.x框架,不需要進(jìn)行控制層編程,Event Bus擔(dān)當(dāng)控制層的角色,只需在Event Bus注冊不同的事件地址,并注冊事件接收處理器即可。

2.6 視圖層(UIO)實(shí)現(xiàn)

視圖層負(fù)責(zé)用戶操作界面的顯示和數(shù)據(jù)輸入,采用Web頁面技術(shù) HTML、CSS、JavaScript以及 jQuery,Bootstrap框架,結(jié)合Vert.x的Event Bus Bridge,將服務(wù)器端的Event Bus延伸到客戶端,實(shí)現(xiàn)服務(wù)器端和客戶端的實(shí)時(shí)數(shù)據(jù)通訊,客戶端可以發(fā)送事件調(diào)用服務(wù)器端的 Verticle,也可以定義事件接收處理回調(diào)函數(shù)接收服務(wù)器發(fā)送的事件和數(shù)據(jù),實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)的查詢顯示。并且這種數(shù)據(jù)傳輸是服務(wù)器推送實(shí)現(xiàn)的,不需要客戶端進(jìn)行HTTP請求,因此實(shí)現(xiàn)了與WebSocket技術(shù)相同的實(shí)時(shí)Web(Real Time Web)功能,由于只傳輸包含數(shù)據(jù)的JSON對象,克服了以往普通HTTP或AJAX請求包含的請求頭和響應(yīng)頭信息,傳輸效率高,響應(yīng)速度快,特別適合各種實(shí)時(shí)性場合,如工業(yè)監(jiān)控,股票行情,鐵路航空訂票等。

客戶端頁面要連接Vert.x服務(wù)器的Event Bus,需要在頁面中引入Event Bus Bridge和SockJ,為管理客戶端元素,引入jQuery框架,引入代碼如下:

客戶端頁面通過 jQuery取得表單元素輸入的數(shù)據(jù),通過Event Bus Bridge連接到服務(wù)器端的Event Bus上,對指定的地址發(fā)送事件即可,服務(wù)器端的業(yè)務(wù)處理Verticle會監(jiān)聽此地址的事件,完成對應(yīng)的業(yè)務(wù)處理,界面的顯示效果如圖2所示:

圖2 增加分院視圖層頁面顯示

2.7 傳輸層的(DTO)實(shí)現(xiàn)

在傳統(tǒng)的Java項(xiàng)目中,需要編程JavaBean實(shí)現(xiàn)各層的數(shù)據(jù)傳遞,在Vert.x中可以直接使用JavaScript的JSON對象完成數(shù)據(jù)的傳輸,而且Vert.x推薦在Event Bus傳輸JSON對象。如下代碼是對分院信息進(jìn)行封裝的JSON對象實(shí)現(xiàn)代碼,顯而易見要比JavaBean簡單得多。

3 總結(jié)

Vert.x天生的大客戶并發(fā)連接請求的的處理能力,以及全新的異步響應(yīng)式工作模式,支持分布式Event Bus,組件調(diào)用完全解耦和,超級簡單的編程能力必將在企業(yè)級應(yīng)用系統(tǒng)中得到廣泛的應(yīng)用。Vert.x全面超越 Node.js性能上絕對優(yōu)勢,而Node.js又極大超越傳統(tǒng)Web框架,如JavaEE,DOT.NET,必將推動Vert.x的飛速發(fā)展,進(jìn)而引起Web領(lǐng)域顛覆性的革命,極有可能徹底淘汰以AJAX為主的web2.0客戶端技術(shù),以及傳統(tǒng)的服務(wù)器框架,引領(lǐng)新的 Web應(yīng)用開發(fā)模式。

[1] Tero Parviainen. Real-time Web Application Development using Vert.x 2.0 [M]. BIRMINGHAM -MUMBAI:Packt Publishing,2013.

[2] Vert.x官方網(wǎng)址 [EB/OL].http://vertx.io/.

[3] 呂海東,張坤著.JavaEE企業(yè)級應(yīng)用開發(fā)實(shí)例教程[M].北京:清華大學(xué)大學(xué)出版社,2009.

[4] Enterprise messaging and integration with Vert.x [EB/OL]http://www.javaworld.com/article/2078838/mobile-java/o pen-source-java-projects-vert-x.html/.

[5] Simone Scarduzio. Instant Vert.x [M]. BIRMINGHAM -MUMBAI: Packt Publishing,2013.

[6] Vert.x mysql官方網(wǎng)址 [EB/OL]. https://github.com/ver t-x/mod-mysql-postgresql.

主站蜘蛛池模板: 大学生久久香蕉国产线观看| 97国产在线视频| 免费国产在线精品一区| 国产丝袜一区二区三区视频免下载| 激情网址在线观看| 亚洲一道AV无码午夜福利| 老司国产精品视频| 免费在线色| 国产理论一区| 免费又爽又刺激高潮网址 | 青青国产视频| 99人妻碰碰碰久久久久禁片| 孕妇高潮太爽了在线观看免费| 在线观看av永久| 国产精品无码作爱| 人妻无码中文字幕第一区| 亚洲V日韩V无码一区二区| 色综合狠狠操| 九九九久久国产精品| 午夜爽爽视频| 欧美全免费aaaaaa特黄在线| 青青草欧美| 亚洲中文字幕日产无码2021| 亚洲成人在线网| 亚洲精品视频免费看| 天堂在线亚洲| 亚洲无码37.| 欧美α片免费观看| 成人午夜视频免费看欧美| 色网站在线视频| 国产精品理论片| 凹凸精品免费精品视频| 国产乱人伦AV在线A| 成年免费在线观看| 国产又爽又黄无遮挡免费观看| 99热这里只有精品5| 欧美三级日韩三级| 中文字幕va| 国产极品美女在线| 片在线无码观看| 欧美激情视频一区| 制服丝袜一区| 亚洲一区免费看| 日本欧美在线观看| 都市激情亚洲综合久久| 久久综合丝袜日本网| 国产成人精品亚洲日本对白优播| 国产网友愉拍精品视频| 99国产精品一区二区| 亚洲黄色网站视频| 亚洲精品在线影院| 免费高清a毛片| 中国丰满人妻无码束缚啪啪| 国产精品3p视频| 亚洲视频四区| 园内精品自拍视频在线播放| 亚洲日韩日本中文在线| 国产欧美视频在线观看| 亚洲AⅤ永久无码精品毛片| 手机永久AV在线播放| 国产在线视频自拍| 色综合婷婷| 成人av专区精品无码国产| 欧美天堂久久| 5555国产在线观看| 国产高清不卡| 精品一区二区久久久久网站| 国产在线自乱拍播放| 久久久久国产精品嫩草影院| 欧美日在线观看| 一级毛片免费高清视频| 97久久精品人人做人人爽| 久久男人资源站| 一级毛片在线播放| 国产自视频| 日韩天堂视频| 国产欧美日韩va另类在线播放| 国产大全韩国亚洲一区二区三区| 国产白浆一区二区三区视频在线| 在线视频精品一区| 亚洲AV无码久久精品色欲| 青青草国产精品久久久久|