场景热力图:想象你的代码像一家顶级披萨店,传统阻塞式开发是等烤箱完成一单才接下一单,而Vert.x则训练了无数外卖小哥(Event Loop),烤箱刚放进披萨就转身去处理新订单。今天我们开启异步编程新次元,看Vert.x如何用单线程魔法吊打多线程!
// 创建Vertx实例(快递公司总部)
Vertx vertx = Vertx.vertx();
vertx.setPeriodic(1000, id -> {
System.out.println("定时器消息 ➡️ 不会阻塞其他订单处理!");
});
// 快递小哥数量 = CPU核心数 * 2(默认值)
System.out.println("当前Event Loop线程数: " +
Vertx.currentContext().getInstanceCount());
核心理念:
♂️ 每个Event Loop线程都是一个不知疲倦的外卖骑手
所有IO操作都是包裹派送任务
⏳ 绝不等待任何IO操作(非阻塞)
// 下单披萨(模拟异步IO操作)
Future<String> orderPizza() {
Promise<String> promise = Promise.promise();
vertx.executeBlocking(future -> {
try {
Thread.sleep(1000); // 模拟耗时操作
future.complete("玛格丽特披萨");
} catch (Exception e) {
future.fail(e);
}
}, false, promise);
return promise.future();
}
// 处理订单(非阻塞式)
orderPizza()
.compose(pizza -> {
System.out.println("开始制作:" + pizza);
return Future.succeededFuture(pizza.toUpperCase());
})
.onSuccess(result -> System.out.println("出餐完毕:" + result))
.onFailure(err -> System.err.println("订单取消:" + err.getMessage()));
// 同时处理三份订单
CompositeFuture.all(
orderPizza("海鲜披萨"),
orderPizza("夏威夷披萨"),
orderPizza("烤肉披萨")
).onSuccess(allPizzas -> {
System.out.println("全部订单完成:" + allPizzas.list());
});
// 创建Web服务器(10行代码起飞)
Router router = Router.router(vertx);
router.get("/menu").handler(ctx -> {
ctx.json(List.of(
new Pizza("玛格丽特", 39),
new Pizza("海鲜至尊", 59)
));
});
vertx.createHttpServer()
.requestHandler(router)
.listen(8888, res -> {
if (res.succeeded()) {
System.out.println("服务器已在 8888 端口接单 ");
} else {
res.cause().printStackTrace();
}
});
// 配置MySQL连接池
PgConnectOptions connectOptions = new PgConnectOptions()
.setPort(5432)
.setHost("localhost")
.setDatabase("pizza_shop")
.setUser("postgres")
.setPassword("secret");
PoolOptions poolOptions = new PoolOptions().setMaxSize(5);
PgPool client = PgPool.pool(vertx, connectOptions, poolOptions);
router.get("/orders").handler(ctx -> {
client.query("SELECT * FROM orders")
.execute()
.onSuccess(rs -> ctx.json(rs.rows()))
.onFailure(err -> ctx.fail(500));
});
// 节点1启动命令
Vertx.clusteredVertx(new VertxOptions(), res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
vertx.eventBus().consumer("order.topic", msg -> {
System.out.println("节点1收到订单:" + msg.body());
});
}
});
// 节点2发送订单
eventBus.publish("order.topic", "双倍芝士披萨");
集群优势清单:
请求类型 | 线程数 | QPS | 内存消耗 |
---|---|---|---|
传统阻塞式 | 200 | 12,000 | 1.2GB |
Vert.x响应式 | 8 | 85,000 | 320MB |
场景 | 推荐方案 | 优点 |
---|---|---|
Web开发 | Vert.x Web + Handlebars | 支持模板引擎 |
API网关 | Vert.x + RxJava | 背压控制 |
实时通信 | Vert.x SockJS | 兼容WebSocket降级方案 |
微服务 | Vert.x + Kubernetes | 快速水平扩展 |
// 反面教材:阻塞Event Loop
vertx.executeBlocking(future -> {
Thread.sleep(10000); // 错误!应在工作线程执行
}, false, res -> {});
// 正确姿势:异步通知
orderService.getOrderAsync()
.onSuccess(order -> {
vertx.setTimer(1000, id -> sendToKitchen(order));
});
Vert.x就像一个超级外卖帝国,用更少的资源投递更多的订单。当你的代码开始用异步响应式思维思考,就会发现程序世界的时间竟然可以折叠!现在开始用Vert.x升级你的技术装备库,成为高并发世界的快递之王吧!♂️
(本文代码基于Vert.x 4.4 + Java 17,需要JDK11+环境运行,PostgreSQL示例需本地安装数据库)