Spring云端口号,使选择智能化

时间:2017-10-15 06:31:18

标签: java spring spring-boot spring-cloud spring-cloud-netflix

我正在使用Eureka服务器运行Spring Cloud,我想让我的应用程序根据使用的端口和给定的范围选择一个端口。

例如,我希望我的第一个实例从端口8010开始,第二个在8011等开始。

在application.properties中你可以设置一个随机端口(server.port=0),你可以设置一个静态端口(server.port=8080),但我想知道如何让spring设置一个随机端口范围,或根据使用的端口选择一个端口。

例如,像这样的东西可以起作用:

server.port.random=8080-8090

但这显然不存在。

我也知道可以添加一些逻辑,例如我已经使用过:

eureka.instance.instance-id=${spring.application.name}:${random.int}

但我不知道如何在两个数字之间进行随机工作。此外,随机数仍有可能连续两次设置相同的端口,使服务器无法启动实例。

有没有办法在Spring application.properties中动态设置端口?

2 个答案:

答案 0 :(得分:4)

可以指定给定范围内的随机端口。在您的属性文件中。

server.port=${random.int[8080,8090]}

仍有可能发生碰撞,但如果你有足够的填充范围,你可以限制发生这种情况的可能性。

然而,更优选的方法是将端口指定为环境变量。

java -jar app.jar --SERVER_PORT=8080

java -jar app.jar --SERVER_PORT=8081

答案 1 :(得分:1)

如果您使用server.port=${random.int[8080,8090]}确定端口号,则可能会遇到此号码已被使用的问题。
另一种选择是通过程序随机指定端口号,它将始终根据您指定的范围返回可用的数字 例如:

application.properties

port.number.min=8080
port.number.max=8090

主要课程中的部分代码

@Value("${port.number.min:8080}")
private Integer minPortNum = 8080;

@Value("${port.number.max:8090}")
private Integer maxPortNum = 8090;

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {             
            int port = SocketUtils.findAvailableTcpPort(minPortNum, maxPortNum);                
            container.setPort(port);
            System.getProperties().put("server.port", port);
        }
    };
}