Vert.x入门1 —— 《基础概念》

article/2025/8/21 5:55:38

一、什么是Vertx

Vert.x 在JVM上构建响应式应用程序的工具包,Vert.x不是框架而是工具包。Vert.x基于Netty项目,该项目是JVM的高性能异步网络库。

此描述中有三个重要点:工具包,响应式和“在JVM上”。

首先,Vert.x是一个工具包。这意味着Vert.x既不是应用程序服务器,也不是容器也不是框架。它也不是JavaScript库。Vert.x是一个普通的旧jar文件,因此Vert.x应用程序是使用此jar 文件的应用程序。Vert.x没有定义打包模型,所有Vert.x 组件都是无聊的 jar文件。这对您和您的应用有何影响?假设您正在使用诸如Maven或Gradle之类的构建工具,使您的应用程序成为Vert.x应用程序,只需添加vertx-core依赖项即可。要使用另一个Vert.x组件,只需将其添加为依赖项即可。简单,无负担。启动应用程序是一个简单的类,其中包含public static void main(String[] args)入口点。无需安装特定的IDE或插件即可开始使用Vert.x。

其次,Vert.x是响应式的。它专门用于构建响应式应用程序或更合适的系统。

  • 响应式:响应式系统需要在合理的时间内处理请求。

  • 弹性:响应式系统必须在出现故障(崩溃,超时,500错误等)时保持响应能力,因此必须针对故障进行设计并适当处理。

  • 消息驱动:反应系统中的组件使用异步消息传递进行交互。

同样,Vert.x是事件驱动的也是非阻塞的。事件是在事件循环中传递的 ,永远不可阻止。让我们解释一下原因。与传统的“企业”系统不同,Vert.x使用很少的线程。其中一些线程是事件循环,它们负责在中调度事件Handlers。如果您阻止此线程,则不再发送事件。这个执行模型会影响您编写代码的方式,而不是传统的阻塞代码模型,您的代码将是异步和非阻塞

例如,如果我们想从URL检索资源,我们将执行以下操作:

URL site = new URL("http://vertx.io/");
BufferedReader in = new BufferedReader(new InputStreamReader(site.openStream()));String inputLine;
while ((inputLine = in.readLine()) != null) {System.out.println(inputLine);
}
in.close();

但是使用Vert.x,我们更有可能做到:

vertx.createHttpClient().getNow(80, "vertx.io", "", response -> {response.bodyHandler(System.out::println);
});

这两个代码之间的主要区别是:

第一个是同步的并且可能会阻塞:指令按顺序执行,并且可能会阻塞线程很长时间(因为网站可能很慢或其他原因)。

Vert.x是异步且无阻塞的:与HTTP服务器建立连接时释放线程(事件循环),因此可以执行其他操作。收到响应后,同一事件循环将调用callback。大多数Vert.x组件都是单线程的(只能由单个线程访问),因此不再有并发负担。顺便说一句,对于Vert.x,即使DNS解析也是异步且非阻塞的(而Java DNS解析处于阻塞状态)。

最后,Vert.x应用程序 在Java虚拟机(8+)上“在JVM上”运行。这意味着可以使用JVM上运行的任何语言来开发Vert.x应用程序。包括Java(当然),Groovy,Ceylon,Ruby,JavaScript,Kotlin和Scala。我们甚至可以混合和匹配所有这些语言的任意组合。Vert.x应用程序的多语言性质使您可以使用最合适的语言来完成任务。

Vert.x允许您通过使用内置的TCP和HTTP服务器和客户端,还可以使用Vert.x事件总线(一种用于发送和接收消息的轻量级机制),来实现分布式应用程序。使用事件总线,您可以向发送消息addresses。它支持三种分发模式:

  • 点对点:将消息发送给单个消费者,监听该地址

  • 发布/订阅:所有接收该地址的消费者都收到该消息

  • 请求/回复:将消息发送给单个使用者,并通过将另一条消息发送给初始发件人来使其回复消息

Vert.x提供了适当的工具来构建反应系统。系统:响应,弹性和异步!

二、什么是响应式应用(Reactive)

Reactive响应式 (反应式) 编程 是一种新的编程风格,其特点是异步或并发、事件驱动、推送PUSH机制以及观察者模式的衍生。reactive应用 (响应式应用) 允许开发人员构建事件驱动(event-driven),可扩展性,弹性的反应系统:提供高度敏感的实时的用户体验感觉,可伸缩性和弹性的应用程序栈的支持,随时可以部署在多核和云计算架构。

三、Event Loop

Event Loop 顾名思义,就是事件循环。在 Vertx 的生命周期内,会不断的轮询查询事件。

传统的多线程编程模型,每个请求就 fork 一个新的线程对请求进行处理。这样的编程模型有实现起来比较简单,一个连接对应一个线程,如果有大量的请求需要处理,就需要 fork 出大量的线程进行处理,对于操作系统来说调度大量线程造成系统 load 升高。

所以为了能够处理大量请求,就需要过渡到基于 Roactor 模型的 Event Loop上。

Eventloop 不断的轮训,获取事件然后安排上不同的 Handler 处理对应的Event。

这里要注意的是为了保证程序的正常运行,event 必须是非阻塞的。否则就会造成 eventloop 的阻塞,影响Vertx 的表现。但是现实中的程序肯定不能保证都是非阻塞的,Vertx 也提供了相应的处理阻塞的方法的机制,耗时的任务将被委托给长任务处理线程进行处理,保证线程不被耗时的IO操作进行阻塞等待。

在多数情况下,Vert.x使用被称为 Event Loop 的线程来调用您的处理器。

由于Vert.x或应用程序的代码块中没有阻塞,Event Loop 可以在事件到达时快速地分发到不同的处理器中。

由于没有阻塞,Event Loop 可在短时间内分发大量的事件。例如,一个单独的 Event Loop 可以非常迅速地处理数千个 HTTP 请求。

官网图示:
在这里插入图片描述

四、Verticles

verticle是vert.x中可被部署运行的最小代码块,可以理解为一个verticle就是一个最小化的业务处理引擎。

一个应用程序可以是单个verticle或者由EventBus通信的多个verticles构成 verticle被发布部署后,会调用其内部的start方法,开始业务逻辑处理,完成后会调用stop方法,对该代码块执行销毁动作 。

Verticles在Vert.x实例中运行 一个Vertx可以承载多个verticles,每个Vert.x实例在其私有的JVM实例运行, 一台服务器可以运行一个或多个Vert.x实例(建议运行Vertx实例的数量和CPU核数正相关)

一个Vert.x实例,保证其承载的verticles实例总是在同一个线程执行, 并发Vert.x 是单线程的。

注意点:

  1. 每个verticle占用一个EventLoop线程,且只对应一个EventLoop 。
  2. 每个verticle中创建的HttpServer,EventBus等等,都会在这个verticle回收时同步回收 。
  3. 在多个verticle中创建同样端口的httpServer,不会有错误,会变成两个EventLoop线程处理同一个HttpServer的连接,所以多核机器,肯定是需要设置多个verticle的实例来加强性能的。

可以这么想,vertx实例就是一台服务器,而verticle就是上面跑的进程。

官网图示:
在这里插入图片描述

五、Event bus

Vertx 中的 Event bus 如果类比后端常用的 MQ 就更加容易理解了。实际上 Event Bus 就是 Verticle 之间传递 信息的桥梁。

换句话说,就是 Java 通用设计模式中的监听模式,或者是我们常说的 基于 MQ 消息开发模式。

官网图示:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/o5qnidSW.shtml

相关文章

Vertx快速入门参考

Vertx学习 什么是vertx? Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模…

Vertx入门学习(含代码)

Vertx入门学习 一、Vertx是什么?二、Vertx基本概念三、Vertx能干什么?四、Vertx的技术体系五、快速体验:搭建一个简单的Vertx项目并输出Hello World六、单元测试总结 一、Vertx是什么? github: https://github.com/vert-x3 官网&…

Vert.x(vertx) 简明介绍

摘要 Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因…

Vertx学习一:这玩意是到底是个啥

Vertx,融合Java、Ruby、Python等语言的高性能架构,架构师必读 原文链接: http://www.360doc.com/content/18/0203/14/39530679_727432611.shtml 目录: 一、Vert.x简介 二、Vert.x原理解析 三、Vert牛刀小试 四、Vert应用实践 五…

【java】vertx从入门到放弃——入门(四)Codec

什么是Codec?概念这个玩意我是真不想说,毕竟我没有找到具体的概念,我自己大致的理解就是,用EventBus传输类的时候,对这个类进行序列化和反序列化的东西,因为vertx使用json进行传输,所以这个玩意…

Android thinker

国家虽安,忘战必危, Android虽爽,不学则忙,老夫纵横江湖数十载,深谙世事之难料,顾。。 ok,ok 不装比了,进入正题,今天要讲的是Android 热修之 thinker。 在研究这个之前…

ESP32-CAM AI THINKER 引脚排列:GPIO 用法说明

ESP32-CAM 是一款开发板,带有一个 ESP32-S 芯片、一个 OV2640 摄像头、microSD 卡插槽和几个用于连接外设的 GPIO。在本指南中,我们将介绍 ESP32-CAM GPIO 以及如何使用它们。 引脚排列图 下图显示了 ESP32-CAM AI-Thinker 的引脚排列图。 电路原理示意图 下图显示了 ESP…

Thinkpad 各系列简介

ThinkPad 各系列简介 如果提到商务笔记本,大家一定会想到凭借坚固和可靠的特性在业界享有很高声誉ThinkPad笔记本电脑,以及ThinkPad那经典的键盘红点设计和纯黑低调的外表。 在这里我就简单介绍一下ThinkPad的各系列产品。 Thinkpad名称来历 “ThinkP…

python thinker canvas create_arc 使用详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/A757291228/article/details/106739556 ———————————————— 版权声明:本文…

二、让界面动起来,Python基于thinker实现的简单的俄罗斯方块小游戏

文章目录 界面动起来定时刷新页面移动俄罗斯方块 界面动起来 **功能:**如何让方块「动起来」? 分析过程: 要想让方块动起来,需要实现以下两点: 定时刷新页面移动页面内部的俄罗斯方块 定时刷新页面 实现定时刷新页面&#xff…

三、生成随机方块,Python基于thinker实现的简单的俄罗斯方块小游戏

文章目录 生成第一步:随机生成方块对象第二步:修改游戏运行方法 固定第一步:记录固定的方块第二步:修改check_move方法 左右移动第一步:左右移动方块第二步:绑定键盘 旋转第一步:添加旋转方法第…

【G-thinker】G-thinker部分源码解析

一、main 子图匹配程序run.cpp中主要使用到worker.h和comper.h分别对应线程和进程单位,接下来我们从main函数入手解析源码 从主函数可以看到,子图匹配程序中GMatchWorker继承了worker,主函数声明了workerparams并且传入了路径和线程参数&am…

python用thinker库制作一个进制转换器(可打包exe)

进制类型分为: 二进制 字母B表示 八进制 字母O表示 十进制 字母D表示 十六机制 字母H表示 进制转换之间很麻烦,还得计算,如果可以做一个进制转换器多nice,其实也不难,就利用一个tkinter库就能制作,废话不多…

Thinker Board 2开发板上使用奥比中光 astra 深度相机

Thinker Board 2 国产开发板 arm架构 上使用奥比中光 astra 深度相机 准备工作 1、下载astraSDK 选择linux_arm 下载 https://developer.orbbec.com.cn/download.html?id53 2、下载openNI https://dl.orbbec3d.com/dist/openni2/OpenNI_2.3.0.66.zip 开始安装 1、安装fre…

think

我167,97斤,胸d,腰很细,反手轻松摸肚脐那种,骨架小,总结就是身高刚好人瘦胸大屁股大腿细腰细肤白。走路腰杆能挺到天上,气质挺好。漂亮女生太多了,想取胜只能从气质下手了。脸呢&…

Python基于thinker实现的简单的俄罗斯方块小游戏源代码:一、搭建界面

文章目录 一、搭建界面搭建基础窗体第一步:创建画板大小第二步:在画板上作画 绘制俄罗斯方块第一步:绘制o形俄罗斯方块第二步:绘制其他形状方块 记录俄罗斯方块小游戏的游戏思路和过程 一、搭建界面 **目标:**搭建基础…

thinker board s debian系统安装配置

thinker board s debian系统安装配置 好多年前买了一块thinker board s,装安卓系统来用,结果经常性卡死不知道为啥,可能是供电问题,也可能是系统bug,之后就吃灰不怎么用了,最近想装一个计算服务器&#xff…

python利用thinker制作多页面切换的桌面应用实例教程

本篇文章主要讲解,python利用thinker制作多页面的桌面实例教程。可以在一个主界面中相互进行切换和设置相关的表单信息,布局等方法 代码片段的实际效果 视频演示: python使用thinker制作多窗口代码片段实例效果 gif动态图: 构建…

模型思维-THE MODEL THINKER

序言这本书是怎样写成的 Part1为什么需要模型思维 01做一个多模型思考者 使用模型来思考能够带给你的,远远不仅仅是工作绩效的提高。它还会使你成为一个更优秀的人,让你拥有更强的思考能力。你将更擅长评估层出不穷的经济事件和政治事件,更能…

展示一下用thinker做小软件的UI

有一个大坑给大家分享一下。ttk.Treeview可以改变列宽,却不能改变某一行的行高(可以改变整体的行高),其实就是Treeview没有自动换行功能,很痛苦,很折磨,......我一度放弃thinker,因为…