天天看點

較好的8個 Java RESTful 架構

 過去的每一年,湧現出越來越多的Java架構。就像JavaScript,每個人都認為他們知道一個好的架構的功能應該是怎麼樣的。在将來的項目中使用哪個 Java RESTful架構完全取決于你目前的需求。為了便于你取舍,我将列出最突出的架構功能,希望這能節省一些你的時間。

誕生時間: 2011

評分: 4.5/5

Dropwizard 提供了穩定成熟的Java庫, 并封裝成一個簡單的輕量級的包。

Dropwizard 介于架構和庫之間。它提供了一個開發web應用程式的全部所需。由于内置子產品化,一個應用程式可以保持小而精幹的特點,減少開發和維護的時間,減少負擔。

Dropwizard 使用已有的 Jetty HTTP 庫,嵌入到你的項目中,無需外部的server。所有的Dropwizard項目都有一個 main 方法來管理内建的 HTTP server.

連結

優點

快速的項目建構和啟動

子產品化

不可思議的快(至少根據内建的 metric 測得的結果)

Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON

也支援其它的庫, 比如 Mustache, Logback, JDBI, Hibernate Validator, Guava, …

使用Metrics支援監控

Main方法啟動 Jetty server,可以容易地調試和維護

社群力度強

缺點

Dropwizard文檔是主要的知識來源,但談不上優秀。你可能需要搜尋和發掘第三方類庫的文檔。

因為某些原因錯誤被當作普通文本, 如果你希望響應結果總是JSON,這可能有問題

確定使用最新的Dropwizard, 一些老版本使用了廢棄的第三方庫。 而且早期的Dropwizzard也很難更新

例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<code>package</code> <code>com.example.helloworld;</code>

<code>import</code> <code>io.dropwizard.Application;</code>

<code>import</code> <code>io.dropwizard.setup.Bootstrap;</code>

<code>import</code> <code>io.dropwizard.setup.Environment;</code>

<code>import</code> <code>com.example.helloworld.resources.HelloWorldResource;</code>

<code>import</code> <code>com.example.helloworld.health.TemplateHealthCheck;</code>

<code>public</code> <code>class</code> <code>HelloWorldApplication</code><code>extends</code> <code>Application {</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args)</code><code>throws</code> <code>Exception {</code>

<code>        </code><code>new</code> <code>HelloWorldApplication().run(args);</code>

<code>    </code><code>}</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>String getName() {</code>

<code>        </code><code>return</code> <code>"hello-world"</code><code>;</code>

<code>    </code><code>public</code> <code>void</code> <code>initialize(Bootstrap bootstrap) {</code>

<code>        </code><code>// nothing to do yet</code>

<code>    </code><code>public</code> <code>void</code> <code>run(HelloWorldConfiguration configuration,</code>

<code>                    </code><code>Environment environment) {</code>

<code>}</code>

注解

個人不想為大的項目推薦這個架構。不過如果你想嘗試的話,你不會失望的。主要是這個架構使用最好的現代的Java web 元件,組裝成一個簡單易用的架構。

不幸的是這也帶來了它的問題。 将這些庫糅合起來可能導緻不可預見的問題。這也是我為什麼給它減掉0.5顆星,而沒有評為滿分5顆星。

誕生時間: 2012 (Jersey 2.X)

評分: 5/5

Jersey RESTful 架構是開源的RESTful架構, 實作了JAX-RS (JSR 311 &amp; JSR 339) 規範。它擴充了JAX-RS 參考實作, 提供了更多的特性和工具, 可以進一步地簡化 RESTful service 和 client 開發。盡管相對年輕,它已經是一個産品級的 RESTful service 和 client 架構。

優秀的文檔和例子

快速

超級容易的路由

平滑的 JUnit 內建

就個人而言, 當開發 RESTful service 時, JAX-RS 實作要好于 MVC 架構。

支援異步連結

不喜歡 servlet container? 使用Jersey的時候可以不用它們。

WADL, XML/JSON support

包含在Glassfish中

Jersey 2.0+使用了有些複雜的依賴注入實作

可能不是一件壞事。Jersey 1.X 使用較老的 JAX-RS 實作

一大堆第三方庫隻支援 Jersey 1.X, 在 Jersey 2.X 不可用

<code>package</code> <code>org.glassfish.jersey.examples.helloworld;</code>

<code>import</code> <code>javax.ws.rs.GET;</code>

<code>import</code> <code>javax.ws.rs.Path;</code>

<code>import</code> <code>javax.ws.rs.Produces;</code>

<code>@Path</code><code>(</code><code>"helloworld"</code><code>)</code>

<code>public</code> <code>class</code> <code>HelloWorldResource {</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>String CLICHED_MESSAGE =</code><code>"Hello World!"</code><code>;</code>

<code>@GET</code>

<code>@Produces</code><code>(</code><code>"text/plain"</code><code>)</code>

<code>    </code><code>public</code> <code>String getHello() {</code>

<code>        </code><code>return</code> <code>CLICHED_MESSAGE;</code>

Jersey 是我的選擇, 5顆星。

誕生時間: 2012

評分: 3.5/5

Ninja Web Framework是全棧的 java web framework。穩定, 快速, 可靠, 産品級.

它提供了開發,測試,釋出,維護 RESTful web應用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).

就像 DropWizzard, Ninja Web Framework 是一個內建的軟體棧。你不必建立你自己的,隻需使用 Maven archetype生成一個新的項目,導入到IDE中就可以開始編碼了。

XML, HTML, JSON渲染

也支援其它的庫 (如 Guice, Logback, Guava, etc.)

很好的資料持久化和緩存

不喜歡 servlet container? U可以選擇你喜歡的容器

如果根本就不喜歡容器,可以使用 standalone 模式, 使用Jetty作為一個自執行的jar

同樣,就像DropWizzard, 文檔有但是不夠好。我花了好長時間去了解它。這個架構也依賴很多其它的庫,有時候想得到所需的資訊很麻煩。

不怎麼出名,社群小。 有謠言說這個架構是由那些切換到Scala的 Play 2.X 使用者建立的

<code>package</code> <code>controllers;</code>

<code>public</code> <code>class</code> <code>ApplicationController {      </code>

<code>    </code><code>public</code> <code>Result index() {</code>

<code>        </code><code>Person person =</code><code>new</code> <code>Person();</code>

<code>        </code><code>person.name =</code><code>"John Johnson"</code><code>;</code>

<code>        </code><code>return</code> <code>Results.json().render(person);</code>

看起來不錯,但是在它成熟之前我還是把它丢在一邊吧。

評分: 4/5

使用Play Framework 很容易地建立,建構和釋出 web 應用程式,支援 Java &amp; Scala。它使用Akka, 基于一個輕量級的無狀态的架構。它應該應用于大規模地低CPU和記憶體消耗的應用。

易于開發

快,但是沒有其它的一些架構快

基于 Netty, 支援非阻塞的 I/O. 并行處理遠端調用的時候很優秀

社群很大

MVC

REST, JSON/XML, Web Sockets, non-blocking I/O

隻需重新整理浏覽器就可以看到最新的改變

支援Async

有出版的書

版本2.0 是最有争議的Java架構。 切換至Switch to Scala made some Java developers outraged.

不向後相容; Play 2.X 重寫了

号稱輕量級,但有些臃腫

SBT建構工具. 号稱 Maven 殺手, 但是從沒有優秀到替換它。難以學習和配置

非 servlet

Breaking changes across releases

<code>package</code> <code>controllers</code>

<code>import</code> <code>play.api._</code>

<code>import</code> <code>play.api.mvc._</code>

<code>class</code> <code>Application</code><code>extends</code> <code>Controller {</code>

<code>  </code><code>def hello(name: String) = Action {</code>

<code>    </code><code>Ok(</code><code>"Hello "</code> <code>+ name +</code><code>"!"</code><code>)</code>

<code>  </code><code>}</code>

抱怨歸抱怨,我還是一直喜歡和首選這個架構。不幸的是,我隻能給它4顆星。我堅信 基于JAX-RS的架構更适合 RESTful web services.

誕生時間: 2009

評分: 3/5

RestExpress是一個非容器的輕量級的 Netty HTTP棧的包裝, 以便更容易地建立 Java RESTful services.

RestExpress 目标是支援最好的 RESTful 實踐。

<a href="https://github.com/RestExpress/RestExpress" target="_blank">GITHUB</a>

真正的微架構

頂級的性能,快,可靠

XML/JSON

最老的也是最穩定的 RESTful 架構之一

沒有文檔

幾乎沒有支援

很小的社群

31

32

33

<code>package</code> <code>com.example;</code>

<code>import</code> <code>java.io.IOException;</code>

<code>import</code> <code>io.netty.handler.codec.http.HttpMethod;</code>

<code>import</code> <code>org.restexpress.RestExpress;</code>

<code>public</code> <code>class</code> <code>Main</code>

<code>{</code>

<code>    </code><code>public</code> <code>static</code> <code>RestExpress startServer(String[] args)</code><code>throws</code> <code>IOException</code>

<code>    </code><code>{</code>

<code>        </code><code>RestExpress server =</code><code>new</code> <code>RestExpress();</code>

<code>        </code><code>MyResource r =</code><code>new</code> <code>MyResource();</code>

<code>        </code><code>server.uri(</code><code>"/myapp/myresource"</code><code>, r)</code>

<code>            </code><code>.method(HttpMethod.GET)</code>

<code>            </code><code>.noSerialization();</code>

<code>            </code><code>.method(HttpMethod.POST);</code>

<code>        </code><code>server.bind(</code><code>8080</code><code>);</code>

<code>        </code><code>return</code> <code>server;</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args)</code><code>throws</code> <code>Exception</code>

<code>        </code><code>RestExpress server = startServer(args);</code>

<code>        </code><code>System.out.println(</code><code>"Hit enter to stop it..."</code><code>);</code>

<code>        </code><code>System.in.read();</code>

<code>        </code><code>server.shutdown();</code>

盡管這個架構超級快,我也不想推薦它。文檔缺乏以及沒有支援使它成為一個欠佳的架構。看在速度的份上給它3顆星。

誕生時間: 2005

Restlet 幫助Java程式員建立大規模的快速的符合 RESTful 架構模式的web api。

它 提供了強大的路由和 filtering 系統。統一的client/server Java API. 滿足所有主要的平台 (Java SE/EE, Google AppEngine, OSGi, GWT, Android) 以及提供了無數的擴充以滿足程式員的需求。

據我說知,它是第一個 java RESTful web 架構。很多公司都在用它,但是你可能從未聽說過它,好像它已經不可見了。

強大

企業級的架構

多平台 Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments

支援JAX-RS (就像 Jersey)

大部分進階 RESTful 支援

支援其它庫

開發一直活躍

智能的url綁定, 全功能的 URI 路由

有相關的書籍

非常陡峭的學習曲線

關閉的社群,盡管 StackOverflow 上還是開放的

不再流行,更多的是因為 Play Framework 和 Jersey

<code>public</code> <code>class</code> <code>Part03</code><code>extends</code> <code>ServerResource {</code>

<code>        </code><code>// Create the HTTP server and listen on port 8182</code>

<code>        </code><code>new</code> <code>Server(Protocol.HTTP,</code><code>8182</code><code>, Part03.</code><code>class</code><code>).start();</code>

<code>    </code><code>@Get</code><code>(</code><code>"txt"</code><code>)</code>

<code>    </code><code>public</code> <code>String toString() {</code>

<code>        </code><code>return</code> <code>"hello, world"</code><code>;</code>

盡管這個架構還一直流行,考慮到它的年紀和目前的完成度,我不能給它5顆星。

誕生時間: 2013

Restx 是一個輕量級的,子產品化的,特性衆多的,超快的開源 Java REST 架構。

快速,輕量級

容易搭建

支援MongoDB

不友好的令人迷惑的文檔。對于這類架構我期望能有好一點的文檔

太年輕

目前還不支援異步Async

<code>@GET</code><code>(</code><code>"/message/{id}"</code><code>)</code>

<code>    </code><code>public</code> <code>Message sayHello(String id,</code><code>// path param</code>

<code>                            </code><code>String who</code><code>// query param</code>

<code>                            </code><code>) {</code>

<code>        </code><code>return</code> <code>new</code> <code>Message().setMessage(String.format(</code>

<code>                </code><code>"hello %s, it's %s"</code><code>,</code>

<code>                </code><code>who, DateTime.now().toString(</code><code>"HH:mm:ss"</code><code>)));</code>

<code>@POST</code><code>(</code><code>"/message/{id}"</code><code>)</code>

<code>                            </code><code>Message msg</code><code>// body param</code>

<code>        </code><code>return</code> <code>msg.setMessage(String.format(</code>

<code>                </code><code>"%s @ %s"</code><code>,</code>

<code>                </code><code>msg.getMessage(), DateTime.now().toString(</code><code>"HH:mm:ss"</code><code>)));</code>

真心來講我沒有在這個架構上花費太多時間。不值得在另一個架構上花費太多精力,我意思是說,Java架構市場已經越來越碎片化了,就像 JavaScript 市場,應該停止這種趨勢了。

不要和 Apache 的大資料架構 Spark 弄混, 這裡的 Spark 架構是一個輕量級的 Java web 架構,用來進行快速的開發(50% Spark使用者使用 Spark 建立 REST APIs)。 它受 Ruby 架構 Sinatra 啟發。

它有一個不到1M的最小化的核心, 提供了所有基本的特性, 用來建構 RESTful 或者傳統的 web 應用程式。

快,輕量級

優秀的快速原型

易于搭建

經常和AngularJS搭配使用

使用 Jetty

可以用在容器中或者獨立運作

文檔可以更好,它不适合初學者

不适合大型項目

社群小

<code>import</code> <code>static</code> <code>spark.Spark.*;</code>

<code>public</code> <code>class</code> <code>HelloWorld {</code>

<code>   </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>      </code><code>get(</code><code>"/hello"</code><code>, (req, res) -&gt;</code><code>"Hello World"</code><code>);</code>

<code>   </code><code>}</code>

這個架構适合初始開發。主要用作小小項目或者原型。