Vert.x Guide 重構wiki demo verticles 譯<四>

TIP:java

這部分相應的代碼在step-2文件夾中(https://github.com/vert-x3/vertx-guide-for-java-devs)git

在前面的章節咱們可運行的wiki應用,然而,它的實現有如下幾個問題:github

    1.HTTP請求處理和數據庫訪問代碼交錯寫在同一個方法裏。數據庫

    2.許多配置信息(端口信息,JDBC driver)都硬編碼的寫在代碼裏。服務器

架構與技術選型:微信

在這章主要事重構代碼,使verticles獨立,可複用:架構

咱們將部署2個verticles處理HTTP請求,和一個verticles封裝數據庫持久層。這兩個verticles並非直接互聯,而是在event bus約定名稱和消息格式,這提供了一個簡單而有效的解耦。負載均衡

傳遞給event bus的消息格式化爲JSON的形式,而Vert.X支持靈活的序列化方案,符合event bus的要求或很是具體的contexts。使用JSON格式是一個明智的選擇,另外一個優點它是一種語言無關的文本格式,能夠很理想的用不一樣語言實現來傳遞信息。框架

HTTP服務verticle異步

    1.咱們定義常數verticle配置參數:HTTP端口號和定義在event bus中的name,用來能夠和數據庫verticle傳遞信息。

    2.AbstractVerticle#config()容許訪問verticle提供的配置,第二個參數是一個默認值,不用提特殊的配置。

    3.配置值不能是字符串對象,能夠是整數,布爾值,複雜的JSON數據。

類的其他部分大可能是一個HTTP代碼提取,與之前的相比,數據庫代碼被event bus的消息代替。這裏是indexhandler編碼方法:

    1.vertx實例提供了鏈接event bus的方法,咱們能夠發送一個消息到database vertice隊列。

    2.Delivery選項容許咱們定義 headers, payload編碼和超時。

    3.成功會返回一個有效數據。

如你所看的,event bus消息包含一個消息體,還有就是消息會期待一個回覆。在事件沒有迴應的時候,這裏就沒有一個handler去處理了。

咱們把payloads編碼成JSON對象,咱們指定database verticle經過消息的header處理叫作action。

router handlers的其他代碼能夠看到event-bus拉取和存儲數據:   

database verticle

使用是JDBC鏈接數據庫,須要驅動和配置信息,在前面是硬編碼的。

配置SQL

改變以前在代碼中硬編碼的SQL語句,咱們能夠把這個語句放到一個配置文件中。

查詢的時候能夠從配置文件中加載,若是什麼都沒有提供則獲取一個默認的資源,這樣作的前瞻性是咱們可使用這個verticle加載不一樣的驅動和不一樣的SQL語法。

原來的verticle類包含須要定義的配置字段:

SQL查詢能夠放到一個配置文件,默認咱們放一個HSQLDB的

下面的WikiDatabaseVerticle代碼加載SQL語句,並放到一個map中

咱們使用SqlQuery枚舉來代替後面的string常量,下面是verticle的start方法實現:

    1.這裏,咱們打破了Vert.x避免阻塞APIs的重要原則,可是這也沒有異步的APIs用來訪問路徑下面的資源,選擇是有限的。咱們可使用executeBlocking方法將阻塞的I/O操做從even loop中喚醒爲工做線程,可是由於數據比較小,因此看不錯明顯的差別。

    2.這是一個使用SQL查詢的例子。

    3.consumer方法註冊一個event bus 目的地handler

Dispatching requests

event bus message handler 是下面的onMessage方法:

咱們定義了一個ErrorCodes枚舉來處理錯誤,用來返回給message sender。再者,Message中的fail方法提供一個簡短的error描述,最初的message sender能夠獲取一個異步的AsyncResult的失敗信息。

減小JDBC客戶端樣板代碼

到目前爲止,咱們已經看到了完整的交互來執行SQL查詢:

    1.獲取鏈接

    2.執行請求

    3.釋放鏈接

這致使了代碼中,須要須要爲每個異步操做發生錯誤處理,以下:

從Vert.x 3.5.0開始,JDBC客戶端如今支持獲取鏈接執行一次SQL操做,而後內部釋放,下面咱們能夠簡短代碼:

這樣對於一個鏈接執行單一的操做是頗有用的,從性能的角度考慮,複用鏈接執行一連串的SQL操做是明智的。

剩下的代碼包含一個私有方法onMessage,用來處理傳入的消息:

從main verticle部署verticles

咱們有一個MainVerticle方法,但不是包含全部的業務邏輯在初始迭代,它的惟一目的是啓動應用和部署其餘verticles。

其中的代碼包含部署一個WikiDatabaseVerticle和兩個HttpServerVerticle實例:

    1.部署一個verticle是一個異步的操做,因此咱們須要一個Future,當部署成功的時候,其中的String會返回一個惟一標識。

    2.一種選擇是建立一個verticle實例,而後把它傳遞給deploy方法,completer會返回一個handler。

    3.序列的組成容許一個個一次執行異步操做,當初始化的future成功返回,啓動回調函數。

    4.咱們也能夠經過類名,來部署verticle,對於其餘依賴JVM的語言,也能夠經過module/script的名稱來部署。

    5.DeploymentOption類容許定義實例的個數。

    6.返回一個Future,它的完成將觸發一系列的操做完成。

    7.咱們定義一個handler最終來執行MainVerticle啓動future。

聰明的讀者可能想知道咱們如何部署代碼的HTTP服務器在同一個TCP端口的兩次,缺沒有拋出錯誤,由於既然這個TCP端口已經在使用,許多其餘的框架須要選擇其餘端口號,有一個HTTP代理端口之間實現負載均衡,而使用Vert.x可讓不一樣的verticles共享相同的TCP端口號,新來的鏈接會以循環的方式分發給接受線程。

 

原文連接:http://vertx.io/docs/guide-for-java-devs/

個人微信公衆號:

相關文章
相關標籤/搜索