Maison  >  Article  >  Java  >  Comment implémenter le démarrage aléatoire du port SpringBoot

Comment implémenter le démarrage aléatoire du port SpringBoot

PHPz
PHPzavant
2023-05-11 17:19:061612parcourir

1. Port aléatoire SpringBoot

1. Introduction de base

  • Le port aléatoire peut trouver automatiquement les ports qui peuvent être utilisés dans la plage spécifiée. Il n'est pas nécessaire de spécifier un port de démarrage fixe dans le fichier de configuration

  • Pour. Par exemple, si nécessaire dans SpringBoot Pour exécuter plusieurs instances, il est difficile de modifier le fichier de configuration séparément. Le principe du port aléatoire est d'établir une connexion avec le port socket correspondant. S'il peut se connecter, il a été utilisé. n'a pas été utilisé. Vérification du port obtenue au hasard Après utilisation, il peut être écrit dans la mémoire via System.setProperty("property name", port); port, il n'est pas nécessaire de spécifier le port dans le fichier de configuration. , sinon vous devez configurer server.port=${property name}

  • Cette pratique est basée sur le projet ordinaire SpringBoot, créez simplement l'échafaudage du projet directement

  • [astuce] Par exemple, dans le projet SpringCloud, le fournisseur de services peut utiliser des ports aléatoires Démarrez rapidement plusieurs services sans modifier les fichiers de configuration séparément, puis les redémarrer

  • 2 Étapes de mise en œuvre
  • Créez le <. code>ServerPortUtil.java classe d'outils de port et utilisez socket pour vous connecter au port spécifié, par exemple, comme suit Conditions

  • a Spécifiez la plage de ports comme 8000-65535
  • b Identifiez si le port est dans. use S'il est utilisé, il continuera à être généré aléatoirement

    c Si tous les ports sont indisponibles, une erreur sera générée directement et l'opération sera interrompue

    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Random;
    
    public class ServerPortUtil {
        private static final int MAX_PORT = 65535;
        private static final int MIN_PORT = 8000;
    
        public static String getAvailablePort() {
            Random random = new Random();
    		// 最大尝试次数为端口范围
            int maxRetryCount = MAX_PORT - MIN_PORT;
            while (maxRetryCount > 0) {
            	// 指定范围内随机端口,随便写的算法,根据自己需要调整
                int port = random.nextInt(MAX_PORT - MIN_PORT) + MIN_PORT;
                boolean isUsed = isLocalePortUsing(port);
                if (!isUsed) {
                    return String.valueOf(port);
                }
                --maxRetryCount;
            }
            System.out.println("系统暂无端口可用,运行结束");
            System.exit(1);
            return null;
        }
    
        /**
         * 检查给定端口是否可用
         *
         * @author tianxincode@163.com
         * @since 2020/10/14
         */
        public static boolean isLocalePortUsing(int port) {
            try {
                // 建立一个Socket连接, 如果该端口还在使用则返回true, 否则返回false, 127.0.0.1代表本机
                new Socket(InetAddress.getByName("127.0.0.1"), port);
                return true;
            } catch (Exception e) {
                // 异常说明端口连接不上,端口能使用
            }
            return false;
        }
    }

    Créez StartCommand.javaCommand. classe, appelez la fonction de port aléatoire pour obtenir les informations sur le port, puis écrivez les informations sur le port dans l'environnement en cours d'exécution
  • a Si le paramètre entrant contient un port, utilisez celui spécifié, sinon utilisez la génération automatique
import com.codecoord.randomport.util.ServerPortUtil;
import org.springframework.util.StringUtils;

public class StartCommand {
    /**
     * 端口属性名称,如果名称为server.port则在配置文件中不用指定,否则需要指定为此处配置的名称,如${auto.port}
     */
    private static final String SERVER_PORT = "auto.port";

    public StartCommand(String[] args) {
        boolean isServerPort = false;
        String serverPort = "";
        if (args != null) {
            for (String arg : args) {
                if (StringUtils.hasText(arg) && arg.startsWith("--server.port" )) {
                    isServerPort = true;
                    serverPort = arg;
                    break;
                }
            }
        }

        String port;
        if (isServerPort) {
           port = serverPort.split("=")[1];
        } else {
            port = ServerPortUtil.getAvailablePort();
        }
        System.out.println("Current project port is " + port);
        System.setProperty(SERVER_PORT, port);
    }
}

Écrivez les informations sur le port dans le. environnement avant le démarrage de la classe de démarrage

import com.codecoord.randomport.config.StartCommand;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicatio
public class SpringbootRandomPortApplication {
    public static void main(String[] args) {
        // 写入端口信息 
        new StartCommand(args);
        SpringApplication.run(SpringbootRandomPortApplication.class, args);
    }
}

Spécifiez le port dans le fichier de configuration sous forme d'informations de port générées aléatoirementServerPortUtil .java端口工具类,使用socket连接指定端口,例如有以下条件

a. 指定端口范围为8000-65535
b. 识别端口是否使用,已被使用则继续随机产生
c. 如果全部端口不可使用则直接抛出错误,中断运行

server:
  # 随机端口配置
  port: ${auto.port}

创建StartCommand.javarrreee
Le test du projet démarre le projet normalement et vous pouvez voir les informations sur le port démarré dans la console

2. Opération multi-instance SpringBootComment implémenter le démarrage aléatoire du port SpringBoot

L'opération multi-instance SpringBoot est configurée comme suit dans IDEA

Comment implémenter le démarrage aléatoire du port SpringBoot

Ensuite, démarrez l'exécution/le débogage au démarrageComment implémenter le démarrage aléatoire du port SpringBoot

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer