Vert.x 常见问题精简总结

目录

[1. Vert.x 是什么?](#1. Vert.x 是什么?)

[2. Vert.x vs Netty vs Spring WebFlux](#2. Vert.x vs Netty vs Spring WebFlux)

[3. Vert.x 的线程模型(非常关键)](#3. Vert.x 的线程模型(非常关键))

[4. 多任务时是否会生成新线程?](#4. 多任务时是否会生成新线程?)

[5. 实际项目中如何使用 Vert.x?](#5. 实际项目中如何使用 Vert.x?)

[6. Vert.x 实现 WebSocket 示例](#6. Vert.x 实现 WebSocket 示例)

[7. Server 如何识别 WebSocket 客户端?](#7. Server 如何识别 WebSocket 客户端?)

[8. Web 如何通知 Server 主动关闭?](#8. Web 如何通知 Server 主动关闭?)

[9. Web 建立 WebSocket 时,需要特定端口吗?](#9. Web 建立 WebSocket 时,需要特定端口吗?)

[10. /chat 是固定 URI 吗?](#10. /chat 是固定 URI 吗?)


1. Vert.x 是什么?

Vert.x 是一个 基于事件驱动、非阻塞的 JVM 异步应用框架,底层基于 Netty。

特点:

  • 高并发、低延迟

  • 多语言支持(Java、Kotlin、JS、Python ...)

  • Actor-like 的 Verticle 编程模型

  • 天然适合 Web、网关、MQ、WebSocket、高 IO 场景


2. Vert.x vs Netty vs Spring WebFlux

框架 特点 场景
Netty 网络通信框架,最底层,可自定义协议、编解码 IM、网关、RPC、自定义协议
Vert.x 基于 Netty 的高级框架,提供 HTTP、WebSocket、事件总线、Verticle Web 服务、实时推送、高 IO
Spring WebFlux Reactor 模型、适合 REST API、生态完善 业务系统、高吞吐 API

关系图(文字版):

Netty(底层网络) → Vert.x(更高抽象) → WebFlux(Spring 生态)


3. Vert.x 的线程模型(非常关键)

Vert.x 使用:

  • Event Loop(事件循环线程):少量线程处理大量请求

  • Worker Pool(工作线程池):专门执行阻塞代码

特点:

  • 默认 每个 CPU 一个 Event Loop 线程

  • Event Loop 不执行阻塞任务

  • 阻塞任务会被丢到 Worker Pool


4. 多任务时是否会生成新线程?

不会。

Vert.x 和 WebFlux 一样:

  • 使用 固定数量的事件循环线程

  • 所有请求由这些线程不断调度

  • 不会为每个请求新建线程

当任务包含阻塞操作(如 JDBC、文件 IO)时:

  • Vert.x 会调度到 Worker Pool

  • 但 Worker Pool 也是固定大小的,不会无限创建线程


5. 实际项目中如何使用 Vert.x?

通常有 3 种方式:

直接使用 Vert.x(最多人用)

  • verticles

  • 写 HTTP Server / WebSocket / EventBus

  • 完整构建异步服务

当成 Netty 的高级封装

  • 在做网关、IM、推送系统时使用 Vert.x 代替直接写 Netty

和 Spring 集成(较少用)

  • 使用 vertx-spring-boot-starter

  • 但生态不如纯 Spring 或纯 Vert.x 清晰


6. Vert.x 实现 WebSocket 示例

java 复制代码
Vertx vertx = Vertx.vertx();
HttpServer server = vertx.createHttpServer();

server.webSocketHandler(ws -> {
    System.out.println("Client connected: " + ws.remoteAddress());

    ws.textMessageHandler(msg -> {
        ws.writeTextMessage("echo: " + msg);
    });

    ws.closeHandler(v -> {
        System.out.println("Client closed");
    });
});

server.listen(8080);

7. Server 如何识别 WebSocket 客户端?

通过连接建立时的 remoteAddress(IP + Port)

java 复制代码
ws.remoteAddress();  // 客户端的IP和端口

如果前面有 Nginx:

  • Server 接收到的是 Nginx 地址

  • 可通过 X-Forwarded-For 获取真实客户端 IP


8. Web 如何通知 Server 主动关闭?

Web 调用:

javascript 复制代码
ws.close();

Server 会触发:

java 复制代码
ws.closeHandler(...)

无需特殊协议。

如果需要更明确的"手动通知",客户端也可发:

javascript 复制代码
{ "type": "close" }

Server 收到后主动:

java 复制代码
ws.close();

9. Web 建立 WebSocket 时,需要特定端口吗?

不需要,只要是 支持 WebSocket 的服务器地址 + 协议 即可:

javascript 复制代码
const ws = new WebSocket("ws://your-server.com:8080/chat");

WebSocket 建立依赖:

  • 协议:ws://wss://

  • 地址:域名 / IP

  • 端口:与 HTTP Server 一样(无强制要求)

  • 请求头自动包含 Upgrade: websocket


10. /chat 是固定 URI 吗?

不是。

WebSocket 的 URI 完全由你自定义:

  • /ws

  • /chat

  • /stream

  • /game/room

  • /message/push

只要 Server 监听即可。

例如:

java 复制代码
server.webSocketHandler(ws -> {
    if (ws.path().equals("/chat")) {
        ...
    }
});
相关推荐
艾莉丝努力练剑12 分钟前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
小蒜学长21 分钟前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
程序员黑豆23 分钟前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
AI人工智能+电脑小能手26 分钟前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
xbgRS3 小时前
springboot的自动装配
java·spring boot
嘻哈∠※10 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_79811 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25812 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅12 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息14 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate