在近五年的開發之后,Dropwizard的Java RESTful Web服務框架發布了1.0.0版本,它提供了一系列的新特性,并提供了支撐Java API的最新版本。
在這個里程碑發布版本中,包含了如下的特性:
對Java 8的完全支持 支撐軟件的最新版本,例如: Apache HTTP ClientGuavaHibernate (pull request ) HSQLDBJacksonJetty (pull request )在他們Web站點的發布說明上,能夠看到完整的列表。
在Web站點上,Dropwizard是這樣定義的:
Dropwizard是一個Java框架,用于開發運維友好、高性能、RESTful的Web服務。
Dropwizard被組織成了一系列的模塊:
Dropwizard Core(大多數應用都需要的內容) Dropwizard Client(Apache HttpClient和Jersey Client) Dropwizard JDBI(管理對JDBI的訪問) Dropwizard Migrations(針對Liquibase的包裝器) Dropwizard Hibernate(管理對Hibernate的訪問) Dropwizard Authentication(提供基于基本認證或OAuth的認證功能) Dropwizard Forms(通過Jersey,提供對multipart表單的支持) Dropwizard Validation(包含了Hibernate Validator) Dropwizard Views(FreeMarker和Mustache)另外,還提供了針對Dropwizard的Scala支持。
起步
起步指南提供了概述,包含了構建基本“hello, world!”應用的詳細指導。這個指南推薦使用Maven來構建應用,但是其他的構建工具如Ant、Gant、Gradle或SBT也可以使用。
如下的Maven命令會按照交互模式生成基礎的Dropwizard應用:
mvn archetype:generate -DarchetypeGroupId=io.dropwizard.archetypes -DarchetypeArtifactId=java-simple -DarchetypeVersion=1.0.0正確地回答這些提示問題非常重要,比如:
$groupId:用于源碼的打包,比如com.example或io.dropwizard,它會作為$package的默認值;
$artifactID:用于生成應用的根目錄,比如dropwizard-1.0.0;
$version:默認值是1.0-SNAPSHOT; $package:默認值是通過$groupId的值讀取到的; $name:按照駝峰規則的名稱,比如HelloWorld。這樣的話會生成HelloWorldApplication.java和HelloWorldConfiguration.java,它們擴展自基礎類,分別是Application.java和Configuration.java。在文檔剩下的步驟完成后,這個樣例就可以在用戶本地的機器上運行了,使用http://localhost:8080/hello-world?name=Michael+Redlich這樣的URL,將會得到如下的服務器響應:
我們在GitHub上可以找到針對數據庫版本的“hello, world!”應用。
更為復雜的樣例
Al Scott創建過更為復雜的應用,他是Campspot的開發領導,并且還是Atomic Object博客(Atomic Spin)的長期貢獻者。他撰寫過由三部分所組成的博客系列,分別實現了認證、授權和多租戶功能,用來闡述Dropwizard的相關特性。因為Scott的系列文章是基于Dropwizard 0.9.x編寫的,所以InfoQ與他進行了交流,探討了他對這次里程碑版本發布的看法。
InfoQ:你為什么會鐘情于Dropwizard?
Al Scott:在我的職業生涯中,曾經使用過多個不同的Web平臺,但是沒有一個像Dropwizard這樣高效。所有的組件都堅若磐石并且經過了深思熟慮,所以,我能夠集中精力完成自己的事情。如果需要深入框架源碼來了解某些功能是如何實現的話,你會發現這是非常有趣的事情,因為Dropwizard的源碼可以說是我見過的最棒和最易于理解的代碼。另外,我還很欣賞這個框架的整體穩定性。更新通常會帶來豐富的特性,這些特性能夠以最小的破壞性非常便捷地進行運用。底層的核心庫(Jersey、Jetty、Jackson和Hibernate)也非常穩定,所以當版本變更的時候,很少會有較大的意外出現。
InfoQ:在開發RESTful Web服務方面,Dropwizard與其他Java框架的區別是什么?
Al Scott:我認為,構建和運行過程的簡潔性是讓Dropwizard與眾不同的關鍵所在。我曾經見識過各種Spring MVC和Tomcat/Websphere的搭建過程,Dropwizard只需一個pom文件,并且能夠得到一個可直接運行的jar文件,對于這種方式,我是非常欣賞的。在運維方面,這一點意義重大,因為這會讓服務的部署過程變得非常簡單,不必再去處理繁瑣的WAR文件和復雜的XML配置。另外,我比較欣賞的一點就是Dropwizard沒有偏離其底層庫的初衷,在能夠提供幫助的地方,它進行了一些很好的抽象,但是整體而言保持了這些庫的原貌,所以我們可以很容易地按照這些底層庫的文檔來使用它們。
InfoQ:在升級到Dropwizard 1.0的過程中,你的示例應用受到過什么負面的影響嗎?
Al Scott:針對我的博客文章所創建的Github repository其實已經更新到了Dropwizard 1.0。這大約耗費了10分鐘的時間,其中有個接口io.dropwizard.auth.Authenticator有所變更。原來它使用的是Guava的optional類,現在改成了Java 8內置的Optional。在升級生產環境的應用時,我也遇到過類似的情況,生產環境的應用所對應的代碼庫會更大一些。在生產環境中,我遇到的唯一一個問題就是需要添加一個我們所使用的logging appender,它目前還沒有轉換到1.0的版本中。整體的升級非常簡單,我實在想不出大家不盡快進行升級的理由。
InfoQ:在升級在Dropwizard 1.0版本之后,你的示例應用有機會進行一些增強嗎?
Al Scott:在我們的生產環境應用中,我們一直比較喜歡的是資源方法(resource method)對返回值的校驗。另外,對Java 8支持的增強也是非常棒的,在原來的一些場景中,我們必須要使用Guava Optionals和Joda time,現在就可以直接使用Java 8中對應的特性了。
在生產環境采用Dropwizard的組織包括:
Dropwizard提供了一個供我們學習的用戶指導,另外他們還鼓勵開發人員通過訪問Dropwizard GitHub的repository來為這個項目作出貢獻。
查看英文原文:Dropwizard Java REST Framework Version 1.0.0 Features Updated Library Support, Scala, and Java 8