现在的位置: 首页 > 综合 > 正文

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

2013年10月09日 ⁄ 综合 ⁄ 共 9363字 ⁄ 字号 评论关闭
Josh Long - 开发人员技术布道师
   
   
Josh Long

Josh Long 担任 Spring 开发人员技术布道师。Josh 是 Apress 出版社出版的《Spring Recipes》第 2 版的首席作者,也是 SpringSource 的提交者和贡献者。他在埋头编写代码之余,也会现身于当地的 Java 用户群或当地的咖啡店。Josh 喜欢能够突破所用技术的解决方案。他感兴趣的领域包括可扩展性、BPM、网格处理、移动计算以及所谓的“智能”系统。他在

blog.springsource.org
joshlong.com 建有博客。

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 DataHadoopJPARESTMongoDBNeo4jGemFireRedis
借助 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 或诸如 CXFRestEasy 等其他 JAX-RS 实现与 Spring 搭配使用,因为它们都支持与Spring 集成。

Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service。此外Jersey还提供一些额外的API和扩展机制,所以开发人员能够按照自己的需要对Jersey进行扩展。

Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对
JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。  Apache
CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend
编程
API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring
进行无缝集成

RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTful Web Services和RESTful Java应用程序。它是JAX-RS规范的一个完整实现并通过JCP认证。作为一个JBOSS的项目,它当然能和JBOSS应用服务器很好地集成在一起。但是,它也能在任何运行JDK5或以上版本的Servlet容器中运行。RESTEasy还提供一个RESTEasy JAX-RS客户端调用框架。能够很方便与EJB、Seam、Guice、Spring和Spring
MVC集成使用。支持在客户端与服务器端自动实现GZIP解压缩。

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 都是这些平台的理想解决方案,因为它解除了应用程序与底层平台的耦合。

红帽OpenShift:一个面向开源开发人员开放的平台即服务(PaaS),红帽OpenShift通过为开发人员提供在语言、框架和云上的更多的选择,使开发人员可以构建、测试、运行和管理他们的应用,从而重新定义了 PaaS市场。以红帽全面的JBoss专业知识为基础,OpenShift凭借创新的特性(包括CDI)领导PaaS市场,并支持Java
EE 6,从而将PaaS的能力扩展到更丰富和更苛刻的应用。建立在红帽开源领导地位基础上的OpenShift旨在终结PaaS的厂商锁定,使用户可以选择自 己应用运行在哪个云提供商的云中。OpenShift将作为在线服务来提供。   Hurwitz and Associates总裁兼CEO Judith Hurwitz说:“云计算开始改变开源开发者编写和提交应用的方式。因此平台及服务的市场开始快速扩张。红帽的OpenShift将通过为开发人员提供多种开发和部署选择,来帮助他们。”

CloudBees:CloudBees云的实质是Tomcat和MySQL,不过一些经过紧密整合的第三方数据库也可以使用。比如Cloudant提供了CouchDB服务,MongoHQ提供MongoDB数据库服务。

Heroku:Heroku 的网格本身建于一个强大的云计算环境中,这样它可以根据需要的dyno数量方便地进行扩展或者缩减。网格上层是一个成熟的高并发路由网络,它承担了把请求分派至dyno的工作。还有一些额外的元件,比如HTTP cache和memory cache,它们分别用来减少对dyno和数据库的访问。

VMware CloudFoundry:Cloud Foundry为开发者构建了具有足够选择性的PaaS云平台,它同时支持多种开发框架、编程语言、应用服务以及多种云部署环境的灵活选择,其主要特点如右图所示



Google App Engine:

Google App Engine 是一种让您可以在 Google 的基础架构上运行您的网络应用程序。Google App Engine 应用程序易于构建和维护,并可根据您的访问量和数据存储需要的增长轻松扩展。使用 Google App Engine,将不再需要维护服务器:您只需上传您的应用程序,它便可立即为您的用户提供服务

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 vFabric:

             vFabric Suite 是一款面向数据密集型自定义应用的轻量级、可扩展的集成中间件套装,可在内部或云中使用。 vFabric 针对全球超过 50% 的 Java

             开发人员使用的开源代码
Spring Framework
进行了优化,不但非常适用于 VMware vSphere 虚拟基础架构,而且还为您的自定义应用提供了一条通往云计算的明确途径。

         备选 JVM 语言: Jython、 JRuby、 Clojure、 Groovy、 Scala、  Fantom、 Ceylon、 Rhino、 MyFaces Core、 Griffon、 JetBrains、 Jacl、 kotlin ... ...

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

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

丁雪丰 是InfoQ中文站编辑,满江红翻译组核心成员,出版过《Spring攻略》、《JRuby实战》等多部译著。主要关注领域:企业级应用、海量数据计算、动态语言应用等。

【上篇】
【下篇】

抱歉!评论已关闭.