高性能框架Vert.x

2023-06-11  本文已影响0人  时间道

目录

  1. vert.x是什么?
  2. 为什么使用Vert.x框架?
  3. 有哪些关键的特性和功能?
  4. 是如何做到高性能的?高性能机制详解
  5. 简单的开发事例
  6. 如何使用vert.x进行优雅的异步开发?
  7. 性能到底如何?
  8. 生态及发展展望

vert.x是什么?


为什么使用Vert.x框架?

Note: 1. 高性能:Vert.x采用非阻塞I/O和事件循环的模型,能够在单机上支持高并发,提高系统的整体性能和吞吐量。

  1. 响应式:Vert.x支持异步编程模型,能够处理大量请求并快速响应。同时,Vert.x的事件总线机制可以实时地处理不同组件间的消息传递和事件通知。
  2. 可扩展:Vert.x支持Verticle和Worker Verticle的概念,从而可以实现组件的复用和分布式部署,从而实现系统的可扩展性。

有哪些应用场景?


有哪些关键的特性和功能?


Vert.x特性

  1. 多种编程语言支持,包括Java、Scala、JavaScript、Ruby、Python、Groovy、Clojure等
  2. 异步无锁编程:经典的多线程编程模型能满足很多Web开发场景,但随着移动互联网并发连接数的猛增,多线程并发控制模型性能难以扩展,同时要想控制好并发锁需要较高的技巧
  3. 各种IO支持:目前Vert.x的异步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等;
  4. 分布式开发支持:Vert.x通过EventBus事件总线,可以轻松编写分布式解耦的程序,具有很好的扩展性;
  5. 生态体系成熟:当前已有包括Postgres、MySQL、MongoDB、Redis、Mq等常用组件
  6. 高效的编解码机制:能够高效的实现java对象与JSON、XML之间的相互转化,以前WEB访问的编解码

完善的生态体系

vertx-shengtai.png

功能模块

<div id="left">

1. 核心模块:Vert.x-core </br>

Vert.x核心模块包含一些基础的功能,如HTTP,TCP,文件系统访问,EventBus、WebSocket、延时与重复执行、缓存等其他基础的功能,你可以在你自己的应用程序中直接使用。可以通过vertx-core模块引用即可。

2. web开发模块:Vert.x-Web

Vert.x Core 提供了一系列底层的功能用于操作 HTTP,对于一部分应用来是足够的。
Vert.x Web 基于 Vert.x Core,提供了一系列更丰富的功能以便更容易地开发实际的 Web 应用。
</div>

<div id='right'>

3. 多种数据库Api的封装库

Vert.x提供了对关系型数据库、NoSQL、消息中间件的支持,传统的客户端因为是阻塞的,会严重影响系统的性能,因此Vert.x提供了对以上客户端的异步支持。具体支持的数据访问如下:

</div>


完善的生态体系

<div id='left'>

4. 微服务的支持

<div id='right'>

5. 身份认证和授权

<div class="describe">

Vert.x提供了简单API用于在应用中提供认证和授权。包括:</br>

</div>

</div>


协议支持


集群支持

  1. 集群管理器:</br>
    提供集群管理组件,可以实现节点发现、节点管理和消息传递等功能,让应用程序轻松实现水平扩展和负载均衡。组件支持包括hazelcast、Zookeeper、Redis等

  2. 集群事件总线:</br>
    支持全局发布/订阅系统,用于在集群中广播事件或消息。通过事件总线,Vert.x应用程序可以实现水平扩展,它可以将事件广播到集群中的所有节点

  3. 共享数据:</br>
    支持多个Vert.x实例共享数据,共享方式包括本地哈希、分布式哈希、异步数据库查询等

  4. 集群之间的模块通信:</br>
    支持使用EventBus实现进程间消息通信,以及支持集群中多个节点之间建立通信通道,是高效的跨进程通信机制。


核心概念

<div class="describe">

Verticle分为三类:

  1. Standard verticle</br>
    Standard Verticle会被分派到一个event loop线程上</br>
    该Standard Verticle里面注册的所有回调handler都会被这个event loop线程来调用</br>
    Standard Verticle 会阻塞 event loop线程</br>

  2. Worker verticle</br>
    会被workpool中的线程执行,vert.x会保证每次只有一个线程在执行。</br>
    Worker verticle不会阻塞event loop线程。

  3. Multi-threaded worker verticles</br>
    和普通的Worker verticle相比,区别在于,会在同一个时间点,有多个线程同时执行一个Worker Verticle实例

</div>

核心概念


核心概念


Vert.x是如何做到高性能的?


<div id="left">

采用异步编程模型

  1. 异步非阻塞,V4版本提高了promise、future,解决callback hell问题

  2. 事件总线机制,EventLoop和回调机制实现了非阻塞I/O操作

  3. Event Bus 消息总线机制

vertx-eventbus.png

</div>

<div id="right">

主从reactor模型

netty-reactor1.png

</div>
Note: netty的主从reactor模型

  1. Reactor 主线程 MainReactor 对象通过 select 监听连接事件, 收到事件后,通过 Acceptor 处理连接事件
  2. 当 Acceptor 处理连接事件后,MainReactor 将连接分配给 SubReactor
  3. subreactor 将连接加入到连接队列进行监听,并创建 handler 进行各种事件处理
  4. 当有新事件发生时, subreactor 就会调用对应的 handler 处理
  5. handler 通过 read 读取数据,分发给后面的 worker 线程处理
  6. worker 线程池分配独立的 worker 线程进行业务处理,并返回结果
  7. handler 收到响应的结果后,再通过 send 将结果返回给 client
  8. Reactor 主线程可以对应多个 Reactor 子线程, 即 MainRecator 可以关联多个 SubReactor

使用Vert.x搭建服务


搭建TCP服务

NetServer server = vertx.createNetServer();
server.listen(9000, "localhost", res -> {
  if (res.succeeded()) {
    System.out.println("Server is now listening!");
  } else {
    System.out.println("Failed to bind!");
  }
});


搭建HTTP Web Server

import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerRequest;

public class HttpServerExample {

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();
        HttpServer server = vertx.createHttpServer();

        Router router = Router.router(vertx);

        router.route().handler(routingContext -> {
          // 所有的请求都会调用这个处理器处理
          HttpServerResponse response = routingContext.response();
          response.putHeader("content-type", "text/plain");
          // 写入响应并结束处理
          response.end("Hello World from Vert.x-Web!");
        });

        server.requestHandler(router::accept).listen(8080);
    }
}

如何使用vert.x进行优雅的异步开发?


使用Vert.x + (Reactive Streams/RxJava) + SpringBoot 编写业务系统

<div class="describe">

  1. Vert.x + (Reactive Streams) + SpringBoot </br>
    https://github.com/diegocamara/vertx-springboot-realworld-example-app

  2. 使用Vert.x + RxJava3
    https://github.com/tsegismont/vertx-musicstore

</div>

性能到底如何?

vertx-xingneng1.jpg vertx-xingneng3.jpg vertx-xingneng2.jpg

[图片来源于https://www.techempower.com/]


未来展望


参考资料

上一篇 下一篇

猜你喜欢

热点阅读