Spring Boot инструменты разработчика: удаленные приложения

Инструменты разработчика Spring Boot не ограничиваются локальной разработкой. Вы также можете использовать несколько функций при удаленном запуске приложений. Удаленная поддержка опциональна, поскольку она может быть угрозой безопасности. Она должна быть включена только при работе в доверенной сети или при использовании SSL. Если ни один из этих вариантов недоступен, вам не следует использовать удаленную поддержку DevTools. Вы никогда не должны включать поддержку в производственном развертывании.

Чтобы включить удаленную поддержку, вам нужно убедиться, что devtools включен в перепакованный архив, как показано в следующем листинге:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

Затем вам нужно установить свойство spring.devtools.remote.secret. Как и любой важный пароль или секрет, значение должно быть уникальным и надежным, чтобы его нельзя было угадать или подобрать.

Поддержка удаленного devtools предоставляется в двух частях: конечная точка на стороне сервера, которая принимает подключения, и клиентское приложение, которое вы запускаете в вашей IDE. Серверный компонент автоматически включается, если установлено свойство spring.devtools.remote.secret. Клиентский компонент должен быть запущен вручную.

Запуск приложения удаленного клиента

Приложение удаленного клиента предназначено для запуска из вашей среды IDE. Вам необходимо запустить org.springframework.boot.devtools.RemoteSpringApplication с тем же путем к классу, что и удаленный проект, к которому вы подключаетесь. Единственный обязательный аргумент приложения - это удаленный URL-адрес, к которому оно подключается.

Например, если вы используете Eclipse или STS и у вас есть проект с именем my-app, который вы развернули в Cloud Foundry, вы должны сделать следующее:

  • Выберите Run Configurations ... из меню Run.
  • Создайте новое Java-приложение «Запустить конфигурацию».
  • Найдите проект my-app.
  • Используйте org.springframework.boot.devtools.RemoteSpringApplication в качестве основного класса.
  • Добавьте https://myapp.cfapps.io к аргументам Program (или каков ваш удаленный URL).

Работающий удаленный клиент может выглядеть следующим образом:

  .   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote :: 2.2.4.RELEASE

2015-06-10 18:25:06.632  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code)
2015-06-10 18:25:06.671  INFO 14938 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043  WARN 14938 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074  INFO 14938 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2015-06-10 18:25:07.130  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)

Поскольку удаленный клиент использует тот же путь к классам, что и реальное приложение, он может напрямую читать свойства приложения. Вот как свойство spring.devtools.remote.secret читается и передается на сервер для аутентификации.

Всегда рекомендуется использовать https:// в качестве протокола соединения, чтобы трафик был зашифрован и пароли не могли быть перехвачены.

Если вам нужен прокси-сервер для доступа к удаленному приложению, настройте свойства spring.devtools.remote.proxy.host и spring.devtools.remote.proxy.port.

Удаленное обновление

Удаленный клиент контролирует путь к классу вашего приложения на предмет изменений так же, как и локальный перезапуск. Любой обновленный ресурс передается в удаленное приложение и (если требуется) запускает перезапуск. Это может быть полезно, если вы работаете над функионалом, который использует облачный сервис, которого у вас нет локально. Как правило, удаленные обновления и перезапуски выполняются намного быстрее, чем полный цикл восстановления и развертывания.

Файлы отслеживаются только во время работы удаленного клиента. Если вы измените файл перед запуском удаленного клиента, он не будет передан на удаленный сервер.

Настройка наблюдателя файловой системы

FileSystemWatcher работает, опрашивая изменения класса с определенным интервалом времени, а затем ожидает предопределенный период тишины, чтобы убедиться, что больше нет изменений. Затем изменения загружаются в удаленное приложение. В более медленной среде разработки может случиться так, что периода тишины недостаточно, и изменения в классах могут быть разбиты на партии. Сервер перезапускается после загрузки первой партии изменений класса. Следующая партия не может быть отправлена приложению, так как сервер перезагружается.

Обычно это проявляется в предупреждении в журналах RemoteSpringApplication о невозможности загрузки некоторых классов и последующей повторной попытке. Но это также может привести к несогласованности кода приложения и невозможности перезапуска после загрузки первого пакета изменений.

Если вы постоянно наблюдаете такие проблемы, попробуйте увеличить параметры spring.devtools.restart.poll-interval и spring.devtools.restart.quiet-period до значений, соответствующих вашей среде разработки:

spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s

Папки отслеживаемого пути к классам теперь опрашиваются каждые 2 секунды на наличие изменений, и в течение 1 секунды сохраняется период тишины, чтобы убедиться в отсутствии дополнительных изменений класса.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки