Vert.x同一Verticle下创建双同端口HTTP服务器无报错问题求解
Vert.x同端口多HttpServer行为解释
为什么没有端口占用报错
你遇到的情况和跨进程端口占用不是同一个场景,底层原因有两个:
- 你是在同一个JVM进程、同一个Vert.x实例中创建的两个HttpServer,Vert.x底层依赖的Netty默认给服务端套接字开启了
SO_REUSEADDR选项,该选项允许同一进程内的多个套接字绑定到同一个端口,所以不会抛出操作系统层面的端口占用异常。 - Vert.x内部对同端口的多个监听请求做了兼容处理,不会直接判定为冲突,所以两个服务的异步启动回调都返回了成功状态。
为什么所有请求都被Server 2处理
同一个Vert.x实例下,默认对同一端口的多个请求处理器采用后注册覆盖先注册的策略,你先注册了Server 1的handler,后注册了Server 2的handler,最终只有后注册的Server 2的handler会生效,所以所有请求都由Server 2处理。
补充验证方式
如果你想要复现传统的端口占用报错,可以启动两个独立的JVM进程,都运行这段代码监听8080,第二个进程启动时就会抛出端口绑定失败的异常。
如果需要同端口多服务负载均衡,可以在创建HttpServer时显式配置setUseReusePort(true),此时请求会轮询分配给多个服务处理,不会出现覆盖的情况。
内容的提问来源于stack exchange,提问作者Bentaye
相关产品推荐
相关产品推荐

