You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

服务发现场景下,如何从Jetty Server实例获取服务端口?

获取Jetty Server实例的可用端口号

嘿,刚好之前做服务发现的时候处理过类似需求,给你几个靠谱的方法,根据你的Jetty版本和配置场景选就行:

方法一:遍历所有连接器获取端口

Jetty的服务端口是通过Connector(连接器)绑定的,一个Server实例可能配置多个连接器(比如同时支持HTTP和HTTPS),所以我们可以遍历所有连接器来获取实际绑定的端口:

// 假设你已经拿到了Jetty Server实例
Server jettyServer = ...;

// 遍历所有连接器
for (Connector connector : jettyServer.getConnectors()) {
    int actualPort = connector.getLocalPort();
    // 过滤掉未绑定的端口(返回-1表示端口还未生效)
    if (actualPort != -1) {
        // 这里拿到的就是实际可用的端口,直接用于ZooKeeper注册即可
        System.out.println("当前Jetty服务绑定的端口: " + actualPort);
        break; // 如果只需要一个端口,拿到后跳出循环
    }
}

注意:这个方法在Jetty 9.x到最新的12.x版本都适用,而且如果你的配置是随机端口(比如设置端口为0),getLocalPort()会返回系统实际分配的端口,非常实用。

方法二:针对ServerConnector获取更详细信息

如果你的Jetty使用的是默认的ServerConnector(绝大多数场景都是),可以强转后获取更多网络细节,比如绑定的IP地址:

for (Connector connector : jettyServer.getConnectors()) {
    if (connector instanceof ServerConnector) {
        ServerConnector serverConnector = (ServerConnector) connector;
        int actualPort = serverConnector.getLocalPort();
        InetSocketAddress bindAddress = serverConnector.getLocalSocketAddress();
        
        System.out.println("服务绑定地址: " + bindAddress.getHostString());
        System.out.println("服务绑定端口: " + actualPort);
        // 这里可以把地址+端口一起注册到ZooKeeper
    }
}

关键注意点

  • 一定要在Jetty Server启动完成后调用这些方法!启动前端口还未完成绑定,getLocalPort()会返回-1,拿到无效值
  • 如果配置了多个连接器,要根据业务需求选择对应的端口(比如注册HTTP端口还是HTTPS端口)
  • 如果你是Spring Boot集成Jetty的场景,虽然可以通过@Value("${server.port}")读取配置端口,但如果是随机端口(server.port=0),必须用上面的方法获取实际绑定的端口

内容的提问来源于stack exchange,提问作者BobCoder

火山引擎 最新活动