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