摘要:二來,給大家新開坑的項(xiàng)目一個(gè)參考。因此,本系列以主要以官方文檔為基礎(chǔ),將盡可能多的特性融入本項(xiàng)目,并標(biāo)注官網(wǎng)原文出處,有興趣的小伙伴可點(diǎn)擊深入了解。可以通過一些特殊協(xié)議例如將消息作為統(tǒng)一消息服務(wù)導(dǎo)出。下載完成后自行修改和。
開坑前言
我給這個(gè)專欄的名氣取名叫做小項(xiàng)目,聽名字就知道,這個(gè)專題最終的目的是帶領(lǐng)大家完成一個(gè)項(xiàng)目。為什么要開這么大一個(gè)坑呢,一來,雖然網(wǎng)上講IT知識(shí)點(diǎn)的書籍鋪天蓋地,但是國(guó)內(nèi)帶領(lǐng)大家實(shí)戰(zhàn)的書籍少之又少,亦或是軟件版本陳舊,導(dǎo)致很多人知識(shí)點(diǎn)說的頭頭是道,但是一旦遇到工程問題就涼涼了。因此以項(xiàng)目為例一步一步帶領(lǐng)萌新通往工程師之路。二來,給大家新開坑的項(xiàng)目一個(gè)參考。
專題概覽本專題將以搭建一個(gè)簡(jiǎn)單博客系統(tǒng)為例,最終實(shí)現(xiàn)一個(gè)前后端分離的web網(wǎng)站和一個(gè)hybird APP。
使用的技術(shù):
vert.x 搭建博客后臺(tái)API
react 搭建博客web UI
react native 搭建手機(jī)端
正文我很喜歡vert.x的設(shè)計(jì)理念,它充分體現(xiàn)了面向未來編程的思想,無論是水平擴(kuò)展還是垂直擴(kuò)展都非常的方便,java 8 的語(yǔ)法糖吃起來也是非常的甜。只可惜中文資料甚少,且質(zhì)量度不高,導(dǎo)致普及很成問題。其實(shí)vert.x是個(gè)非常先進(jìn)的工具集,實(shí)用但不臃腫,你可以自由組合你需要的組件,不像spring那樣強(qiáng)制要求你了解那么多配置選項(xiàng)。學(xué)習(xí)一個(gè)框架,如果英文水平過硬,最好的方式開始去看框架官網(wǎng)的文檔,非常幸運(yùn)的是,vert.x的官網(wǎng)寫的非常詳細(xì),對(duì)于框架自身的功能點(diǎn)講的非常清楚。那這個(gè)系列就是官網(wǎng)文檔的翻譯嗎?不是的。一般官方文檔只會(huì)講解框架本身的東西,對(duì)于如何工程化,如何組織項(xiàng)目結(jié)構(gòu)這一塊是沒有的。因此,本系列以主要以官方文檔為基礎(chǔ),將盡可能多的特性融入本項(xiàng)目,并標(biāo)注官網(wǎng)原文出處,有興趣的小伙伴可點(diǎn)擊深入了解。
什么是 vert.xvert.x是一個(gè)運(yùn)行于JVM平臺(tái)的工具集,它的理念很像node,特點(diǎn)是事件驅(qū)動(dòng),非阻塞。這套工具集包含了許多優(yōu)秀的工具包,例如core工具包用來提供異步編程、verticle實(shí)例部署等基礎(chǔ)功能,web工具包提供路由功能和中間件支持,風(fēng)格很像koa框架。當(dāng)然最終最核心的肯定是下面要講的core工具包了。
Core 工具包核心理念Verticle 實(shí)例
Verticle 之間用來通信的Event Bus通信通道
宏觀上來講,vert.x core 在jvm上首先建立了一個(gè) vert.x 運(yùn)行容器,其中運(yùn)行在容器里的每個(gè)程序模塊叫做verticle ,很直觀的,聽名字就知道每個(gè)模塊單元的實(shí)例都是垂直部署互不干擾。因此,每個(gè)verticle可以被部署多次,如果一個(gè)verticle中起了web server并且被部署了多次,那么請(qǐng)求將會(huì)以輪詢調(diào)度法被分發(fā)到不同實(shí)例中。每個(gè)verticle都有自己的生命周期方法start和stop,在verticle中,你也可以創(chuàng)建部署子verticle實(shí)例。
我們把視線聚焦verticle內(nèi)部,來看看它到底是如何實(shí)現(xiàn)的異步io。
當(dāng)消息被發(fā)送給verticle實(shí)例的時(shí)候,消息首先被放入Event Loop中,然后按消息到達(dá)的順序被依次處理,可以看出,這是一個(gè)單線程阻塞式的實(shí)現(xiàn),一旦處理一條消息時(shí)阻塞了當(dāng)前線程,后續(xù)消息則無法被實(shí)時(shí)處理,那這可怎么辦呢?不要急,如果處理消息的操作是個(gè)阻塞式的操作,那么可以調(diào)用vert.x的實(shí)例方法將操作分發(fā)到工作線程去處理。
verticle之間通過Event Bus通信,假設(shè)一個(gè)后端應(yīng)用我們把應(yīng)用層和持久層分為兩個(gè) verticle,兩個(gè)實(shí)例通過Event Bus通信,當(dāng)應(yīng)用層想要查詢一條數(shù)據(jù)時(shí),應(yīng)用層通過Event Bus發(fā)送一條消息給持久層要求持久層向數(shù)據(jù)庫(kù)查詢并返回響應(yīng)。消息的格式技術(shù)上可以很隨意,但是考慮到通用型工程上一般采用JSON。
我們把消息分成3種形式:
點(diǎn)對(duì)點(diǎn)消息
請(qǐng)求-回復(fù)型消息
發(fā)布-訂閱消息
神奇的是,有了Event Bus,我們能給其他vert.x容器中的實(shí)例互傳消息:
當(dāng)網(wǎng)絡(luò)集群功能被開啟時(shí),分布式Event Bus被啟動(dòng),因此消息可在集群內(nèi)共享。
第三方組件可以簡(jiǎn)單的通過TCP協(xié)議加入Event Bus。
Event Bus可以通過一些特殊協(xié)議例如AMQP將消息作為統(tǒng)一消息服務(wù)導(dǎo)出。
SockJS允許瀏覽器環(huán)境連接至Event Bus網(wǎng)絡(luò)。
Hello World!首先,我們需要新建一個(gè)工程,vert.x官網(wǎng)上雖然為大家準(zhǔn)備了一個(gè)starter,但是不推薦使用,理由是生成的版本太陳舊,我在寫文章的時(shí)候starter頁(yè)面還處于521錯(cuò)誤狀態(tài)。官方的github主頁(yè)其實(shí)是準(zhǔn)備了starter工程的,習(xí)慣用maven的同學(xué)點(diǎn)這里,用gradle的同學(xué)點(diǎn)這里,我個(gè)人比較喜歡使用gradle。下載完成后自行修改GroupID和ArtifactID。
這里我使用IDEA 社區(qū)版導(dǎo)入項(xiàng)目,勾選 Use auto-import 和 Use default gradle wrapper 選項(xiàng),注意,jdk版本一定要兼容JAVA 8。
我們打開唯一的一個(gè)java文件MainVerticle.java。
package io.vertx.starter; import io.vertx.core.AbstractVerticle; public class MainVerticle extends AbstractVerticle { @Override public void start() { vertx.createHttpServer() .requestHandler(req -> req.response().end("Hello Vert.x!")) .listen(8080); } }
我們?cè)谛陆ㄗ约旱?b>verticle的時(shí)候,需要繼承AbstractVerticle類,這樣我們就可以直接使用vertx實(shí)例,創(chuàng)建服務(wù)器監(jiān)聽并傳入回調(diào)函數(shù)。這樣一個(gè)最簡(jiǎn)單的web server就搭好啦。
打開命令行,在命令行執(zhí)行
gradlew run
可以啟動(dòng)該服務(wù)器,命令行輸出Succeeded in deploying verticle表示啟動(dòng)成功,我們?cè)L問http://localhost:8080, 成功顯示"Hello Vert.x!"。
執(zhí)行
gradlew shadowJar
則會(huì)調(diào)用gradle打包任務(wù),最終在./build目錄下得到一個(gè)fat-jar。
為什么呢,明明沒有main函數(shù)啊,我們打開build.gradle文件,有如下關(guān)鍵代碼:
mainClassName = "io.vertx.core.Launcher" def vertxVersion = "3.5.1" def mainVerticleName = "io.vertx.starter.MainVerticle" def watchForChange = "src/**/*" def doOnChange = "./gradlew classes" shadowJar { classifier = "fat" manifest { attributes "Main-Verticle": mainVerticleName } mergeServiceFiles { include "META-INF/services/io.vertx.core.spi.VerticleFactory" } } run { args = ["run", mainVerticleName, "--redeploy=$watchForChange", "--launcher-class=$mainClassName", "--on-redeploy=$doOnChange"] }
可以看到,真正的launcher class其實(shí)是io.vertx.core.Launcher,啟動(dòng)類會(huì)自動(dòng)部署我們的MainVerticle。
你可能好奇啟動(dòng)參數(shù)中這個(gè)--redeploy參數(shù),是的,vert.x具有自動(dòng)重新部署功能,我們將MainVerticle.class中的文本替換為"Hello World!",然后重新編譯。
package io.vertx.starter; import io.vertx.core.AbstractVerticle; public class MainVerticle extends AbstractVerticle { @Override public void start() { vertx.createHttpServer() .requestHandler(req -> req.response().end("Hello World!")) .listen(8080); } }
右鍵,重新編譯文件。
正確的輸出如下
刷新瀏覽器,可以看到文本發(fā)生了變化。
需要注意的是,如果使用的是Windows系統(tǒng),自動(dòng)部署往往是不成功的,原因是在build.gradle中,文件發(fā)生改變的hook函數(shù)是這么寫的
def doOnChange = "./gradlew classes"
我們將其改成Windows格式
def doOnChange = "gradlew classes"
大功告成。
未完待續(xù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/76362.html
摘要:扯遠(yuǎn)了,是統(tǒng)一數(shù)據(jù)訪問層的實(shí)現(xiàn),主要是針對(duì)數(shù)據(jù)的操作,所以,不僅僅是用在中,在中所有應(yīng)用中,需要訪問數(shù)據(jù)庫(kù)的都是通過來進(jìn)行的并且提供了異步和同步兩種接口主要實(shí)現(xiàn)了兩種模式的數(shù)據(jù)訪問,和。 CloudData是什么? 任何一個(gè)App都需要一個(gè)Server,我們認(rèn)為,移動(dòng)開發(fā)者(或組織)不應(yīng)該把精力放在這些事情上面: 搭建后端Server服務(wù)。 編寫后端Server代碼。 設(shè)計(jì)Serve...
摘要:定時(shí)器例子之前通過調(diào)用定時(shí)器,需要傳一個(gè)回調(diào),然后所有的代碼邏輯都包在里面。這里定時(shí)器會(huì)阻塞在這一行,直到一秒后才會(huì)執(zhí)行下面的一行。 之前介紹過quasar,如果你希望在vert.x項(xiàng)目里使用coroutine的話,建議使用vertx-sync。本篇將介紹vertx-sync。 showImg(/img/bVzIsu); 本來打算另起一篇,寫其他方面的東西,但是最近比較忙,就先寫一篇實(shí)...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫在前面這里前后端指的是開發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫在前面:這里前后端指的是web開發(fā)的前后端。1、前端崗位需...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫在前面這里前后端指的是開發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫在前面:這里前后端指的是web開發(fā)的前后端。1、前端崗位需...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫在前面這里前后端指的是開發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫在前面:這里前后端指的是web開發(fā)的前后端。1、前端崗位需...
閱讀 1060·2021-11-15 18:06
閱讀 2416·2021-10-08 10:04
閱讀 2715·2019-08-28 18:03
閱讀 957·2019-08-26 13:42
閱讀 1983·2019-08-26 11:31
閱讀 2490·2019-08-23 17:13
閱讀 989·2019-08-23 16:45
閱讀 2139·2019-08-23 14:11