Heim  >  Artikel  >  Java  >  So implementieren Sie den zufälligen Port-Start von SpringBoot

So implementieren Sie den zufälligen Port-Start von SpringBoot

PHPz
PHPznach vorne
2023-05-11 17:19:061612Durchsuche

1. SpringBoot-Zufallsport

1. Der zufällige Port kann automatisch Ports finden, die innerhalb des angegebenen Bereichs verwendet werden können. Es ist nicht erforderlich, einen festen Startport anzugeben Wenn beispielsweise in SpringBoot mehrere Instanzen ausgeführt werden müssen, ist es mühsam, die Konfigurationsdatei separat zu ändern. Das Prinzip des zufälligen Ports besteht darin, eine Verbindung mit dem entsprechenden Socket-Port herzustellen Wurde nicht verwendet. Nach dem Zufallsprinzip kann die Portüberprüfung über System.setProperty("property name", port) in den Speicher geschrieben und dann in der Konfigurationsdatei abgerufen werden. Port, es ist nicht erforderlich, den Port in der Konfigurationsdatei anzugeben, andernfalls müssen Sie server.port=${property name} konfigurieren.

  • Diese Vorgehensweise basiert auf einem normalen SpringBoot-Projekt. Erstellen Sie einfach das Projektgerüst direkt

  • [Tipp] Im SpringCloud-Projekt kann der Dienstanbieter beispielsweise mehrere Dienste schnell starten, ohne die Konfigurationsdatei separat ändern zu müssen, und erneut starten

  • 2 Implementierungsschritte

  • Erstellen Sie die ServerPortUtil.java Port-Tool-Klasse und verwenden Sie Socket, um eine Verbindung zum angegebenen Port herzustellen, z. B. wie folgt: Bedingungen
  • a Geben Sie den Portbereich als 8000-65535 an
  • b in Verwendung. Wenn es verwendet wird, wird es weiterhin zufällig generiert. Wenn nicht alle Ports verfügbar sind, wird direkt ein Fehler ausgegeben und der Vorgang wird unterbrochen. Erstellen Sie StartCommand.java Rufen Sie die Befehlsklasse auf, um die Portinformationen abzurufen, und schreiben Sie die Portinformationen dann in die laufende Umgebung.
  • a Wenn der eingehende Parameter einen Port enthält, verwenden Sie den angegebenen, andernfalls verwenden Sie die automatische Generierung die Umgebung, bevor die Startklasse gestartet wird

    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;
        }
    }

    Geben Sie den Port in der Konfigurationsdatei als zufällig generierte Portinformationen an
  • 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);
        }
    }
  • Der Projekttest startet das Projekt normal und Sie können die gestarteten Portinformationen in der Konsole sehen


  • 2. SpringBoot-Mehrinstanzbetrieb

Der SpringBoot-Mehrinstanzbetrieb ist in IDEA wie folgt konfiguriert:

Das obige ist der detaillierte Inhalt vonSo implementieren Sie den zufälligen Port-Start von SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen