文章目录
  1. 1. 包含类库
  2. 2. 优点
    1. 2.1. 与spring boot的对比
    2. 2.2. Spring的依赖
    3. 2.3. Http服务器
    4. 2.4. 日志
    5. 2.5. 依赖注入
    6. 2.6. 测试
  3. 3. 代码实例
    1. 3.1. Creating A Configuration Class
    2. 3.2. Creating An Application Class
    3. 3.3. Creating A Representation Class
    4. 3.4. Creating A Resource Class
    5. 3.5. Registering A Resource
    6. 3.6. Creating A Health Check
    7. 3.7. Adding A Health Check
    8. 3.8. Building JARs
    9. 3.9. Running Application
  4. 4. 参考

Dropwizard 是一个开源的Java框架,用于开发OPS友好、高性能的基于REST的后端。它是由Yammer开发的,来驱动基于JVM的后端。目前公司的Rest服务都是基于这个开发的。

包含类库

Dropwizard集成了Java生态系统中各个问题域中最优秀的组件,帮助开发者快速的打造一个Rest风格的后台服务。包含:

  1. Jetty for HTTP: 每一个应用程序被打包成一个jar(而不是war)文件,并开始自己的嵌入式Jetty容器。没有任何war文件和外部servlet容器。
  2. Jersey for REST: Jersey(JAX-RS的参考实现)是用来写基于REST的Web服务的。
  3. Jackson for JSON: 用来做所有的JSON处理。
  4. Metrics for metrics: 支持监控使用标准库,它在监控代码方面有无与伦比的洞察力。
  5. Log: 使用Logback和SLF4J完成
  6. Hibernate Validator: 使用Hibernate验证API进行声明性验证。
  7. Guava: …….

优点

  1. 和Maven,Gradle集成良好
  2. 轻量级,开发迅速,部署简单;
  3. 代码结构好,可读性高;
  4. 自动为服务提供OM框架;
  5. Resource概念让开发者自然的把一个应用拆分为一个个的小服务

与spring boot的对比

Spring的依赖

Spring Boot聚焦于Spring应用,如果你希望进入Spring生态环境,或者已经熟悉它,希望有一个快速起步,那么选择它是好的选择,而DropWizard是将其REST和Jersey结合在一起,它帮助你离开对Spring的依赖。

Http服务器

这里我们看到Spring Boot更加灵活,Dropwizard以约定优于配置,比Spring Boot更极端点,完全是基于Jetty,而Spring Boot默认使用嵌入的Tomcat,其他也可以选择。

日志

Dropwizard 从log4j切换到LogBack,而Spring boot提供 Logback, log4j 和 log4j2选择,LogBack是一个更好的Log4j,性能要比log4j提高,不过要注意不同的方法使用性能不同。

依赖注入

两个框架主要区别是依赖注入的不同,Spring核心有依赖注入,而DropWizard需要你选择,这也带来了灵活性,有Google Guice或更新更好的依赖注入框架可供选择。

测试

两个框架都有 dropwizard-testing 和 spring-boot-starter-test支持。

两者都有很强很大的社区支持。如果你更喜欢轻量,无疑Dropwizard胜出,如果你已经有Spring经验,无疑使用Spring Boot。

代码实例

Creating A Configuration Class

public class HelloWorldConfiguration extends Configuration {
    @NotEmpty
    private String template;
    @NotEmpty
    private String defaultName = "Stranger";

    @JsonProperty
    public String getTemplate() {
        return template;
    }
    @JsonProperty
    public void setTemplate(String template) {
        this.template = template;
    }

    @JsonProperty
    public String getDefaultName() {
        return defaultName;
    }
    @JsonProperty
    public void setDefaultName(String name) {
        this.defaultName = name;
    }
}

其中YAML配置文件hello-world.yml对应内容如下:

template: Hello, %s!
defaultName: Stranger

Creating An Application Class

public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
    public static void main(String[] args) throws Exception {
        new HelloWorldApplication().run(args);
    }

    @Override
    public String getName() {
        return "hello-world";
    }

    @Override
    public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
        // nothing to do yet
    }

    @Override
    public void run(HelloWorldConfiguration configuration,
                    Environment environment) {
        // nothing to do yet
    }

}

Creating A Representation Class

public class Saying {
    private long id;

    @Length(max = 3)
    private String content;

    public Saying() {
        // Jackson deserialization
    }

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

    @JsonProperty
    public long getId() {
        return id;
    }

    @JsonProperty
    public String getContent() {
        return content;
    }
}

Creating A Resource Class

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

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

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

Registering A Resource

@Override
public void run(HelloWorldConfiguration configuration,
                Environment environment) {
    final HelloWorldResource resource = new HelloWorldResource(
        configuration.getTemplate(),
        configuration.getDefaultName()
    );
    environment.jersey().register(resource);
}

Creating A Health Check

public class TemplateHealthCheck extends HealthCheck {
    private final String template;

    public TemplateHealthCheck(String template) {
        this.template = template;
    }

    @Override
    protected Result check() throws Exception {
        final String saying = String.format(template, "TEST");
        if (!saying.contains("TEST")) {
            return Result.unhealthy("template doesn't include a name");
        }
        return Result.healthy();
    }
}

Adding A Health Check

@Override
public void run(HelloWorldConfiguration configuration,
                Environment environment) {
    final HelloWorldResource resource = new HelloWorldResource(
        configuration.getTemplate(),
        configuration.getDefaultName()
    );
    final TemplateHealthCheck healthCheck =
        new TemplateHealthCheck(configuration.getTemplate());
    environment.healthChecks().register("template", healthCheck);
    environment.jersey().register(resource);
}

Building JARs

pom文件<build><plugins>中添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.6</version>
    <configuration>
        <createDependencyReducedPom>true</createDependencyReducedPom>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.helloworld.HelloWorldApplication</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Running Application

java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello-world.yml

参考

  1. Dropwizard- Getting Started
文章目录
  1. 1. 包含类库
  2. 2. 优点
    1. 2.1. 与spring boot的对比
    2. 2.2. Spring的依赖
    3. 2.3. Http服务器
    4. 2.4. 日志
    5. 2.5. 依赖注入
    6. 2.6. 测试
  3. 3. 代码实例
    1. 3.1. Creating A Configuration Class
    2. 3.2. Creating An Application Class
    3. 3.3. Creating A Representation Class
    4. 3.4. Creating A Resource Class
    5. 3.5. Registering A Resource
    6. 3.6. Creating A Health Check
    7. 3.7. Adding A Health Check
    8. 3.8. Building JARs
    9. 3.9. Running Application
  4. 4. 参考