前段时间有幸了解到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
类上,否则创建失败
- 2.仿照dropwizard-example
- 3.通过把普通Maven项目添加依赖来创建
INSERT VERSION HERE
io.dropwizard
dropwizard-core
${dropwizard.version}
四、核心类
Dropwizard开发的应用,核心流程共三步:获取配置、加载
Application
、加载Resource
暴露API。
Configuration
每个Dropwizard APP都有一个Configuration的子类,来反序列化yaml文件中的配置信息到类中。
Application
Application
在initialize
方法中用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、接口耗时统计等。接口参数可以支持form
、json
、path
等,同时可以配置NotNull
、Optional
等。
注:
Resource
类会被多线程同时调用。
思考:只有Dao
和Resource
,Service
层怎么处理?
HealthCheck
创建HealthCheck
的子类,并在check
方法中做相应的健康检查,如数据库连接等。然后在Application
里注册到Environment
。
五、其他步骤
Building Fat JARs
通过maven-shade
插件把所有需要的.class
文件打包到jar包中,这样你不管在什么环境运行就不需要担心依赖库的问题。
具体步骤
- 生成一个jar中未包含库列表的pom.xml
- 去掉jar中的所有数字签名(否则java将把数字签名视为不合法)-----不懂
- 校验jar中
META-INF/services
的入口,不会重写他们 - 将你的Application类设置为主类,从而可以用
java -jar
运行
注意
- 需要签名的三方库应在
shade
中exclude
掉 - 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
,不需要的时候就取消掉。而且还有一些其他的类似鉴权中间键等也是采用这种注册方式。