1. 程式人生 > 其它 >Vert.x簡介

Vert.x簡介

1. Vert.x 介紹

Vert.x是Eclipse軟體基金會頂級JAVA開源專案之一,它基於netty的、執行在jvm之上的、支援多種程式語言的高效能非同步、非阻塞、響應式開發工具包。

Vert.x is a tool-kit and not a framework that ships with black magic: what you write is actually what you get to execute, as simple as that.
So what makes Vert.x a great option for writing your next cloud-native or twelve-factor app?

Vert.x設計
  • 響應式的(Responsive):一個響應式系統需要在合理的時間內處理請求。
  • 彈性的(Resilient):一個響應式系統必須在遇到異常(崩潰,超時, 500 錯誤等等)的時候保持響應的能力,所以它必須要為異常處理 而設計。
  • 可伸縮的(Elastic):一個響應式系統必須在不同的負載情況下都要保持響應能力,所以它必須能伸能縮,並且可以利用最少的資源來處理負載。
  • 訊息驅動(Message driven):一個響應式系統的各個元件之間通過 非同步訊息傳遞 來進行互動。
  • 支援多種語言:只要能執行在JVM上的語言,基本都支援(Java、JavaScript、Ruby、Python、Groovy、Clojure、Ceylon等)。
  • 簡單的併發模型:就像寫單執行緒程式碼一樣簡單,多執行緒併發由Vert.x控制。
  • 支援Event Bus:在同一個Vert.x叢集,各個Verticle 例項間可以通過event bus通訊。同時也支援跨程序的TCP Event Bus (tcp-eventbus-bridge)
  • Vert.x與Netty的關係:Vert.x使用Netty處理所有的IO。
  • 是借鑑Erlang和Akka架構設計,能充分利用多核處理器效能並實現高併發程式設計需求的框架。

2. Vert.x與spring boot區別

Spring Boot 不香了?

  • Vert.x 是輕量級的
  • Vert.x 高併發

​ 但同時Vertx也有它的缺點,就拿Vert.x Web相比Spring MVC來說,Vertx更加靈活,但同時也需要開發人員web原生開發有更深刻的瞭解,包括各種請求返回頭的新增以及各種攔截器、自定義訊息轉換等的處理,都需要開發人員自行配置。這顯然是大部分開發人員所不願意的,所以導致了Vert.x目前並不怎麼流行,但這些並不影響Vert.x本身的優秀。

Spring boot 已經很熟悉了,開箱即用,企業級應用開發框架。

3. Vert.x快速開始

  • JDK 1.8 or higher
  • A text ed­i­tor or IDE
  • Maven 3 or higher
  • curl or HTTPie or a browser to per­form HTTP re­quests

建立Vert.x應用

public class MainVerticle extends AbstractVerticle {
  @Override
  public void start() throws Exception {
    // Create a Router
    Router router = Router.router(vertx);

    // Mount the handler for all incoming requests at every path and HTTP method
    router.route().handler(context -> {
      // Get the address of the request
      String address = context.request().connection().remoteAddress().toString();
      // Get the query parameter "name"
      MultiMap queryParams = context.queryParams();
      String name = queryParams.contains("name") ? queryParams.get("name") : "unknown";
      // Write a json response
      context.json(
        new JsonObject()
          .put("name", name)
          .put("address", address)
          .put("message", "Hello " + name + " connected from " + address)
      );
    });

    // Create the HTTP server
    vertx.createHttpServer()
      // Handle every request using the router
      .requestHandler(router)
      // Start listening
      .listen(8888)
      // Print the port
      .onSuccess(server ->
        System.out.println(
          "HTTP server started on port " + server.actualPort()
        )
      );
  }
}

打包mvn package,執行

$ mvn exec:java
HTTP server started on port 8888
apr 03, 2020 11:49:21 AM io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer
INFO: Succeeded in deploying verticle

4. 微服務

比較好的學習專案blueprint微服務

5.一些術語

  • Verticle

Vertx部署和執行的程式碼。Verticles可以使用多種語言實現。

  • Vert.x Instance

Vert.x instance執行在JVM裡,Verticle執行在Vert.x instance裡。多個Verticles在一個Vert.x instance裡非同步執行。多個Vert.x instances可以通過Event Bus組成叢集。

  • Concurrency

    • Standard Verticle:始終在同一個Event Loop執行緒上執行,同一個Verticle 中的邏輯可以避免資源競爭和死鎖。
    • Worker Verticle:在worker threads上執行,Vertx保證最多同時只有一個worker thread在執行邏輯,避免競爭和死鎖。但是在不同的時刻,可能由不同的執行緒在執行。
    • Multi-threaded worker verticle:和Worker Verticle類似,但是不保證執行緒安全,在同一時刻,可能由多個執行緒在執行。
  • Event-based Programming Model

使用“事件驅動”的模式去編寫程式碼,採用非同步回撥handler的方式去處理事件,不能被阻塞!

  • Event Loops

Vert.x的核心執行緒池,預設每個Verticle執行在自己的Event Loop執行緒上,不能被阻塞!

  • Message Passing

不同的Verticle可以通過Event Bus通訊,叢集模式下不同主機上的Verticle也可以通過Event Bus通訊,來實現distributed applications。

  • Shared data

不同的Verticle之間可以通過 Shared Data 共享資料

  • hazelcast

Vert.x 使用 Hazelcast 作為一個In-Memory Data Grid (IMDG). Hazelcast 是一個內嵌的元件。

如果使用叢集模式,Vert.x 預設使用Hazelcast來管理在各個不同Host上的Instance通訊。Hazelcast 也是一種分散式的儲存,Hazelcast 是Vert.x Event Bus 在叢集模式下的實現基礎,也是Vertx分散式共享記憶體的Shared Map的基礎。

vertx 還可以使用zookeeper等其他分散式元件

6.通訊模式

7.其他

參考部落格,博主實現了Vertx版本的springMVC,屬於個人維護