高性能框架Vert.x

您所在的位置:网站首页 handler消息被阻塞 高性能框架Vert.x

高性能框架Vert.x

2023-06-27 03:54| 来源: 网络整理| 查看: 265

目录 vert.x是什么? 为什么使用Vert.x框架? 有哪些关键的特性和功能? 是如何做到高性能的?高性能机制详解 简单的开发事例 如何使用vert.x进行优雅的异步开发? 性能到底如何? 生态及发展展望 vert.x是什么? 由Tim Fox于2011年创立,现由Eclipse开源组织维护,已经迭代到v4.4.1 基于Netty开发,为开发人员提供了“一站式”的工程解决方案 是一个非常轻巧的、模块化的、灵活的的框架,内核的大小约为650kB

采用了事件驱动机制的异步编程框架,提供了面向事件编程的API,被称为最快的java框架

vertx.jpg 为什么使用Vert.x框架? 互联网业务一般都需具备高可伸缩性,而异步编程模型可以显著提高系统的伸缩性 传统的Spring Boot等框架对异步的支持不够友好,性能较差,在对性能有要求的场景并不适用,而Project Loom又迟迟不能用 Vert.x相对于传统的Java框架,提供了非阻塞异步编程模型,具有高性能、响应式、可扩展等特性

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

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

构建响应式系统 Vert.x适用于构建响应式、高并发、实时数据处理的系统,例如物联网、实时数据分析、机器学习、行情分析等场景。

构建网络应用程序 Vert.x可以用于构建各种类型的网络应用程序,包括Web应用、RESTful服务、消息队列、实时通信、游戏服务器等。

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

1. 核心模块:Vert.x-core

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

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

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

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

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

MongoDB client JDBC client SQL common Redis client MySQL/PostgreSQLclient

完善的生态体系

4. 微服务的支持 Vert.x Service Discover:服务发现 Vert.x Circuit Breaker:熔断器,与Hystrix类似 Vert.x Config:应用配置 Vert.x整合了常用的消息驱动:Vert.x Integration Vert.x Mail Client Vert.x STOMP Client & Server:提供了STOMP协议的实现包括客户端与服务端。 Vert.x JCA Adaptor:提供了Java连接器架构适配器,这允许同任意JavaEE应用服务器进行互操作。 Vert.x RabbitMQ Client Vert.x Kafka Client Vert.x Consul Client

5. 身份认证和授权

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

Auth common:通用的认证API,可以通过重写AuthProvider类来实现自己的认证 JDBC auth: 后台为JDBC的认证实现 JWT auth: 用JSON Web tokens认证实现 Shiro auth: 使用Apache Shiro认证实现 MongoDB auth: MongoDB认证实现 OAuth 2: Oauth2协义认证实现 htdigest auth: 这个是新增一种认证的支持

协议支持 TCP、UDP HTTP(包括HTTP/2) WebSocket Event Bus AMQP/RabbitMQ MQTT 集群支持

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

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

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

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

核心概念 Verticle Verticle是Vert.x中的部署单元,相当于应用中的一个服务。Verticle可以被传递一些配置信息(如证书、网络地址等),而且Verticle可以被多次部署,Verticle可以部署其它Verticle。

Verticle分为三类:

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

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

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

核心概念

EvenLoop EventLoop是异步编程模型中是特有的,一个Verticle通过一个EventLoop来处理接收到的事件,这些事件可以是任何事情,如接收网络缓冲、调度事件或由其它Verticle发送的消息,EventLoop中执行时,不能进行线程阻塞操作。

vertx-eventloop.png 核心概念

EvenBus 事件总线(EvenBus)是在不同Verticle之间通过异步消息传递进行通讯的主要工具。 支持三种消息机制:发布/订阅、点对点、请求/回应

vertx-eventbus.png Vert.x是如何做到高性能的?

采用异步编程模型

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

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

Event Bus 消息总线机制

vertx-eventbus.png

主从reactor模型 netty-reactor1.png

Note: netty的主从reactor模型

Reactor 主线程 MainReactor 对象通过 select 监听连接事件, 收到事件后,通过 Acceptor 处理连接事件 当 Acceptor 处理连接事件后,MainReactor 将连接分配给 SubReactor subreactor 将连接加入到连接队列进行监听,并创建 handler 进行各种事件处理 当有新事件发生时, subreactor 就会调用对应的 handler 处理 handler 通过 read 读取数据,分发给后面的 worker 线程处理 worker 线程池分配独立的 worker 线程进行业务处理,并返回结果 handler 收到响应的结果后,再通过 send 将结果返回给 client 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 编写业务系统

使用Spring强大的依赖注入和配置管理等特性,解决模块之间的依赖、配置等问题

吞吐量能比SpringBoot + Tomcat的架构模式大 3 倍以上

事例

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

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

性能到底如何? vertx-xingneng1.jpg vertx-xingneng3.jpg vertx-xingneng2.jpg

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

未来展望 归属Eclipse Foundation,版本一直在迭代升级中,性能和使用体验都在不断提高 Vert.x未来将会在数据处理、分布式应用等方面做出更多的贡献 最近几年较火的Quarkus框架,是在Vert.x之上构建的,支持GraalVM,面向云原生,具备极快的启动时间和低内存消耗 参考资料 官方文档[https://vertx.io/get-started/] 书籍[vertx in action] 书籍[Netty In Action] https://zhuanlan.zhihu.com/p/407323966


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3