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