20.5、远程应用

Spring Boot 开发者工具不局限于本地开发。在远程运行应用时也可以使用许多功能。远程支持功能是可选的,如果要启用,您需要确保在重新打包归档文件时包含 devtools

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <configuration>
  7. <excludeDevtools>false</excludeDevtools>
  8. </configuration>
  9. </plugin>
  10. </plugins>
  11. </build>

之后您需要设置一个 spring.devtools.remote.secret 属性,如下:

  1. spring.devtools.remote.secret=mysecret

警告

在远程应用上启用 spring-boot-devtools 是存在安全隐患的。您不应该在生产部署时启用它。

远程 devtools 支持分为两部分:接受请求连接的服务器端端点和在 IDE 中运行的客户端应用。当设置了 spring.devtools.remote.secret 属性时,服务器组件将自动启用。客户端组件必须手启用。

20.5.1、运行远程客户端应用

假设远程客户端应用运行在 IDE 中。您需要在与要连接的远程项目相同的 classpath 下运行 org.springframework.boot.devtools.RemoteSpringApplication。把要连接的远程 URL 作为必须参数传入。

例如,如果您使用的是 Eclipse 或 STS,并且有一个名为 my-app 的项目已部署到了 Cloud Foundry,则可以执行以下操作:

  • Run 菜单中选择选择 Run Configurations...​。
  • 创建一个新的 Java Application launch configuration。
  • 浏览 my-app 项目。
  • 使用 org.springframework.boot.devtools.RemoteSpringApplication 作为主类。
  • https://myapp.cfapps.io 作为 程序参数 (或者任何远程 URL)传入。

运行的远程客户端将如下所示:

  1. . ____ _ __ _ _
  2. /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
  3. ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
  4. \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
  5. ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
  6. =========|_|==============|___/===================================/_/_/_/
  7. :: Spring Boot Remote :: 2.1.1.RELEASE
  8. 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-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)
  9. 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
  10. 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://'.
  11. 2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
  12. 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)

注意

由于远程客户端与实际应用使用的是同一个 classpath,因此可以直接读取应用的 properties。这也是 spring.devtools.remote.secret 属性为什么能被读取和传递给服务器进行身份验证的原因。

提示

建议使用 https:// 作为连接协议,以便加密传输并防止密码被拦截。

提示

如果您需要通过代理来访问远程应用,请配置 spring.devtools.remote.proxy.hostspring.devtools.remote.proxy.port 属性。

20.5.2、远程更新

远程客户端使用了与本地重启相同的方式来监控应用 classpath 下发生的更改。任何更新的资源将被推送到远程应用和触发重启(如果要求)。如果您正在迭代一个使用了本地没有的云服务的功能,这可能会非常有用。通常远程更新和重启比完全重新构建和部署的周期要快得多。

注意

文件只有在远程客户端运行时才被监控。如果您在启动远程客户端之前更改了文件,文件将不会被推送到远程服务器。