Spring Cloud 端口号,让选择更智能

Posted

技术标签:

【中文标题】Spring Cloud 端口号,让选择更智能【英文标题】:Spring cloud port number, making the choice intelligent 【发布时间】:2018-03-26 21:56:33 【问题描述】:

我正在运行带有 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

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

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

【问题讨论】:

我想您会遇到这个问题,因为您尝试在本地运行这些项目,并且在运行同一应用程序的多个版本时遇到冲突。将 SERVER_PORT 或 (server.port) 作为环境变量覆盖会得到预期的效果吗? java -jar app.jar --SERVER_PORT=8080; java -jar app.jar --SERVER_PORT=8081 @shinjw 好主意,你让我想到了另一个方向。我认为这也将是一个生产问题,但是在生产服务器上,您显然可以在多个 IP 上运行相同的端口。我想我现在可以使用覆盖。 【参考方案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);
        
    ;

【讨论】:

【参考方案2】:

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

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

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

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

java -jar app.jar --SERVER_PORT=8080

java -jar app.jar --SERVER_PORT=8081

【讨论】:

以上是关于Spring Cloud 端口号,让选择更智能的主要内容,如果未能解决你的问题,请参考以下文章

Linux中常见的网络端口号

修改 Spring boot 启动端口号 Spring Boot 监听端口被占用无法启动

查看端口号

xmlrpc - 动态选择端口号

spring bootspring cloud下spring boot微服务启动没有报错,但是访问访问不到

监听端口是啥?