響應式微服務 in Java 譯 --Asynchronous Development Model<四>

 

What About Vert.x ?java

Vert.x使用異步非阻塞構建響應式分佈式系統的工具集的開發模型,由於這是一個工具集而不是一個框架,因此你可使用Vert.x做爲一個類庫,它不包含你怎麼構建和架構你的系統。你能夠爲所欲爲地使用,Vert.x是很是靈活的,你可使用在單獨應用中,或者內嵌到一個大項目中。react

從開發者的角度來看,Vert.x是一系列的JAR文件。每個Vert.x是一個JAR包,你能夠加到你的$CLASSPATH中。從HTTP服務,客戶端,到消息,到底層點的協議TCP或UDP,Vert.x提供了大量的Modules構建你想要的項目。你能夠選擇任何模塊除了Vert.x Core構建你的系統,Figure 2-2顯示Vert.x生態系統的概念。數據庫

Figure 2-2編程

Vert.x也提供了大量的棧幫助構建微服務,在微服務流行前,Vert.x就在推微服務的方法。它被設計和構形成直觀和強大的方式構建微服務。不只僅如此,Vert.x構建的微服務,它有一個重要的特性:到處異步。微信

Asynchronous Development Model架構

Vert.x構建的全部應用都是異步的,是時間驅動和非阻塞的,當有趣的事情發生的時候,你的應用被觸發。讓咱們看個具體的例子,Vert.x提供了簡單的方式建立HTTP服務,只要HTTP請求到達的時候,服務就會響應:併發

在這個例子中,咱們設定requestHandler來接受HTTP服務,發送「hello Vert.x」,一個Handler是一個方法處理事件。在咱們的例子裏,handler的代碼處理每個來的請求,注意到並無返回一個result,而是handler提供一個result,result怎麼被提供依賴於交互的類型。在最後的代碼片斷裏面,把result寫到HTTP的response中就好。這個handler被鏈到socket監聽請求上,HTTP endpoint相應一個簡單的HTTP response。負載均衡

因爲不多有異常,Vert.x的APIs不會阻塞調用線程,若是一個result能夠被很快地提供,將會返回;不然,一個handler被用於稍後接受事件。當事件準備被執行的就是觸發程序Handler,或者一個異步的操做完成。框架

在傳統的命令式編程,你能夠這樣寫:異步

在這個代碼中,你會等到結果的返回,當轉換到異步非阻塞的開發模型,當結果準備好的時候纔會invoked:

在最後的代碼片斷中,計算怎麼都不會返回一個結果,因此在結果計算完成返回以前不會等待。

得益於非阻塞的開發模型,你能夠處理高度並行的工做負載使用一個小數量的線程,這一事件循環在圖2-3所描繪的。它消耗事件隊列和調度到每一個事件感興趣的處理程序。

Figure 2-3

線程模型的事件循環的提出有一個巨大的好處,這簡化了併發。就像這裏只有一個線程,老是被同一個線程中不一樣時調用。可是這裏有一個重要的規則你必須遵照:

由於沒有阻塞,因此一個event loop能夠在短期內分發大量的事件,這種Reactor_pattern(https://en.wikipedia.org/wiki/Reactor_pattern)

咱們假設,在某一個瞬間,咱們打破這個這個規則。在以前的代碼片斷裏,request handler老是被相同的event loop調用,所以HTTP請求會阻塞,不會馬上返回給用戶,其餘請求不會被執行,而是放在請求隊列裏,等待線程釋放,就失去了Vert.x帶來的可拓展性和效率,所以什麼樣的會阻塞?第一個最明顯的就是數據庫鏈接,長的計算也會阻塞。如把圓周率精度計算到200,000位會阻塞。不用擔憂--Vert.x提供告終構來處理這些阻塞代碼。 

在一個標準的reactor 實現中,有一個event loop線程處理到達的請求不斷分發給處理程序,單線程可運行在CPU的單個核中;可是Vert.x 不是這麼運行的,取代單event loop的是,Vert.x 實例能夠管理多個event loops,這個被叫作 multireactor 模型,以下圖所示:

事件能夠被不一樣的 Event loops 分發,然而,一旦Handler被執行,後續在那個是被這個 event loop調用,執行了併發帶來的好處,像FIgure 2-4,你有多個 Event loops,能夠負載均衡到不一樣的CPU,這個在處理HTTP請求例子是怎麼作的呢?Vert.x 註冊 socket 監聽,分發不一樣的請求到不一樣的 event loops。

原文地址:

https://developers.redhat.com/promotions/building-reactive-microservices-in-java/

有什麼討論的內容,能夠發我微信公衆號:

相關文章
相關標籤/搜索