摘要:而不是開始,將服務(wù)使用多線程的請求重量級的容器。是啟動多個輕便單線程的服務(wù)器和流量路由到他們。亮點應(yīng)用程序是事件驅(qū)動,異步和單線程的。通過使用事件總線傳遞消息通信。為了建立一個消息系統(tǒng),則需要獲得該事件總線。
摘要
如果你對Node.js感興趣,Vert.x可能是你的下一個大事件:一個建立在JVM上一個類似的架構(gòu)企業(yè)制度。 這一部分介紹Vert.x是通過兩個動手的例子(基于Vert.x 2.0)。
當Node.js出現(xiàn),許多開發(fā)者興奮的感到可以用不尋常的方法來構(gòu)建可擴展的服務(wù)器端應(yīng)用程序。 而不是開始,將服務(wù)使用多線程的請求重量級的容器。Node.js是啟動多個輕便單線程的服務(wù)器和流量路由到他們。?
現(xiàn)在,類似的框架已經(jīng)出現(xiàn),它的服務(wù)器部署在一個JVM中,使用JVM設(shè)施來管理流量輕量級服務(wù)器進程。 本批中的開源Java項目 ,您將了解Vert.x,事件驅(qū)動的架構(gòu)類似的Node.js,是建立在JVM系列還擴展它在某些重要的新途徑。
Vert.x應(yīng)用程序是事件驅(qū)動,異步和單線程的。 Vert.x過程通過事件總線,這是Vert.x的事件驅(qū)動架構(gòu)的內(nèi)置一塊通信。 結(jié)合異步處理,單線程組件和事件總線產(chǎn)生高度的可擴展性,并編寫單線程應(yīng)用對習慣于多線程并發(fā)Java的人來說是一種解脫。 可以說,Vert.x的最好的部分是其模塊化的基于JVM的架構(gòu)。 Vert.x應(yīng)用程序可以運行在幾乎所有的操作系統(tǒng),并且可以使用任何支持的JVM兼容的編程語言來編寫。 一個Vert.x應(yīng)用可完全在單一語言編寫,也可以是用不同的編程語言模塊的跨界混搭。 Vert.x模塊集成了Vert.x事件總線上。
在Vert.x基于事件的編程Vert.x的基于事件的編程模型的標準和獨特的功能組合。 Vert.x應(yīng)用在很大程度上是通過定義事件處理程序。 不同于傳統(tǒng)的基于事件的應(yīng)用程序,但是,Vert.x應(yīng)用保證不被阻塞。 而不是打開一個socket到服務(wù)器,請求資源,然后等待(阻塞)的響應(yīng),Vert.x發(fā)送到應(yīng)用程序異步地響應(yīng),通過事件處理程序,并通過事件總線傳遞消息寫入。
Vert.x的編程框架包括一些白話,這將有助于更好的了解,通過兩個演示應(yīng)用程序在本文的后面:
一個verticle是部署在Vert.x.單位 每個verticle包含啟動它的主要手段。 一個應(yīng)用程序可以是單個verticle或者可以由與彼此經(jīng)由事件總線通信的多個verticles的。
Verticles在Vert.x實例中運行。 每個Vert.x實例在其自己的JVM實例運行,并且可以承載多個verticles。 一個Vert.x實例確保verticles彼此通過運行每個在其自己的類加載器分離,所以沒有修改一個靜態(tài)變量是另一個實例的風險。 主機可以運行一個單一的Vert.x實例或多個的。
一個Vert.x實例,保證每個verticle實例總是在同一個線程執(zhí)行。 并發(fā)Vert.x 是單線程的。
在內(nèi)部,Vert.x實例維護一組線程(通常為CPU核心數(shù))是在執(zhí)行一個事件循環(huán) :檢查,看看是否有工作要做,做到這一點,去睡覺。
Verticles通過使用事件總線傳遞消息通信。
雖然你可能會認為,共享數(shù)據(jù)和可擴展性截然相反。 Vert.x提供了一個共享的MAP和跨在同一Vert.x實例中運行verticles傳遞不可改變的數(shù)據(jù)共享一套設(shè)施,這時候數(shù)據(jù)是可變的唯一真正的 。
Vert.x使用相對較少的線程來創(chuàng)建一個事件循環(huán)和執(zhí)行verticles。 但在某些情況下,需要verticle做一些要么昂貴計算,或可能阻塞,如連接到數(shù)據(jù)庫。 當發(fā)生這種情況Vert.x可以讓你標記verticle實例作為worker verticle 。Vert.x確保worker verticles將永遠不會被同時執(zhí)行,所以要他們保持在最低水平,但他們在那里幫助你,當你需要他們,在這種情況下,將由后臺執(zhí)行的線程池執(zhí)行。
圖1示出Vert.x系統(tǒng)包括Vert.x實例,verticles,JVM中,服務(wù)器主機,以及事件總線的體系結(jié)構(gòu)。
圖1. Vert.x系統(tǒng)的體系結(jié)構(gòu)
Vert.x核心服務(wù)和模塊
Vert.x功能可以分為兩類:核心服務(wù)和模塊核心服務(wù)是可從verticle直接調(diào)用并包括用于TCP / SSL,HTTP和網(wǎng)絡(luò)套接字的客戶端和服務(wù)器上的服務(wù)。 服務(wù)來訪問Vert.x事件總線; 定時器,緩沖區(qū),流量控制,文件系統(tǒng)訪問,共享maps 和 sets,訪問配置,SockJS服務(wù)器,以及部署和取消部署verticles。 核心服務(wù)是相當靜態(tài)的,預(yù)計不會改變,因此所有其他的功能由模塊提供。
Vert.x應(yīng)用和資源可以很容易地打包成模塊,并通過Vert.x共享的公共模塊庫 。 與模塊的交互是通過Vert.x事件總線異步:用JSON發(fā)送模塊的消息,你的申請將得到答復。 模塊和集成通過服務(wù)總線之間的這種脫鉤意味著模塊可以在任何支持的語言編寫和其它任何支持的語言使用。 所以,如果有人寫在Ruby中,你想在你的Java應(yīng)用程序使用這個模塊,是完全可以的!
編寫一個基于Java的Vert.x Web服務(wù)器一個基本的Web服務(wù)器應(yīng)用程序和消息傳遞系統(tǒng)。 首先下載vert.x 寫這篇文章的是2.0.0.final。 當?shù)亟忾_并添加它的bin文件夾到你的PATH 。 請注意,您需要安裝Java 7,如果你還沒有。
如果你是一個Maven的人跟我一樣,那么你可以簡單以下的依賴添加到您的POM文件:
清單1. Maven的POM對Vert.x
io.vertx vertx-core 2.0.0-final io.vertx vertx-platform 2.0.0-final
清單2顯示了Server.java文件內(nèi)容
清單2. Server.java
package com.geekcap.vertxexamples; import org.vertx.java.core.Handler; import org.vertx.java.core.http.HttpServerRequest; import org.vertx.java.deploy.Verticle; public class Server extends Verticle { public void start() { vertx.createHttpServer().requestHandler(new Handler() { public void handle(HttpServerRequest req) { String file = req.path().equals("/") ? "index.html" : req.path(); req.response.sendFile("webroot/" + file); } }).listen(8080); } }
前幾行清單2導入所需的Vert.x類:
Handler是所有處理器的基類!
HttpServerRequest代表Vert.x.服務(wù)器端的HTTP請求 這個類的一個實例將為由服務(wù)器處理的每個請求創(chuàng)建,然后傳遞到通過您的應(yīng)用程序Handler實例(你會使用已注冊HttpServer )。
Verticle是在Vert.x應(yīng)用程序部署的基本單位。 為了使用Vert.x,你需要擴展Verticle類和重寫start()方法,這你的Verticle 入口點。
注意vertx清單2中的變量: 該Verticle類定義vertx作為受保護的成員變量(繼承Verticle),它提供了訪問Vert.x運行。 該vertx變量的類型的Vertx,這暴露了以下方法:
createHttpClient()創(chuàng)建一個HTTP / HTTPS客戶端
createHttpServer()創(chuàng)建一個HTTP / HTTPS服務(wù)器
createNetClient()創(chuàng)建了一個TCP / SSL客戶端
createNetServer()創(chuàng)建了一個TCP / SSL服務(wù)器
creatSockJSServer()創(chuàng)建一個包裝了HTTP服務(wù)器SockJS服務(wù)器
eventBus()提供事件總線您的應(yīng)用程序訪問
fileSystem()提供對文件系統(tǒng)的應(yīng)用程序訪問
sharedData()提供應(yīng)用程序訪問共享數(shù)據(jù)對象,它可以被用來共享Verticles之間的數(shù)據(jù)
清單2中的代碼創(chuàng)建一個新的HTTP服務(wù)器,檢索其請求處理程序的參考,并將請求處理程序到新創(chuàng)建的HttpServerRequest處理程序。 該Handle接口定義了一個方法命名handler()并使用泛型定義實例傳遞給它的類定義的類型; 在這種情況下HttpServerRequest 。 該HttpServerRequest然后定義以下字段:
method 是一個String包含給定請求的方法中,如GET , POST , PUT , DELETE ,等等。
path 是一個String包含所請求的路徑,如/index.html 。
query 是一個String包含查詢參數(shù),如遵循以下問號部分: ?key=value 。
response 是一個基準HttpServerResponse表示對HTTP請求的響應(yīng)。
uri 為請求的完整URI。
清單2完成對通過映射一個空的請求- “ / ” -到index.html ,然后調(diào)用HttpServerResponse的sendFile()方法來告訴Vert.x流指定的文件返回給調(diào)用者。
綜上所述, Server級訪問Vert.x運行時,要求它創(chuàng)建一個新的HTTP服務(wù)器,并注冊一個Handler (即期望一個HttpServerRequest變量)的HttpServer 。 在處理器的handle()方法時, Server類從位于文件系統(tǒng)提供文件服務(wù)webroot目錄,這是相對的。
構(gòu)建web服務(wù)器讓我們來構(gòu)建示例應(yīng)用程序,那么我們將使用Vert.x執(zhí)行它。 此項目的Maven的POM文件顯示清單3所示。
清單3. Maven的POM構(gòu)建Web服務(wù)器
4.0.0 com.geekcap vertx-examples 1.0-SNAPSHOT jar vertx-examples http://maven.apache.org UTF-8 org.apache.maven.plugins maven-compiler-plugin 2.0.2 1.6 io.vertx vertx-core 2.0.0-final io.vertx vertx-platform 2.0.0-final junit junit 4.11 test
兩個依賴添加到POM文件是vertx-code和vertx-platform的,這是需要開發(fā)的Java應(yīng)用程序Vert.x。要構(gòu)建這個應(yīng)用程序,請執(zhí)行以下Maven命令:
mvn clean install
這將產(chǎn)生一個名為vertx-examples-1.0-SNAPSHOT.jar,將需要在你的CLASSPATH,以啟動您的verticle。這個示例應(yīng)用程序提供了在發(fā)現(xiàn)網(wǎng)絡(luò)資源Web根目錄相對于該應(yīng)用程序的啟動目錄。因此,你需要創(chuàng)建一個webroot的目錄,并建立一些資源從它服務(wù)。要啟動這個verticle,執(zhí)行vertx在Vert.x的應(yīng)用bin目錄,如下所示:
$VERTX_HOME/bin/vertx run com.geekcap.vertxexamples.Server -cp vertx-exampl
該vertx命令接受幾個選項,包括我們使用它的人,運行。這是一個擴展類的只是名字Verticle和包含的start()方法和一個可選的參數(shù)集。在這種情況下,我們設(shè)置CLASSPATH使用-cp參數(shù),并傳入JAR,我們剛剛創(chuàng)建的文件。服務(wù)器將啟動,但不輸出任何內(nèi)容到屏幕上,但你可以將瀏覽器指向的網(wǎng)址:HTTP://localhost:8080。
對于我的例子中,我創(chuàng)建了一個簡單的HTML文件,該文件說:“Hello, Vert.x”,將其命名為index.html的,并把它放在我的根目錄的目錄。這里是我的輸出:
$ curl http://localhost:8080
與Vert.x通信Hello, Vert.x Hello, Vert.x
Vert.x的最重要的特點之一是它的事件總線。所述Vert.x事件總線允許verticles,可能用不同的編程語言,在使用任意點對點通信彼此通信或發(fā)布/訂閱消息。在本節(jié)中,你會得到怎樣的功能使用這兩種方法的不同verticles整合的感覺。
在我們開始之前,你為什么要使用消息在一個更傳統(tǒng)的基于事件的編程模型?一方面,消息支持的用不同的編程語言應(yīng)用程序和組件的集成。這也使松散耦合,這意味著您可以編寫代碼的多個任務(wù)為中心的作品,而不是單一的,復雜的程序。最后,verticles之間的異步通信提高了系統(tǒng)的可擴展性。異步通信允許您定義系統(tǒng)的容量,因為它的發(fā)展。消息可能備份您的系統(tǒng)負荷增加,但他們最終會被處理。Vert.x對分布式事件總線的支持也給了你啟動額外verticles以處理增加的負載的選項。
為了建立一個Vert.x消息系統(tǒng),則需要獲得該事件總線。通過執(zhí)行啟動eventBus()上的方法vertx類的實例:
EventBus eb = vertx.eventBus();
一旦你連接到EventBus您可以通過以下兩種方式之一發(fā)布消息:
publish()發(fā)布一個消息給使用地址發(fā)布/訂閱消息,這意味著每subscriber到給定的地址將接收發(fā)布的消息。地址只是一個String,所以你要選擇有意義的事,但在什么時候是這兩個出版商和用戶配置為使用相同的字符串。如果你熟悉Java消息系統(tǒng)(JMS),publish()起同樣地作用,發(fā)布消息到一個topic。
send()發(fā)送消息到使用地址點對點的消息,這意味著只有一個訂戶將接收該消息。如果有多個用戶的地址,然后Vert.x將使用循環(huán)算法發(fā)送消息。使用循環(huán)算法的優(yōu)點是可擴展性:如果你沒有足夠的資源在一個Vert.x實例來支持你的負擔,那么你可以簡單地啟動其他Vert.x實例,并登記他們作為聽眾指定的地址。
發(fā)布/訂閱VS點對點通信在發(fā)布/訂閱消息模型中,發(fā)布者將消息發(fā)送到被廣播到所有用戶的一個話題。使用發(fā)布/事件驅(qū)動的架構(gòu)訂閱了點至點的消息意味著組件只對所發(fā)生事件的發(fā)布負責。發(fā)布商并不需要知道它的訂閱者,以便廣播到它們。圖2是一個典型的Vert.x的流程圖發(fā)布/訂閱消息架構(gòu)。
圖2.發(fā)布/訂閱消息
在點 - 點通信,將消息從發(fā)布者直接通過一個隊列發(fā)送給消費者。點對點的消息是一個很好的選擇,當你想消息消耗正好一次時,或者當兩個組件要異步地相互通信。點 - 點消息架構(gòu)顯示在圖3。
圖3.點對點通信
我們將使用Vert.x在下面的章節(jié)探討兩個郵件系統(tǒng)。
發(fā)布/訂閱消息的例子清單4更新我原來的服務(wù)器類(清單1)在幾個方面。首先,它部署了一個所謂的新verticle AuditVerticle通過調(diào)用(如清單5中定義)deployVerticle()的方法容器實例,其被定義為母體的一部分Verticle類,提供了通向容器verticle中運行;因此,它是部署新verticles適當?shù)奈恢谩?/p>
清單4. Server.java 點至點消息
package com.geekcap.vertxexamples; import org.vertx.java.core.Handler; import org.vertx.java.core.eventbus.EventBus; import org.vertx.java.core.http.HttpServerRequest; import org.vertx.java.core.logging.Logger; import org.vertx.java.platform.Verticle; public class Server extends Verticle { public void start() { // Create our dependent verticles container.deployVerticle("com.geekcap.vertxexamples.AuditVerticle"); // Create an HTTP Server that serves files vertx.createHttpServer().requestHandler(new Handler() { public void handle(HttpServerRequest req) { Logger logger = container.logger(); if (logger.isDebugEnabled()) { logger.debug("Received a request for resource: " + req.path()); } logger.fatal("Where are my logs!?!?"); logger.info("Here is an info message"); // Serve up our files String file = req.path().equals("/") ? "index.html" : req.path(); req.response().sendFile("webroot/" + file); // Let"s tell the world (via the event bus) that we received a request EventBus eb = vertx.eventBus(); eb.publish( "com.geekcap.vertxexamples.Server.announcements", "We received a request for resource: " + req.path() ); } }).listen(8080); } }
清單4執(zhí)行deployVerticle()來部署AuditVerticle。所述deployVerticle()方法部署一個標準Verticle到容器上,它保持它自己的事件循環(huán)。處理傳入的HTTP請求(如清單1所示)之后,清單4將消息發(fā)布到事件總線。第一,它獲得通過接入到事件總線vertx實例變量的話,就執(zhí)行eventBus()方法。一旦有EventBus對象將調(diào)用其發(fā)布方法,這是一個發(fā)布/訂閱的時尚門戶發(fā)布的消息。
消息松耦合在過去的三年里,我以事件驅(qū)動的架構(gòu)工作過,而且我發(fā)現(xiàn),發(fā)布/訂閱消息,有時也被稱為topic,是一個偉大的方式,以松散耦合的系統(tǒng)。信息發(fā)布者不需要知道他們的用戶,所以新用戶可以在任何時候加入不影響發(fā)行人。
清單5顯示了源代碼AuditVerticle類。
清單5. AuditVerticle.java
package com.geekcap.vertxexamples; import org.vertx.java.core.Handler; import org.vertx.java.core.eventbus.EventBus; import org.vertx.java.core.eventbus.Message; import org.vertx.java.core.logging.Logger; import org.vertx.java.platform.Verticle; public class AuditVerticle extends Verticle { @Override public void start() { // Let"s register ourselves as a listener to Server notifications EventBus eb = vertx.eventBus(); HandlerauditHandler = new Handler () { @Override public void handle(Message message) { Logger logger = container.logger(); logger.info( "AuditVerticle here, someone requested resource: " + message.body() ); } }; eb.registerHandler( "com.geekcap.vertxexamples.Server.announcements", auditHandler ); } }
該AuditVerticle清單5的行為很像一個報告引擎:它監(jiān)聽來自“announcements” server類,然后寫出來的那些作為信息的日志信息。如果感興趣的東西在發(fā)生服務(wù)器類,它可以將它發(fā)布到其announcements的topic,不同的用戶可以做不同的事情,比如記錄的消息或在Hadoop集群中供以后分析插入。
清單5然后創(chuàng)建一個處理程序在線實例(創(chuàng)建一個匿名內(nèi)部類,并分配給一個變量,而無需創(chuàng)建一個多帶帶的文件中的類)記錄消息。接著,注冊一個處理程序的“com.geekcap.vertxexamples.Server.announcements通過調(diào)用”地址EventBus的registerHandler()方法。現(xiàn)在,在任何時候服務(wù)器類將消息發(fā)布到該目的地,AuditHandler的handle()方法將被調(diào)用。
點 - 點通信實例當要僅由單個消費者或作為機構(gòu)組件相互異步通信進行處理的消息的點至點的消息時使用,也可以。在這一節(jié)中,我通過創(chuàng)建依賴于一個worker verticle做的工作是一個新的類演示了后者,然后該worker verticle通信的結(jié)果返回給服務(wù)器2。
清單6顯示了源代碼Server2類。
清單6. Server2.java
package com.geekcap.vertxexamples; import org.vertx.java.core.Handler; import org.vertx.java.core.eventbus.EventBus; import org.vertx.java.core.eventbus.Message; import org.vertx.java.core.http.HttpServerRequest; import org.vertx.java.core.logging.Logger; import org.vertx.java.deploy.Verticle; import java.util.concurrent.ConcurrentMap; public class Server2 extends Verticle { public void start() { // Create our dependent verticles container.deployWorkerVerticle("com.geekcap.vertxexamples.MyWorkerVerticle"); // Start a server that handles things with point-to-point messaging vertx.createHttpServer().requestHandler(new Handler() { @Override public void handle(final HttpServerRequest req) { // Set a shared variable ConcurrentMap map = vertx.sharedData().getMap("mymap"); map.put("mykey", "myvalue"); // Let"s send a message to a worker verticle and wait for it to respond EventBus eb = vertx.eventBus(); eb.send("request.worker", req.path, new Handler >() { @Override public void handle(Message message) { Logger logger = container.getLogger(); logger.info( "Received a reply from our worker: " + message.body ); req.response.headers().put("Content-Length", Integer.toString(message.body.length())); req.response.write(message.body); } }); } }).listen(8080); } }
該Server2類通過部署一個工人verticle開始。worker verticles是 從在它們不包含事件外表和預(yù)期由事件總線消息來觸發(fā)標準verticles不同。worker verticles由獲得訪問Vert.x部署容器并調(diào)用其deployWorkerVerticle()方法。
接著,Server2獲得訪問EventBus通過調(diào)用,再次eventBus()的方法vertx實例變量。此時的Server2調(diào)用的send()方法,它是通往在點對點方式發(fā)送消息。在這種情況下,將請求發(fā)送路徑到一個命名為“request.worker ”。到的第一個參數(shù)的send()方法是目的地,第二個參數(shù)是數(shù)據(jù)發(fā)送到目的地,和一個可選的第三個參數(shù)是一個處理程序能夠由消息的接收者被回調(diào)。
該MyWorkerVerticle,這是清單7所示,旨在構(gòu)建指定的請求路徑的響應(yīng)和發(fā)送響應(yīng)返回給Server2上的處理程序。該處理程序記錄的響應(yīng),然后寫入該響應(yīng)返回給HttpServerRequest發(fā)起的動作。我們能夠?qū)懟刂癏ttpServerRequest我們需要指定HTTP 內(nèi)容長度的響應(yīng),這是我們返回的字符串只是長度。
另外兩個Vert.x的功能被添加到Server2類:
日志記錄:該容器變量命名的方法getLogger()提供了訪問Vert.x的記錄。此記錄是非常相似的log4j的,并提供了方法,如debug() ,info() ,和fatal()記錄在不同的日志記錄級別的消息。默認情況下,日志信息將被回顯到標準輸出和將被寫入一個文件名 為vertx.log位于TMPDIR -defined目錄。
共享數(shù)據(jù):verticles之間共享數(shù)據(jù)是通過執(zhí)行sharedData()的方法來實現(xiàn)vertx實例,然后調(diào)用的共享數(shù)據(jù)訪問方法之一。在清單4中,我們存儲在數(shù)據(jù)MAP是通過調(diào)用檢索的GetMap() ; 你同樣可以找回共享數(shù)據(jù)的設(shè)置通過調(diào)用GETSET() 。所有在Vert.x實例verticles的訪問使用相同的模式相同的共享數(shù)據(jù),所以它是為你verticles之間共享不可變數(shù)據(jù)的一種方式。
清單7顯示了源代碼MyWorkerVerticle類。
清單7. MyWorkerVerticle.java
package com.geekcap.vertxexamples; import org.vertx.java.core.Handler; import org.vertx.java.core.eventbus.EventBus; import org.vertx.java.core.eventbus.Message; import org.vertx.java.core.logging.Logger; import org.vertx.java.platform.Verticle; import java.util.concurrent.ConcurrentMap; public class MyWorkerVerticle extends Verticle { @Override public void start() { // Register a listener EventBus eb = vertx.eventBus(); HandlerworkerHandler = new Handler () { @Override public void handle(Message message) { Logger logger = container.logger(); logger.info( "MyWorkerVerticle just received a request for: " + message.body() ); // Examine our shared map ConcurrentMap map = vertx.sharedData().getMap("mymap"); logger.info( "Shared data: " + map.get( "mykey" ) ); message.reply( " Worker Response Hello, from the worker verticle" ); } }; eb.registerHandler( "request.worker", workerHandler ); } }
該MyWorkerVerticle類創(chuàng)建一個新的處理程序與實例handle()從處理消息的方法Server2的類。從清單6中的傳遞給一個參數(shù)召回的send()方法是一個處理程序,可以通過郵件收件人調(diào)用實例。清單7調(diào)用message.reply() ,它發(fā)送一個響應(yīng)返回給始發(fā)者(在該示例中是服務(wù)器2的處理程序)。
該MyWorkerVerticle類獲得訪問EventBus,然后注冊其處理程序以偵聽發(fā)送到“request.worker”目標的消息,以完成循環(huán)。
至于功能性,MyWorkerVerticle簡單地構(gòu)造一個HTML文檔,并返回它回到Server2類。可以通過連接到一個數(shù)據(jù)庫或讀取數(shù)據(jù)從另一個服務(wù)器以檢索與該建立響應(yīng)中的數(shù)據(jù)建立在這個例子。
而且你會發(fā)現(xiàn),MyWorkerVerticle從檢索共享數(shù)據(jù)vertx的sharedData()map。
結(jié)論隨著企業(yè)系統(tǒng)的復雜演變,融合已經(jīng)成為了軟件開發(fā)人員的編程最大的挑戰(zhàn)之一。Vert.x解決一體化的幾種方法復雜:首先,它是圍繞一個事件總線,松散的耦合verticles同時支持多種編程語言構(gòu)建的。不管代碼是用Java編寫的,ruby,python,或JavaScript,可以無縫通過Vert.x事件車內(nèi)集成。此外,該事件總線本身支持異步消息和事件驅(qū)動架構(gòu),它產(chǎn)生的高可擴展性和松耦合。
本文展示Vert.x,其獨特的語言,那它結(jié)合打造高度可擴展的企業(yè)級解決方案的核心組件的概述。我展示兩個web服務(wù)器和寫入Vert.x一個消息傳送系統(tǒng)中,采用后者的例子來開發(fā)一種發(fā)布/訂閱消息和點至點的消息的解決方案。在后者的例子中,我還證明事件記錄,共享數(shù)據(jù),以及標準和worker verticles之間的差異。雖然這篇文章介紹中,我談到了一些,說明Vert.x,類似的Node.js,但它主要功能是建立在JVM的一個解決方案。我希望啟發(fā)你,更多地了解Vert.x,它解決了類型的編程挑戰(zhàn)。
作者信息?原文作者:Steven Haines
原文鏈接:http://t.cn/R56aBJc
翻譯自MaxLeap團隊_云服務(wù)研發(fā)成員:JOE JIA
中文翻譯首發(fā)鏈接:https://blog.maxleap.cn/archives/908
歡迎關(guān)注微信訂閱號:從移動到云端
歡迎加入我們的MaxLeap活動QQ群:555973817,我們將不定期做技術(shù)分享活動。
若有轉(zhuǎn)載需要,請轉(zhuǎn)發(fā)時注意自帶作者信息一欄并本自媒體公號:力譜宿云,尊重原創(chuàng)作者及譯者的勞動成果~ 謝謝配合~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64810.html
摘要:二來,給大家新開坑的項目一個參考。因此,本系列以主要以官方文檔為基礎(chǔ),將盡可能多的特性融入本項目,并標注官網(wǎng)原文出處,有興趣的小伙伴可點擊深入了解。可以通過一些特殊協(xié)議例如將消息作為統(tǒng)一消息服務(wù)導出。下載完成后自行修改和。 開坑前言 我給這個專欄的名氣取名叫做小項目,聽名字就知道,這個專題最終的目的是帶領(lǐng)大家完成一個項目。為什么要開這么大一個坑呢,一來,雖然網(wǎng)上講IT知識點的書籍鋪天蓋...
摘要:為此我們可以使用來發(fā)送一個比如流,會自動為我們實現(xiàn)管道傳輸數(shù)據(jù)。因為流的長度不確定,請求將使用即分塊傳輸。方法可以被多次安全的調(diào)用,這對于無數(shù)據(jù)的請求很容易復用配置和。如此在接受響應(yīng)的回調(diào)函數(shù)里可以直接得到設(shè)置的響應(yīng)解碼體。 本文主要介紹Vert.x 3.4.x 版本新組件Web Client的使用 showImg(https://segmentfault.com/img/bVL8iX...
摘要:輕量級,部署簡單。此外,本文也不是入門文檔,而是為了預(yù)防陷坑而給出的指導意見,故在閱讀本文之前還請先仔細閱讀的文檔。可視作的一個最小部署和運行單元,簡單的說,可類比為。,主,負責部署程序中其他的。嚴格來講,之后,上述第一點并不完全正確。 一直以來早有將這些年用Vert.x的經(jīng)驗整理一下的想法,奈何天生不是勤快人,直到最近扶墻老師問起,遂成此文。 選擇理由 現(xiàn)在想想,我們應(yīng)該算是國內(nèi)用V...
摘要:本文章是藍圖系列的第一篇教程。是事件驅(qū)動的,同時也是非阻塞的。是一組負責分發(fā)和處理事件的線程。注意,我們絕對不能去阻塞線程,否則事件的處理過程會被阻塞,我們的應(yīng)用就失去了響應(yīng)能力。每個負責處理請求并且寫入回應(yīng)結(jié)果。 本文章是 Vert.x 藍圖系列 的第一篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待辦事項服務(wù)開發(fā)教程 Vert.x Blueprint 系...
摘要:上部分藍圖教程中我們一起探索了如何用開發(fā)一個基于消息的應(yīng)用。對部分來說,如果看過我們之前的藍圖待辦事項服務(wù)開發(fā)教程的話,你應(yīng)該對這一部分非常熟悉了,因此這里我們就不詳細解釋了。有關(guān)使用實現(xiàn)的教程可參考藍圖待辦事項服務(wù)開發(fā)教程。 上部分藍圖教程中我們一起探索了如何用Vert.x開發(fā)一個基于消息的應(yīng)用。在這部分教程中,我們將粗略地探索一下kue-http模塊的實現(xiàn)。 Vert.x Kue ...
閱讀 2038·2023-04-26 01:33
閱讀 1666·2023-04-26 00:52
閱讀 1047·2021-11-18 13:14
閱讀 5454·2021-09-26 10:18
閱讀 2915·2021-09-22 15:52
閱讀 1495·2019-08-29 17:15
閱讀 3025·2019-08-29 16:11
閱讀 1044·2019-08-29 16:11