初识Dropwizard

前段时间有幸了解到Dropwizard这个轻量级后台框架,做过几个小项目以后,终于有时间做一个简单的总结,捎带着翻译一下他们的文档。

我不是大牛,文章中难免有一些不太恰当的地方,欢迎大家在评论区一起讨论。

前言

Dropwizard是将业界比较流行的稳定的、成熟的组件,拼接成一个简单的、轻量级的框架或者是类库,供我们开发。

同时它还提供一些复杂配置支持、应用性能数据、日志管理、操作工具等高级功能。

总之,如果你想快速开发一个Web服务,Dropwizard是不二之选。至于他与SpringBoot的优缺点,后续有时间再做总结。

本文可以看做是对Dropwizard 1.2.0的Getting Started章节翻译后的简单总结

一、Overview

Dropwizard straddles the line between being a library and a framework. Its goal is to provide performant, reliable implementations of everything a production-ready web application needs. Because this functionality is extracted into a reusable library, your application remains lean and focused, reducing both time-to-market and maintenance burdens.

特点:介于类库和框架之间,Dropwizard的目标是提供高性能、高可用服务,快速方便的搭建我们的WebApp。
优点:Dropwizard已经将各组件封装完好,与我们开发的应用高度解耦,降低项目开发上线及维护时间。

二、核心功能组件

Dropwizard实际上类似使用胶水把各种功能组件很粘合在一起,而且这些组件都是各自功能上最顶尖的组件之一,你还可以很方便的去更换他们。

Jetty for HTTP

特点:Dropwizard结合Jetty在main方法中运转一个HTTP Server,并且运行在单进程中,去掉一些java的不好的方面no PermGen issues, no application server configuration and maintenance, no arcane deployment tools, no class loader troubles, no hidden application logs, no trying to tune a single garbage collector to work with multiple application workloads,并允许使用任意的Unix进程管理工具
优点:精简,单进程

Jersey for REST

For building RESTful web applications, we’ve found nothing beats Jersey (the JAX-RS reference implementation) in terms of features or performance. It allows you to write clean, testable classes which gracefully map HTTP requests to simple Java objects. It supports streaming output, matrix URI parameters, conditional GET requests, and much, much more.

优点:性能最好,代码优雅,可测试类

Jackson for JSON

优点:JVM中对json的format支持较好,速度快

Metrics for metrics

The Metrics library rounds things out, providing you with unparalleled insight into your code’s behavior in your production environment.

And Friends

Guava
Logback and slf4j
Hibernate Validator
Apache HttpClient and Jersey client
JDBI
Liquibase
Freemarker and Mustache
Joda Time 处理时间

三、创建简单的Dropwizard项目

官方给出如下三种创建项目的方式:

  • 1.使用 dropwizard-archetype,命令如下
    mvn archetype:generate -DarchetypeGroupId=io.dropwizard.archetypes -DarchetypeArtifactId=java-simple -DarchetypeVersion=版本号

注:在idea中,如果使用自定义的Archetype创建项目的话,除了要填写GroupId ArtifactId Version之外,还需要添加一个name属性,用来描述你项目的名字,会反映在你的Application类上,否则创建失败

初识Dropwizard_第1张图片
  • 2.仿照dropwizard-example
  • 3.通过把普通Maven项目添加依赖来创建

    INSERT VERSION HERE


    
        io.dropwizard
        dropwizard-core
        ${dropwizard.version}
    

四、核心类

Dropwizard开发的应用,核心流程共三步:获取配置、加载Application、加载Resource暴露API。

初识Dropwizard_第2张图片
Dropwizard简易框架图

Configuration

每个Dropwizard APP都有一个Configuration的子类,来反序列化yaml文件中的配置信息到类中。

Application

Applicationinitialize方法中用Configuration中的参数配置Bundles、configuration source providers, etc。Application类把各种Bundle和Command组合在一起,它是整个应用的主入口。

Representation

表现层,接口向外暴露的json信息的POJO(Plain Ordinary Java Object,简单的Java对象,实际就是普通JavaBeans)

Resoursce

用于暴露接口的类。与SpringBoot不同的是,在Dropwizard中,Resource需要手动在Application中注册。例如:

        //这里使用JDBI做数据库连接
        final DBIFactory fac = new DBIFactory();
        //根据配置创建数据库连接
        final DBI dbi = fac.build(env, configuration.getDataSourceFactory(), "postgresql");
        //获取Dao
        final UserDao userDao = dbi.onDemand(UserDao.class);
        //将Dao赋值给Resource并注册到env中
        env.jersey().register(new UserResource(userDao));

可以配置接口的地址、请求方法、接收和产生的MediaType、接口耗时统计等。接口参数可以支持formjsonpath等,同时可以配置NotNullOptional等。

注:Resource类会被多线程同时调用。
思考:只有DaoResourceService层怎么处理?

HealthCheck

创建HealthCheck的子类,并在check方法中做相应的健康检查,如数据库连接等。然后在Application里注册到Environment

五、其他步骤

Building Fat JARs

通过maven-shade插件把所有需要的.class文件打包到jar包中,这样你不管在什么环境运行就不需要担心依赖库的问题。

具体步骤

  • 生成一个jar中未包含库列表的pom.xml
  • 去掉jar中的所有数字签名(否则java将把数字签名视为不合法)-----不懂
  • 校验jar中META-INF/services的入口,不会重写他们
  • 将你的Application类设置为主类,从而可以用java -jar运行

注意

  • 需要签名的三方库应在shadeexclude
  • Since Dropwizard is using the Java ServiceLoader functionality to register and load extensions, the minimizeJar option of the maven-shade-plugin will lead to non-working application JARs

打印所引用的三方jar包的版本

可以通过maven-jar-plugin插件在package的时候打印所引用jar包的版本

运行Jar包

以下命令可以查询它都支持哪些命令。
java -jar target/hello-world-0.0.1-SNAPSHOT.jar
run
java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello.yml
同时你可以通过admin端口8081查看metrics健康检查等。

六、小结

Dropwizard真的像他们所宣称的那样,做的极致精简,封装的特别好,各功能解耦做的很棒。各模块的Resource可以在需要的时候注册在Environment,不需要的时候就取消掉。而且还有一些其他的类似鉴权中间键等也是采用这种注册方式。

你可能感兴趣的:(初识Dropwizard)