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")) {
        ...
    }
});
相关推荐
南知意-14 小时前
IDEA 2025.3 版本安装指南(完整图文教程)
java·intellij-idea·开发工具·idea安装
码农水水15 小时前
蚂蚁Java面试被问:混沌工程在分布式系统中的应用
java·linux·开发语言·面试·职场和发展·php
海边的Kurisu15 小时前
苍穹外卖日记 | Day4 套餐模块
java·苍穹外卖
毕设源码-邱学长15 小时前
【开题答辩全过程】以 走失儿童寻找平台为例,包含答辩的问题和答案
java
他们叫我技术总监16 小时前
Python 列表、集合、字典核心区别
android·java·python
江沉晚呤时16 小时前
从零实现 C# 插件系统:轻松扩展应用功能
java·开发语言·microsoft·c#
梁下轻语的秋缘16 小时前
ESP32-WROOM-32E存储全解析:RAM/Flash/SD卡读写与速度对比
java·后端·spring
wanzhong233316 小时前
开发日记8-优化接口使其更规范
java·后端·springboot
Knight_AL16 小时前
Java 多态详解:概念、实现机制与实践应用
java·开发语言
C雨后彩虹16 小时前
volatile 实战应用篇 —— 典型场景
java·多线程·并发·volatile