Рубрики
Без рубрики

Получить Бегущий порт в весенней загрузки

Узнайте, как получить программу порта HTTP в приложении Spring Boot

Автор оригинала: Kai Yuan.

1. Обзор

Приложение Spring Boot встраивает веб-сервер, и иногда мы можем захотеть обнаружить порт HTTP во время выполнения.

В этом учебнике мы будем рассмотрены, как получить порт HTTP программно в приложении Spring Boot.

2. Введение

2.1. Наша весенняя загрузка приложения

Мы создадим простой пример приложения Spring Boot, чтобы быстро показать методы обнаружения порта HTTP во время выполнения:

@SpringBootApplication
public class GetServerPortApplication {
    public static void main(String[] args) {
        SpringApplication.run(GetServerPortApplication.class, args);
    }
}

2.2. Два сценария создания порта

Как правило, самый простой способ настроить порт http приложение Spring Boot определяет порт в файле конфигурации application.properts или application.yml .

Например, в application.properts файл, мы можем установить 7777 как порт наше приложение работает на:

server.port=7777

Кроме того, вместо определения фиксированного порта, мы можем позволить приложению Spring Boot работать на случайном порту, установив « 0 ” как значение “ server.port ” недвижимость :

server.port=0

Далее давайте рассмотрим два сценария и обсудим различные способы, чтобы получить порт программно на время выполнения.

В этом учебнике мы обнаружим серверный порт в унитарных тестах.

3. Получение фиксированного порта во время выполнения

Давайте создадим файл свойств приложения-fixedport.properties и определить фиксированный портовый 7777 в нем:

server.port=7777

Далее мы постараемся получить порт в классе единицы испытаний:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = GetServerPortApplication.class,
  webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("fixedport")
public class GetServerFixedPortUnitTest {
    private final static int EXPECTED_PORT = 7777;
    ....
}

Прежде чем мы увидим методы тестирования, давайте кратко рассмотрим аннотации тестового класса:

  • @RunWith (СпрингРаннер.class) – Это присоединится к тесту JUnit с весенним ТестКонтекст
  • @SpringBootTest (… SpringBootTest.WebEnvironment.DEFINED_PORT) – В СпрингБотст , мы будем использовать DEFINED_PORT для встроенного веб-сервера
  • @ActiveProfiles (“фиксированныйпорт”) – С помощью этой аннотации мы включили Весенний профиль ” фиксированный ” так что наши приложения-fixedport.properties будут загружены

3.1. Использование аннотации @Value (“$-сервер.порт”).

С приложения-fixedport.properties файл будет загружен, мы можем получить ” server.port ” свойство, используя @Value аннотация :

@Value("${server.port}")
private int serverPort;

@Test
public void givenFixedPortAsServerPort_whenReadServerPort_thenGetThePort() {
    assertEquals(EXPECTED_PORT, serverPort);
}

3.2. Использование класса ServerProperties

СерверПредложение содержит свойства встроенного веб-сервера, такие как порт, адрес и заголовок сервера.

Мы можем ввести СерверПредложение компонента и получить порт от него:

@Autowired
private ServerProperties serverProperties;

@Test
public void givenFixedPortAsServerPort_whenReadServerProps_thenGetThePort() {
    int port = serverProperties.getPort();
 
    assertEquals(EXPECTED_PORT, port);
}

До сих пор мы узнали два способа получить фиксированный порт во время выполнения. Далее давайте посмотрим, как обнаружить порт в случайном сценарии порта.

4. Получение случайного порта в Runtime

На этот раз давайте создадим еще один файл свойств приложение-randomport.properts :

server.port=0

Как показано в коде выше, мы позволяем Spring Boot выбирать свободный порт случайным образом, когда начинается веб-сервер.

В том же духе, давайте создадим еще один класс единицы теста:

....
@ActiveProfiles("randomport")
public class GetServerRandomPortUnitTest {
...
}

Здесь мы должны активировать ” случайный ” Весенний профиль для загрузки соответствующего файла свойств.

Мы нашли два способа открыть стационарный порт во время выполнения. Тем не менее, они не могут помочь нам получить случайный порт:

@Value("${server.port}")
private int randomServerPort;

@Test
public void given0AsServerPort_whenReadServerPort_thenGet0() {
    assertEquals(0, randomServerPort);
}

@Autowired
private ServerProperties serverProperties;

@Test
public void given0AsServerPort_whenReadServerProps_thenGet0() {
    int port = serverProperties.getPort();
 
    assertEquals(0, port);
}

Как показывают два метода тестирования, оба @Value (“$-сервер.порт”) и serverProperties.getPort() доклад “0” в качестве порта. Очевидно, что это не тот правильный порт, которого мы ожидаем.

4.1. Использование ServletWebServerApplicationContext

Весенняя загрузка начинает ServletWebServerApplicationContext при запуске встроенного веб-сервера.

Таким образом, мы можем получить WebServer из контекста объекта для получения информации о сервере или управления сервером:

@Autowired
private ServletWebServerApplicationContext webServerAppCtxt;

@Test
public void given0AsServerPort_whenReadWebAppCtxt_thenGetThePort() {
    int port = webServerAppCtxt.getWebServer().getPort();
 
    assertTrue(port > 1023);
}

В тесте выше, мы проверяем, если порт больше, чем 1023. Это потому, что 0-1023 являются системные порты.

4.2. Обработка ServletWebServerInitializedEvent

Весеннее приложение может публиковать различные события и EventListeners обрабатывать события.

Когда встроенный веб-сервер начал работу, ServletWebServerInitializedEvent будут опубликованы. Это событие содержит информацию о веб-сервере.

Таким образом, мы можем создать EventListener чтобы получить порт от этого события:

@Service
public class ServerPortService {
    private int port;

    public int getPort() {
        return port;
    }

    @EventListener
    public void onApplicationEvent(final ServletWebServerInitializedEvent event) {
        port = event.getWebServer().getPort();
    }
}

Мы можем ввести сервисный компонент в наш тестовый класс, чтобы быстро получить случайный порт:

@Autowired
private ServerPortService serverPortService;

@Test
public void given0AsServerPort_whenReadFromListener_thenGetThePort() {
    int port = serverPortService.getPort();
 
    assertTrue(port > 1023);
}

5. Заключение

Обычно мы настраиваем серверный порт приложения Spring Boot в файле свойств или файле YAML, где мы можем установить либо фиксированный, либо случайный порт.

В этой статье мы обсудили различные подходы для получения фиксированного и случайного порта во время выполнения.

Как всегда, полный исходный код статьи доступен более на GitHub .