Spring云端口号,让选择更智能
Spring cloud port number, making the choice intelligent
我是 运行 一个带有 Eureka 服务器的 Spring 云,我想让我的应用程序根据使用的端口和给定的范围选择一个端口。
例如,我希望我的第一个实例从端口 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 中动态设置端口?
可以指定给定范围内的随机端口。在您的属性文件中。
server.port=${random.int[8080,8090]}
仍然存在碰撞的可能性,但如果您有足够的范围填充,则可以限制发生碰撞的可能性。
但是,更可取的方法是将端口指定为环境变量。
java -jar app.jar --SERVER_PORT=8080
java -jar app.jar --SERVER_PORT=8081
如果您使用 server.port=${random.int[8080,8090]}
确定端口号,您可能会遇到此号码已被使用的问题。
另一种选择是通过程序随机指定端口号,它将始终return根据您指定的范围提供一个可用号码。
例如:
application.properties
port.number.min=8080
port.number.max=8090
您的主要部分代码 class
@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);
}
};
}
我是 运行 一个带有 Eureka 服务器的 Spring 云,我想让我的应用程序根据使用的端口和给定的范围选择一个端口。
例如,我希望我的第一个实例从端口 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 中动态设置端口?
可以指定给定范围内的随机端口。在您的属性文件中。
server.port=${random.int[8080,8090]}
仍然存在碰撞的可能性,但如果您有足够的范围填充,则可以限制发生碰撞的可能性。
但是,更可取的方法是将端口指定为环境变量。
java -jar app.jar --SERVER_PORT=8080
java -jar app.jar --SERVER_PORT=8081
如果您使用 server.port=${random.int[8080,8090]}
确定端口号,您可能会遇到此号码已被使用的问题。
另一种选择是通过程序随机指定端口号,它将始终return根据您指定的范围提供一个可用号码。
例如:
application.properties
port.number.min=8080
port.number.max=8090
您的主要部分代码 class
@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);
}
};
}