DropWizard:用Java輕輕的寫一個RESTful Service

 1.關於Dropwizard的一些閒扯java

  在個人上一篇博客《 Embedded Server:像寫main函數同樣寫Web Server》中,提到了使用Jetty Embedded Server進行Java Web Server的開發比傳統的Web Container的方式進行開發的優點。若是直接使用Jetty提供的API進行Web Server的開發,特別是RESTful service的開發,不免看起來仍是簡單粗暴了一些。git

  而後指望着更多的程序員逃離java世界,奔向看起來很美好的Ruby, Python等等。我本身而言,我不關心java是否是已經死在沙灘上了,更多的是想,新語言引入的新的技術,或者一些新的思潮,可以折射出咱們Java語言或者開發環境中的哪些不足。程序員

  有不少用Ruby on Rails的人,在對ruby知之甚少的狀況下,就開始吭哧吭哧的寫Server了。Rails提供了開發一個Server的完整技術棧,能夠很方便的進行開發,後來又有不少人提供了不少RoR的的插件。github

  Dropwizard也是這麼一個東西,提供了使用Java進行RESTful開發的所須要的最小的技術集合,使用了最輕量級的library。如以前博客裏提到的Jetty,還有Jersey,Jackson等等。在Dropwizard官網上對其自身的介紹仍是比較客氣的,不過看了Dropwizard在github上(https://github.com/dropwizard/dropwizard)的介紹仍是更來的實際些:web

 A damn simple library for building production-ready RESTful web services.bootstrap

  一個damn是那麼的霸氣側漏。也但願有一天我開發的某個library或者框架也能用上這樣的詞語:RNM,TTMD等等。ruby

2. 啓動Dropwizard編譯生成的Server框架

  在真正介紹如何使用Dropwizard以前,我想先讓你們看看如何運行已經寫好的Server的:curl

  java -jar dropwizard-demo-standalone.jar server hello.yamlide

  這樣作的緣由,是讓你們知道這個東西用起來很簡單,這讓我本身更火燒眉毛的想要用它。

3. 使用Dropwizard寫一個RESTful Service

   用Dropwizard寫一個RESTful Service至少須要這麼幾個部分:一是Configuration,二是Service,而後是Resource。由於Dropwizard中已經包括了最經常使用和最好用的幾個開源庫,這樣編寫一個Service會方便和快捷不少。Configuration主要是做爲Serivce自己的配置,經過Service能夠訪問對應的Resource。下面就看一個簡單的例子:

  Configuration: 

  Configuration用於從配置文件中讀取信息,好比從前面的hello.yaml中讀取。Dropwizard中默認的是使用yaml,當你提供的配置文件的後綴名不是.yml或者.yaml時,將會講你的配置文件看作JSON格式。

   hello.yaml

   template: Hello, %s!
   defaultName: Stranger

   在hello.yaml中提供了兩個屬性,template和defaultName。對應的是Java中的HelloConfiguration:

public class HelloConfiguration extends Configuration {
@NotEmpty
@JsonProperty
        private String template;


    @NotEmpty
    @JsonProperty
    private String defaultName = "Stranger";

    public String getDefaultName() {
        return defaultName;
    }

    public String getTemplate() {
        return template;
    }
}

  Service:

public class HelloService extends Service<HelloConfiguration> {
public static void main(String[] args) throws Exception {
        new HelloService().run(args);
    }

    @Override
    public void initialize(Bootstrap<HelloConfiguration> bootstrap) {
        bootstrap.setName("hello");
    }

    @Override
    public void run(HelloConfiguration configuration, Environment environment) throws Exception {
        final String template = configuration.getTemplate();
        final String defaultName = configuration.getDefaultName();
        environment.addResource(new HelloResource(template, defaultName));
    }

  在service中比較關鍵的幾個東西包括HelloConfiguration,這個就是咱們先前從hello.yaml中解析出的對象。還有就是Environment,Dropwizard提供了不少組件,包括像Resource, Filter, HealthCheck等等,這些都被包括在了environment中。這裏咱們添加了一個HelloResource。

  Resource:

@Path("hello")
@Produces(MediaType.APPLICATION_JSON)
public class HelloResource {
    private final String template;
    private final String defaultName;
    private final AtomicLong counter;

    public HelloResource(String template, String defaultName) {
        this.template = template;
        this.defaultName = defaultName;
        this.counter = new AtomicLong();
    }

    @GET
    public Saying sayHello(@QueryParam("name") Optional<String> name) {
        return new Saying(counter.incrementAndGet(),
                String.format(template, name.or(defaultName)));
    }
}

public class Saying {
    private final long id;
    private final String content;

    public Saying(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

3. 驗證Service

    在服務被啓動起來之後,咱們能夠驗證:

    curl http://localhost:8080/?hello=gogo

    返回:

    {"id":1,"content":"Hello, kiwi!"}

4. 更多

 博客中用到的例子其實都出自Dropwizard的官網,但願你們不要嫌棄我。這裏把例子幾乎完整的列出來的緣由是在於,想展現給你們使用Dropwizard能夠很方便的開發一個RESTful Service。特別是對於小型的Service,使用Dropwizard進行開發就顯得極其方便。也許有人要說,大型的Service怎麼辦呢?個人系統或者業務自己就是很複雜怎麼辦呢?是否是就不能用Embedded Server了?是否是就不能用Dropwizard提供的生態系統了?其實否則,固然這裏面有更多的巧思。另外,Dropwizard中還有不少有意思並且好用的組件。

相關文章
相關標籤/搜索