SpringBootのランダムポート起動の実装方法

PHPz
リリース: 2023-05-11 17:19:06
転載
1674 人が閲覧しました

1. SpringBoot ランダム ポート

1. 基本的な紹介

  • ランダム ポートは、指定された範囲内で使用できるポートを自動的に見つけることができ、ポートを指定する必要はありません。設定ファイルに指定 起動ポートを固定

  • #例えば SpringBoot で複数のインスタンスを実行する必要がある場合、設定ファイルを個別に変更するのは面倒

  • ランダムポート 対応するソケットポートとの接続を確立する原理です。接続できれば使用済み、そうでなければ未使用です。

  • ランダムに取得されたポートは、 System.setProperty("Property Name" , port); メモリに書き込むことで検証後に使用でき、その後、構成ファイルで取得できます。書かれた名前はserver.portです。構成ファイルでポートを指定する必要はありません。それ以外の場合は、構成する必要があります。server.port=${プロパティ名}

  • この実践方法SpringBoot の通常のプロジェクトに基づいています。プロジェクト スキャフォールディングを直接作成するだけです。

  • [ヒント]たとえば、SpringCloud プロジェクトでは、サービス プロバイダーはランダム ポートを使用して、必要なく複数のサービスを迅速に開始できます。

  • #2. 実装手順

    Create
  • ServerPortUtil .java
Port ツール クラスを使用するには、構成ファイルを個別に変更してから開始します。たとえば、次の条件が満たされる場合、

#a. 指​​定されたポートの範囲は 8000-65535

b. 識別 ポートが使用されているかどうか、使用されている場合は、使用すると、ランダムに c が生成され続けます。すべてのポートが使用できない場合は、エラーが直接スローされ、操作が中断されます。

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;
    }
}
ログイン後にコピー

##StartCommand.java## を作成します。 # コマンド クラスと呼び出し ランダム ポート関数はポート情報を取得し、そのポート情報を実行環境に書き込みます

a. 受信パラメーターにポートが含まれている場合は、指定されたポートを使用し、それ以外の場合は自動生成を使用します

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);
    }
}
ログイン後にコピー

スタートアップ クラスの開始前にポート情報を環境に書き込む
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);
    }
}
ログイン後にコピー

ランダムに生成されたポート情報として構成ファイルにポートを指定します

server:
  # 随机端口配置
  port: ${auto.port}
ログイン後にコピー
プロジェクト テストによりプロジェクトが正常に開始され、開始されたポート情報はコンソールで確認できます

2. SpringBoot マルチインスタンス操作

マルチインスタンス操作SpringBoot のインスタンス操作は、IDEASpringBootのランダムポート起動の実装方法

SpringBootのランダムポート起動の実装方法

# で次のように設定されており、起動時に実行/デバッグされます

以上がSpringBootのランダムポート起動の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート