SpringOne 会前访谈:Josh Long 谈 Spring 发展

  • 丁雪丰

2012 年 11 月 13 日

话题:Java语言 & 开发架构

SpringOne 大会今年首次落户中国,将会于 12 月 7-8 号在北京召开,大会结合了 Spring 和 Cloud Foundry 大热门技术,将会针对于 Spring 的最新发展、Spring 在移动、大数据领域的应用等做主题分享,你可以通过这里进行报名。InfoQ 就 Spring 以及 Spring Integration、Spring Batch 的发展采访到了 Spring 社区专家 Josh Long。

InfoQ:在中国,Spring 被广泛运用于大大小小的项目之中,但开发人员对 Spring 的子项目并不是很熟悉。您能否向我们简单介绍一下 Spring Batch 和 Spring Integration?开发人员为何要去使用它们?

Josh:核心的 Spring 框架提供了组件模型,在此之上,诸如 Spring Security、Spring MVC、Spring Integration、Spring Batch 和 Spring Data 之类的子项目更加专注于具体领域的解决方案。我们可以独立于核心组件模型之外,根据用户要求来发展这些框架。

Spring Integration (SI)

SI 在 Spring 编程模型的基础上进行了扩展,以此来实现 Bobby Woolf 和 Gregor Hohpe 的名作《Enterprise Integration Patterns》(企业级集成模式)中所述的模式。这些模式是从数十年间的消息传递、基于事件和基于集成的解决方案中演绎而来的,这些解决方案被用来支持多系统间的通信,鼓励使用更加以消息为导向的方法进行架构设计。SI 可在基于 Spring 的应用程序中实现轻量级消息传送,还有针对 FTP、SFTP、FTPS、文件系统、JMS、AMQP、SOAP、REST 和 TCP/IP 的声明式适配器,支持通过它们与外部系统进行集成。在 Spring 所支持的远程访问、消息传送和任务调度基础上,这些适配器提供了更高一层的抽象。Spring Integration 的主要目标是提供一个简单的模型来构建企业级集成解决方案,同时还要保持分离关注点,这对编写出易维护、可测试的代码至关重要。 敬请访问 http://springsource.org 了解更多信息。

Spring Batch

批处理似乎每十年就要彻底改造一次,从运行 COBOL 和 CICS 的大型机,到 Unix CRON 作业,再到如今的 Java 等现代语言,无不体现这一点。它显然依旧是最难写好的代码之一,因为那些十分严重的错误可能需要几分钟、几个小时、几天乃至几周才能被找出来。

在企业级系统的所有代码当中,这种代码是最不适合自行定制的。对此,应改用 Spring Batch;Spring Batch 支持使用各种各样的技术来处理大型数据集,其中包括 JDBC、文件(XML、各种风格的 CSV、以制表符分隔的文件、固定宽度文件,等等)以及消息代理。

Spring Framework 的高生产率、基于 POJO 的开发方式以及易于使用的特性已广为人知,Spring Batch 正是构建在此基础之上,使开发人员在需要时可以轻松地访问和利用更加高级的企业级服务。Spring Batch 提供了对于处理大量记录至关重要的多项可重用功能,包括日志记录 / 跟踪、事务管理、作业处理统计、作业重启以及资源管理。它还提供了更加高级的技术服务和特性,它们能通过优化和分区技术实现超高处理量且性能极为优异的批处理作业。无论是简单的批处理作业,还是复杂的、处理量极高的批处理作业,都可以通过高度可扩展的方式利用此框架来处理大量信息。

敬请访问 http://springsource.org 了解更多信息。

Spring Data(HadoopJPARESTMongoDBNeo4jGemFireRedis) 借助 Spring Data,可以更加轻松地构建如下应用程序——基于 Spring 之上,使用了非关系数据库、map-reduce 框架以及基于云的数据服务之类的新型数据访问技术,并对关系型数据库技术提供更出色的支持。如今的开发人员破天荒头一遭有了一系列功能强大、多样且专业化的数据库技术,这些技术可满足众多使用场景的需要——包括经优化的数据库处理速度、专业化的数据类型(关系数据、面向图形的数据库、文档结构、键 / 值对,等等)。

Spring Data 构建于核心 Spring 框架提供的惯用法(Idiom)和支持之上,支持基于 JDBC 系统的数据访问逻辑,还提供了用法相近、专门针对特定解决方案的库,用来处理 MongoDB、基于 JPA 的资源库、Redis、Neo4J 等数据存储。此外,Spring Hadoop 还为编写利用 Spring、Spring Batch 和 Spring Integration 功能的 Apache Hadoop 应用程序提供了支持。

敬请访问http://springsource.org 了解更多信息。

SpringSource.org 上还有诸多其他精彩项目,如 Spring Roo;敬请访问 http://springsource.org 了解更多信息。

如果您想了解 SpringSource 提供的更多库和框架,请参考 github.com/SpringSource,很多项目都云集于此。

InfoQ:Spring MVC 为我们提供了绝佳的 REST 支持,但它并不支持 JAX-RS,为何不让它兼容 JAX-RS ?

Josh:当初为 Spring MVC 增加 REST 支持的动机是让了解 @Controller 组件模型的 Spring MVC 用户通过熟悉的方式使用强大的 REST 功能。通过保持标准无关性,我们也可以不断地发展编程模型,从而跟上用户前进的脚步。

有关这方面的更多信息,请参见 http://blog.springsource.org/2009/03/08/rest-in-spring-3-mvc/

http://blog.springsource.org/2009/03/08/rest-in-spring-3-mvc。除了 Spring MVC 的 REST 支持,我们还有很多东西,例如 Spring HATEOAS,它能用来实现 HATEOAS 风格的 REST 服务;Spring Security OAuth,它支持使用 OAuth 来保护基于 REST 的 API;Spring Data REST,借助它可以非常轻松地将 Spring Data 资源库(这些资源库支持针对 JPA、MongoDB、Neo4j、GemFire 等存储的数据访问逻辑)作为关联数据的 REST 终端公布出来。确实需要 JAX-RS 支持的开发人员会发现,大多数(就算不是全部)JAX-RS 实现都已经提供了对 Spring 的支持。

InfoQ:很多开发人员都会碰到必须在 Jersey 与 Spring MVC 间作出选择的情况。在您看来,Spring MVC 为何优于 Jersey?

Josh:严格说来,这其实并不是在 Spring MVC 与 Jersey 间作出选择,而是在 Spring MVC 对 REST 的支持与 JAX-RS 对 REST 的支持间进行选择。正如在第 2 个问题中所讨论过的那样,Spring MVC 的组件模型更适合 Spring 开发人员,并且为目前和未来的应用程序都提供了最佳的选择。开发人员可以自由地将 Jersey 或诸如 CXF 和 RestEasy 等其他 JAX-RS 实现与 Spring 搭配使用,因为它们都支持与 Spring 集成。

InfoQ:Spring 正尝试进军移动开发领域,它会像在 Java EE 领域那样再度一鸣惊人吗?

Josh:Spring 提供的移动支持主要是服务器端对移动客户端的支持。例如,借助 Spring Mobile,可以轻松地支持多客户端感知(multi-client aware)的 Web 应用程序,而 Spring 的 REST 支持则提供了一套合理的解决方案,来实现针对不同客户端的数据访问。我们有一个名为 Spring Android 的项目,它支持与有 OAuth 保护的服务提供方、RESTful 服务和 Spring Social 提供的社交类服务提供方(比如 Twitter)进行基于 Android 的通信。我们将继续跟进基于原生代码及基于 HTML5 的移动应用程序领域的发展动态,并根据情况在服务器和客户端上提供支持。

InfoQ:在 Spring 及其子项目中是否为 Cloud Foundry 进行了特殊优化?开发人员可以选择在 PaaS 或自己的服务器上运行他们的 Spring 项目,这两种运行方式是否有区别?PaaS 将给 Spring 带来哪些优势?

Josh:Spring 在所有 Java PaaS 上都可以非常顺畅地运行,因为它的一个核心价值主张就是依赖项注入;依赖项注入是一种信息隐藏方式,可自然而然地解除应用程序与它们所使用的基础架构服务(如数据库、消息队列等)之间的耦合。在最近的 Spring 版本中,这种支持得到了更进一步的发展。

Profiles 就是一个例子(它是在 Spring 3.1 中引入的),该特性支持创建可感知环境的配置。例如,您可以在同一 Spring 应用程序内为不同环境定义关系数据库数据源:在开发期间定义嵌入式 H2 数据库,在生产期间定义 PostgreSQL,等等。此外,如今的云应用程序通常都支持多种语言,并且涉及更加多样化的技术,例如 NoSQL 数据存储和诸如 RabbitMQ 之类的消息存储。Spring 的独特之处在于,它通过 Spring Data、Spring AMQP 和 Spring Integration 等项目为这些需求提供了丰富的支持。

也就是说,我们认为 Cloud Foundry 确确实实为很多基于 Spring 的应用程序提供了一个强大的平台,因为它有专门针对 Spring 的 Bean 识别机制,能与该平台提供的各种“服务”(至少有 MongoDB、Redis、PostgreSQL、MySQL 和 RabbitMQ)协同工作,这与 Cloud Foundry 提供专门针对 Ruby on Rails、Lift、Play 和 Node.js 的识别机制并无二致。有一个 cloudfoundry-runtime 库包含专门针对 Spring 的 XML 命名空间和 Java 配置 API,尽管在很多情况下都不需要此库,但利用它可以在 Spring 应用程序中更加轻松地使用 Cloud Foundry。例如,如果您在 Cloud Foundry 应用程序中置备并绑定了一个 MongoDB 实例,然后部署了一个有 MongoDB Mongo 对象的应用程序,那么 Cloud Foundry 可以智能地将该 Mongo 对象的定义替换成指向所置备的 Cloud Foundry MongoDB 实例的定义。这种支持称作“自动重新配置(auto reconfiguration)”,也适用于采用其他语言和框架(如 Play 和 Lift、Node.js、Sinatra 以及 Ruby on Rails)编写的应用程序。 如果开发人员(包括 Spring 开发人员)希望利用“平台即服务”的弹性及活力,又不想被束手束脚,同时还想从丰富的语言、框架及服务(由大量获得了开源 Cloud Foundry 代码的生态系统厂商为其量身定制的服务)组合中受益,那么 Cloud Foundry 自然是他们的不二之选。尤其是使用 Spring 和 Grails 的 JVM 开发人员更会感到喜悦,Cloud Foundry 支持在 Apache Tomcat 和命令行进程中的 Java 应用程序,这是 Web 应用程序、像 Spring Integration 这样的集成解决方案、Spring Batch 这样的批处理和离线处理解决方案,以及 Spring Data、Spring Hadoop 这样的大规模专业化数据解决方案的理想环境。

InfoQ:像 Spring Batch 和 Spring Integration 这样的子项目是否可以同样顺利地运行 Cloud Foundry 以外的 PaaS 上,比如 OpenShift?

Josh:这完全取决于 PaaS,但如果进行一些简单的搜索,搜索结果会显示 Spring 可在 CloudBees、CloudFoundry、Heroku、Google App Engine 等平台上运行。现代 Spring 应用程序在大多数 PaaS 平台上都运行得奇好无比,除了要求 Java 语言为第 5 版(或更高版本)之外,对基础平台并无其他要求。在当今 PaaS 中支持的众多应用服务器上,Spring 都能正常工作,且具备可移植性,这些应用服务器不仅是 Jetty 和 Apache Tomcat,还包括 GlassFish 和 JBoss AS 这样的 Java EE 应用服务器。OpenShift 支持 JBoss AS,Spring 可以在 JBoss AS 上以可移植且一致的方式运行。Google App Engine 支持 Jetty,Spring 则是唯一可在 Jetty 和 Apache Tomcat 等较轻量级应用服务器上运行的企业级 Java 解决方案(和 Cloud Foundry 上的支持一样)。从很多方面来讲,Spring 都是这些平台的理想解决方案,因为它解除了应用程序与底层平台的耦合。

InfoQ:Spring 后续的发展规划是怎么样的,下几个小版本里会做些什么,什么时候能看到下一个大版本 4.0?

Josh:通过各个项目的 JIRA(网址为 jira.springsource.org),可以轻松地跟踪这些项目,包括核心的 Spring 框架。Spring 3.2 是核心 Spring 框架的下一发行版,它包括很多新增特性,例如异步 @Controller 方法、基于 JCache 的 Spring Cache API 缓存集成、改进过的测试框架、还修复了很多缺陷,等等。您可以参考 Adrian Colyer 在“SpringOne”大会上就“新的应用程序体系结构”所发表的主题发言,以及他就 Spring 的未来方向所撰写的博文。该主题发言很快就会发布在 springsource.org 上,发言内容探讨了“新的应用程序体系结构”,着重阐述以下方面:

  • 智能数据:对大量的非结构化数据执行快速查询
  • 智能云:“推送到云”(Push to Cloud)模型、服务质量、弹性、可扩展性
  • 智能客户端:支持由 HTML5、REST 和 HATEOAS 驱动的用户界面
  • 架构演变:从服务器端应用程序向“应用程序和服务”发展

VMware 云应用服务部的首席技术官 Adrian Colyer 表示:“Spring 一直都致力于提供灵活部署的能力。在以前,这种灵活性体现在提供了多种应用服务器供用户选择,但现在则扩展为提供多种云平台供用户选择,其中包括我们自己的 Cloud Foundry™、Amazon、Google、Heroku,等等。新的 Spring 项目使企业数据的开发变得更加简单了:这一点曾经体现在提供了多种关系型数据库访问方法供用户选择,但现在 Spring 又提供了一系列 NoSQL 存储、Hadoop/ 批量数据处理、内存数据网格功能,甚至还有内置的应用程序集成。”

Spring 是企业级 Java™ 最为流行的应用程序开发框架。Zero Turnaround 出台的“2012 年开发人员工作效率报告”通过 1,100 次侧重于 Java 的调查收集了 1,800 多名调查对象对“开发人员生活”的看法,最终 30% 的受访者认为 Spring MVC(模型、视图、控制器)是领先的 Java Web 框架。例如:

  • 调查结果中排名前三的应用程序框架中就有两个是 SpringSource 提供的:56% 的受访者使用 Spring,Hibernate 以 54% 的采用率紧随其后,Spring AspectJ 的采用率为 13%,排在第三位
  • Java Persistence API (JPA) 以 44% 的采用率位列第一,从而为 Spring Data 开辟了一个坚实的市场
  • Apache Tomcat 在调查结果中占据绝对优势,有 59% 的受访者选择此应用程序服务器 / 容器。SpringSource 的提交者们为 Apache Tomcat 贡献了大量代码,而 Spring vFabric™ 则是完全基于 Tomcat 6+ 构建的。
  • SpringSource 的 Groovy 语言也以 17% 的采用率居于“备选 JVM 语言”榜的榜首。Spring 将一如既往致力于解决企业级开发领域最前沿的问题 Spring Data 提供了快速灵活的海量数据处理,内置了 NoSQL、Hadoop 及内存数据网格支持;Spring Batch 和 Spring Integration 提供了数据处理和集成的支持;能够部署到内部或外部的各种平台上——包括 CloudFoundry、Amazon Elastic Beanstalk 和 Google App Engine。

很难说达到怎样的条件才算是一个主要版本。日益明显的趋势是,主要的新增功能都以基于 Spring 框架核心设施的子项目形式加以提供,例如 Spring Integration 和 Spring Data。

从这个意义上讲,Spring 本身尽快再度大举增加功能已经不太重要了,因为通过具体的子项目往往可以更巧妙地满足当今应用程序的需求。4.0 将何时推出以及将包含哪些功能也很难说。Spring 负责人 Juergen Hoeller 以及核心 Spring 团队一直在努力开发和完善 Spring 3.2,RC 系列的开发工作也已在进行中了。

Java语言 & 开发架构