Spring Boot 1.3 发布,包含 DevTools 和 ASCII Art 特性

  • Matt Raible
  • 张卫滨

2015 年 12 月 9 日

话题:JavaDevOps语言 & 开发

Spring 的管理者 Pivotal 公司发布了 Spring Boot 1.3,它为 Java 类 /Spring 配置新增了热重载功能(使用了一个新的spring-boot-devtools模块)、缓存自动配置(支持 EhCache、Hazelcast、Infinispan、JCache、Redis 和 Guava),并且还能为 Linux/Unix 提供完全可执行的归档文件。这个版本的发布说明详细描述了这些变化。

一个非常有意思的特性就是在 banner.txt 中可以包含彩色的 ANSI 编码。这样当应用启动的时候,就能在你的控制台上展现艺术化的信息了。例如:

或者参见最新释放的 JHipster:

如果你希望通过这个特性发挥一下创造性的话,Craig Burke 为 Spring Boot 创建了一个图片到 ascii-art 的转换器

InfoQ 邀请到了 Spring Boot 团队中的主要贡献者 Dr. Dave Syer、Phillip Webb、Stéphane Nicoll、Andy Wilkinson 和 Josh Long,针对这个发布版本,举行了一个 Q&A 交流。

InfoQ:看起来,Spring Boot 是一个很流行的项目。对于 Java 社区对它的反应,你们应该感到很开心吧?

Spring Boot 团队:非常开心!我们认为有两个原因推动了 Spring Boot 的流行。第一个原因是 Java 8 在一定程度上触发了 Java 的重新崛起。与 Java 7 相比,使用 Java 8 编码要有趣得多!第二个原因在于 Spring Boot 构建在一个巨大的基础之上。Spring 生态系统很大,许多人可能没有太多的时间了解每个不同的项目。通过快速上手和简单尝试,我们能够让您着重体验到那些原本会忽略掉的特性。关于这一点,我们有一个很好的例子,就是 Spring Data + Hibernate + 内存 DB。通过移除所有显式的配置,能够非常容易地展现 Spring Data Repository 的真正威力。您能够实现动态语言级别的生产率,同时还能具备 JVM 的类型安全、并发、稳定性以及性能。

InfoQ:在 Spring Boot 1.3 中,你最喜欢的特性是什么?

Spring Boot 团队: 在内部,我们曾经开玩笑说,我们花了八个月的时间开发 devtools、缓存、metrics 以及更加自动化的配置等特性,但是人们最喜欢的是——彩色的 banner!可能最独特的特性,也是在其他地方我们所没有见过的就是完全可执行的 JAR。通过简单地输入“ln -s”就能创建 unix 服务也是非常棒的。

InfoQ:这次看起来是一个很大的发布版本,为什么不将其称为 2.0 呢?

Spring Boot 团队:Spring Framework 在版本号方面上是非常保守的,在十多年的发展后,它的版本号才是 4。我们想延续这一传统,同时也想说明,对于大多数人来说,这次的升级不会带来很多的痛苦。当 Spring 5.0 出来之后,我们将会发布 2.0 版本,同时,它的最低需求是 Java 8.

InfoQ:你们有没有计划减少 Spring Boot 应用所占用的内存?

Spring Boot 团队:针对 Spring 应用所报告的内存,有时候会有一定的误导性。我们过去曾经见过误报的报告,实际上是内部缓存在消耗内存,并且它们还没有被 GC。例如在 Spring Boot 仓库中的 Freemarker 样例应用,在 Java 8 下使用 -Xmx32MB 配置就能运行得很好(当然,它确实还使用了一些非堆内存)。在 Spring Framework 中,对缓存逻辑的优化最近确实也在进行,并且还有计划对其进行重新考虑。读者所共享的所有消耗大量内存的样例应用都会为我们提供帮助。

InfoQ:在云环境中(如 AWS、Cloud Foundry、Heroku),组织(部署、监控、替换)Spring Boot 微服务流程的最佳方式是什么?

Spring Boot 团队:Spring Boot 在各个地方都运行得非常好,包括 Heroku、OpenShift、Google Cloud、Oracle Cloud、Azure 等等,关于如何在这些平台上运行 Spring Boot(以及通常常见的 Spring Cloud)应用都有公开的博客文章和访谈。在 Spring Boot 的参考手册中,我们甚至编写了针对几个大型云平台的操作步骤。如果你试图组织自己的流程和平台(最好不要这样做),那么你会发现我们已经在 http://spring.io/guides上提供了将 Docker 和 Spring Boot 集成在一起的指南。

对于大多数人来说,我们强烈认为 Cloud Foundry 是具有极大优势的,只需简单地执行cf push -p foo.jar foo,你的工作就完事了。Spring Cloud 团队已经将 Netflix OSS 和 Pivotal Cloud Foundry 集成在了一起,这也是非常棒的。

InfoQ:你们觉得 Java 9 或 Java 8 中有什么特性能够帮助到 Spring Boot 吗?

Spring Boot 团队:按照 JDK 9 的最终形态,它可能会成为模块化 Spring 应用的基础。Spring Framework 5 将会尽其所能允许应用基于 JDK 9 开发……而 Spring Boot 2 也会如此,尤其是统一基于模块路径(modulepath)启动 JVM,完全避免以前的 classpath。

对 Java EE 8 来说,我们看到 HTTP/2 引起了大家广泛的兴趣。在 Spring Boot 中,虽然现在已经可以使用 HTTP/2 了(Jetty 和 Undertow 已经对其提供了支持),但是 Servlet 4.0 对它的官方支持依然值得期待。其他的 Java EE 8 规范也会根据需求提供支持。我们认为对 JMS 2.1 会有很强烈的需求。Spring Boot 已经提供了对 JCache 1.0 的支持,Spring Framework 也已经支持 Hibernate 5.0 了。我们还需要对 Spring Boot 做些工作,才能使其完全支持 Hibernate 5.0,这有望在 1.4 版本中实现。

InfoQ:你们能给刚刚接触 Spring Boot 的初学者推荐一些视频吗?

Spring Boot 团队:Brian Clozel 和 Stéphane Nicoll 最近做了一个Devoxx 访谈现在已经上线了。这个访谈比大多数的会议录像要长得多,因此能够涉及更多的细节。在 2014 年,Phil Webb 曾经对 Josh Long 做个一个很有意思的访谈,它能够帮助你大致掌握 Spring Boot 的特性,Josh 还曾经做过一个很棒的个人演讲,它位于 vimeo 网站上,更加关注的是微服务的主题。

InfoQ:对于 Spring Boot 的高级用户,你们有什么要推荐的视频吗?

Spring Boot 团队:Nicholas Frankel 的Spring Boot for DevOps上有很多有用的信息,涵盖了高级用户可能会感兴趣的一些扩展点。除此之外,我推荐看一些关于 Spring Cloud 的讨论。Dave Syer 和 Josh Long 有一个很棒的入门访谈,你还应该看一下 Jon Schneider 和 Taylor Wicksell 对 Spring Cloud 和 Netflix 的讨论(这是在今年的 SpringOne2GX 会议上得票最多的讨论之一)。

InfoQ:在 start.spring.io 上,是否收集到了用户选择哪个 starter 的统计数据呢?如果收集到的话,你们有什么可以分享的吗?

Spring Boot 团队:是的,我们收集到了统计数据,并且在最近的一篇博客文章中进行了描述。基于 Maven 并且使用 jar 作为打包方式的 Java 8 工程占据了主导地位。start.spring.io每个月平均会生成 50,000 个项目,我们计划推出更多的定期统计数据。

InfoQ:在 Spring Boot 1.3 中,彩色的 banner.txt 是一个很有意思并且很好玩的特性。那么你们有没有计划彩色打印日志,不同的日志级别显示为不同的颜色?

Spring Boot 团队:在 1.3 版本中已经支持根据日志级别改变颜色。在默认控制台日志配置中,我们为不同的级别设置了颜色:INFO 是绿色的,WARN 是黄色的,而 ERROR 是红色的。如果使用 %clr 转换词的话,我们可以改变整行的颜色。大致如下所示:

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx})

我们默认没有启用它的原因在于,在一些终端主题中,这会使得日志很难阅读。

InfoQ 还与 Julien Dubois 进行了交流,他是JHipster的创立者,JHipster 会使用 AngularJS 和 Spring Boot 来创建项目。Dubois 是 Spring Boot 的长期用户,作为高级用户,我们希望他会有一些独特的视角。

InfoQ:您是什么时候开始使用 Spring Boot 的呢?

Julien Dubois:JHipster 启动的时间要比 Spring Boot 早几个月,我们有一些最初的目标非常类似于当前 Spring Boot 所提供的功能。

在 2013 年的 11 月,我与好友 Josh Long 共进午餐,当时他正在巴黎休假。当我们在星巴克喝咖啡的时候,他向我介绍了 Spring Boot:我马上认识到它能够给 JHipster 带来很大的帮助,Spring Boot 替换了我们自定义的 Spring 代码,这是项目的一个巨大进步。两年后,我可以很高兴地说这是一个正确的决策!

InfoQ:在 Spring Boot 的不同版本间进行升级的时候,您有什么经验吗?

Dubois:升级 Spring Boot 版本通常会耗费一些时间,这是因为我们与它进行了紧密的集成。我们使用了 Spring Boot 所提供的 Maven BOM(Bill Of Materials),所以需要检查对其进行升级时,我们的功能是否能够正常运行:通常这不会有什么问题,但我们有一些第三方依赖,所以可能会出现问题,这需要我们指定依赖的具体版本号。新的 Spring Boot 版本也会提供新的特性,如新的健康检查和自动化配置:在这种情况下,我们的主要任务是与其进行集成,移除完成相同功能的已有代码,我们可能会在此之上添加一个图形化的界面。

一个很好的例子就是 Spring Boot 1.3 所提供的对 Cassandra 的支持,来自 JHipster 的代码也包含在了 Spring Boot 中。显然,我们需要删除掉所有来自 JHipster 的代码并使用 Spring Boot 所提供的代码!对我们来说,这是很好的事情,因为这种技术化的代码显然不应该在 JHipster 的范围内,只有没有更好的解决方案时,我们才会将其添加到我们的项目中。

InfoQ:在 Spring Boot 1.3 中,你最喜欢的特性是什么?

Dubois:在 Spring Boot 1.3 中,有一个属性我非常喜欢,那就是新的 devtools!!!在开发 JHipster 的时候,我们曾经非常艰苦地实现热重载功能:可以看一下我们的 JHipster Loaded 项目,它现在已经消亡了,参见https://github.com/jhipster/jhipster-loaded。这涉及了很多的工作,我们为此花费了数周的时间,最终的结果却是依然有很多 bug。新的 Spring Boot devtools 很漂亮地解决了这个问题,并且没有那么多的 bug!对于我们的终端用户来说,整体的体验非常棒,因为他们可以通过 BrowserSync 实现前端更新,同时还能通过 Spring Boot devtools 实现后端更新。这能够带来非常好的体验,所有的内容都能随时自动更新,这使用起来非常棒,对于来自传统 Java 开发环境的人来说,这简直就是一种惊喜。

InfoQ:您有什么特殊的特性希望添加到 Spring Boot 中吗?

Dubois:对我来讲,这是在 Spring 中长期存在的一个问题,那就是我希望有更短的启动时间。Devtools 在开发阶段实现了这一点,但是对于很多云提供商来说,启动时间也是很重要的。例如,有些 Spring bean 可以异步启动:实际上,这也是我们为支持 Liquibase 所采用的手动编码的方式,这使我们的启动时间下降了 40%。当然,它可以更加智能一些,以最佳方式使用所有可用的 CPU 核心。

查看英文原文:Spring Boot 1.3 Released Featuring DevTools and ASCII Art

JavaDevOps语言 & 开发