Vert.x系列(一)--Vert.x介紹

1.Vert.x 介紹安全

Vert.x(官網:https://vertx.io/ )基於JVM、輕量級、高性能Java框架。 功能強大,第三方庫依賴少的。多線程

它只依賴Netty4以及Jackson。 分佈式狀況下還要依賴HazelCast這個分佈式框架。框架

包含了一個企業級應用程序所需的全部要求。分佈式

2.Vert.x 組件概念ide

1.Vertx: 框架核心,全部程序共享一個vertx實例: 分爲2種:單機vertx() / 分佈式:clusteredVertx()。 是大部分功能的基礎。 若是要舉例的的話,比較像Spring的 ApplicationContext。oop

代碼:性能

Vertx vertx = Vertx.vertx();

2.Verticle 業務處理單元,全部的自定義類須要繼承Verticle或AbstractVerticle。spa

分爲3種:線程

Standard Verticles  這是最多見和通用的類型-他們老是使用一個 event loop thread(事件循環線程) 執行。3d

Worker Verticles  用於執行阻塞任務

Multi-threaded worker Verticles 使用來自 worker pool(工做者線程池) 中的線程運行。一個實例能夠被多個線程同時執行。(高級特性,不推薦使用) 代碼:

public class MyVerticle extends AbstractVerticle {

    // 業務方法foo(){}

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();
        DeploymentOptions options = new DeploymentOptions();
        vertx.deployVerticle(new MyVerticle(), options);
    }
}

3.EventBus 事件總線。 Verticle 之間的通訊靠它。支持點對點send、廣播publish 2個模式。

代碼:  

// Verticle1
Object message1 = new Object(); // 要傳遞的消息
vertx.eventBus().send("Address1", message1, ar -> {
    if (ar.succeeded()) {
        System.out.println("發送成功");
    }
});
// Verticle2
vertx.eventBus().consumer("Address1", ar -> {
    Object message = ar.body();
    System.out.format("接受成功{}", message); // 得到了上面的Verticle1的消息
});
// Verticle2 (寫法2,不使用lamda表達式)
vertx.eventBus().consumer("Address1", new Handler<Message<Object>>() {
    @Override
    public void handle(Message<Object> event) {
        Object message = event.body();
        System.out.format("接受成功{}", message);
    }
});

4.EventLoop 一個vertx 會有多個event loop,稱爲event loop group(數量和CPU的核心數有關。) 每部署1個verticle,都會爲該verticle綁定1個event loop。一個verticle對應一個event loop,但一個event loop 對應多個verticle.   vertx上的事件傳遞到eventLoop 上,再進行分發。即「郵局」。而EventLoop經過循環事件隊列來執行全部的業務邏輯。 Event Loop線程不能被阻塞,不然事件將沒法被處理。這個被官方認定爲「黃金法則」,不該該打破。框架針對這個要求的自檢邏輯。

(EventLoopGroup截圖)

(阻塞線程後出現的警告)

3. Vert.x 的 executeBlocking

既然黃金法則不容許被打破,那麼代碼有須要長時間的邏輯,該怎麼辦? 方法1:使用 executeBlocking 。方法2:變成work verticle.

舉例介紹 executeBlocking

public String someLongTask() {
    try {
        Thread.sleep(6000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "很久";
}

若是不用executeBlocking:

System.out.println("1:" + new Date());
String result = someLongTask();
System.out.println("result:" + result);
System.out.println("2:" + new Date());

若是使用executeBlocking:

vertx.executeBlocking(future -> {
    System.out.println("1:" + new Date());
    String result = someLongTask();
    future.complete(result);
    System.out.println("2:" + new Date());
}, res -> {
    if (res.succeeded()) {
        System.out.println("result:" + res.result());
    };
});

4. Vert.x的線程安全:

什麼是線程安全: 從某個線程開始訪問到訪問結束的整個過程,若是有一個訪問對象被其餘線程修改,那麼對於當前線程而言就發生了線程安全問題;若是在整個訪問過程當中,無一對象被其餘線程修改,就是線程安全的。

重點是: 1.有多線程。 2.同時操做。

Vert.x怎麼保證線程安全: 對於Standard verticles, 針對 Vert.x會保證verticles下的全部Handler會一直在同一個Event Loop線程中執行(即紅字). 對於Worker verticles,  實例在一個時間點只會被一個線程來執行,不會在同一個時間有兩個線程同時執行一個Worker Verticle實例(也即紅字). 對於Multi-threaded worker verticles  不保證。會有多個線程同時執行一個Worker Verticle實例。 我的認爲線程安全是Vert.x最好的優勢。

相關文章
相關標籤/搜索