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