Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan permulaan port rawak SpringBoot

Bagaimana untuk melaksanakan permulaan port rawak SpringBoot

PHPz
PHPzke hadapan
2023-05-11 17:19:061666semak imbas

1. Port rawak SpringBoot

1 Pengenalan asas

  • Port rawak boleh mencari port yang boleh digunakan secara automatik dalam julat yang ditentukan dan tidak perlu dinyatakan dalam fail konfigurasi Membetulkan port permulaan

  • Sebagai contoh, jika anda perlu menjalankan berbilang kejadian dalam SpringBoot, adalah menyusahkan untuk mengubah suai fail konfigurasi secara berasingan

  • Port rawak Prinsipnya adalah untuk mewujudkan sambungan dengan port soket yang sepadan Jika ia boleh disambungkan, ia telah digunakan

  • Yang diperolehi secara rawak port boleh digunakan untuk pengesahan melalui System.setProperty("Property Name" , tulis ke memori, dan kemudian anda boleh mendapatkan

  • dalam fail konfigurasi ialah server.port, anda tidak perlu menentukan port dalam fail konfigurasi, jika tidak, anda perlu mengkonfigurasinya server.port=${property name}

  • Amalan ini berdasarkan. pada projek biasa SpringBoot, anda boleh terus mencipta perancah projek

  • [tip] Contohnya Dalam projek SpringCloud, pembekal perkhidmatan boleh menggunakan port rawak untuk memulakan berbilang perkhidmatan dengan cepat tanpa perlu ubah suai fail konfigurasi secara individu sebelum memulakan

2. Langkah pelaksanaan

Buat kelas alat port ServerPortUtil .java dan gunakan soket untuk menyambung ke port yang ditentukan. Sebagai contoh, syarat berikut dipenuhi

a Julat port yang ditentukan ialah 8000-65535
b Kenal pasti sama ada port sedang digunakan atau tidak jana
c. Jika semua port tidak tersedia, ralat akan dilemparkan terus, dan operasi akan terganggu

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

akan mencipta kelas arahan StartCommand.java, panggil fungsi port rawak untuk mendapatkan. maklumat port, dan kemudian tulis maklumat port Masukkan persekitaran berjalan
a Jika parameter masuk mengandungi port, gunakan yang ditentukan, jika tidak gunakan

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

Tulis maklumat port ke persekitaran secara automatik. sebelum memulakan kelas permulaan

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

Port yang ditentukan dalam fail konfigurasi adalah maklumat port yang dijana secara rawak

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

Ujian projek memulakan projek secara normal, dan anda boleh melihat maklumat port yang dimulakan dalam konsol

Bagaimana untuk melaksanakan permulaan port rawak SpringBoot

Bagaimana untuk melaksanakan permulaan port rawak SpringBoot

2. >

Bagaimana untuk melaksanakan permulaan port rawak SpringBoot

Kemudian jalankan/nyahpepijat pada permulaanBagaimana untuk melaksanakan permulaan port rawak SpringBoot

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan permulaan port rawak SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam