最近新加入一个团队,需要使用Dropwizard微服务框架,搭建一个最简单的demo入门。
一、DropWizard简单介绍(copy)
DropWizard各部分功能所使用的组件,详细可以各个部分再查资料。
二、项目搭建
1、搭建一个简单的maven工程(quickstart)
(1)New --> Other -->Maven Project
选择这个quickstart即可,不需要自己建webapp项目,然后根据要求填写项目名等。
(2)生成项目结构:
(3)补充
添加src/main/resources目录
修改jdk版本,现在是1.5,修改为1.7。修改方法:在pom文件中添加:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
然后更新maven工程。
至此项目maven项目搭建完成。
2、添加dropwizard依赖
修改pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zte.yzh</groupId>
<artifactId>dw-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dw-demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<release.repos.ip>10.74.156.77</release.repos.ip>
<snapshot.repos.ip>10.74.156.77</snapshot.repos.ip>
<dropwizard.version>0.8.0</dropwizard.version>
<swagger.version>1.5.3</swagger.version>
<gson.version>2.2.4</gson.version>
<jersey.version>2.16</jersey.version>
<mysql.version>5.1.38</mysql.version>
<jdom.version>1.0</jdom.version>
<jsch.version>0.1.53</jsch.version>
<org-apache-commons-jexl.version>2.1.1</org-apache-commons-jexl.version>
<commons-net.version>3.3</commons-net.version>
<cometd.version>3.0.7</cometd.version>
<quartz.version>2.2.3</quartz.version>
<snmp4j.version>1.10.1</snmp4j.version>
<uep.version>4.11.50.B3SP002</uep.version>
<junit.version>4.12</junit.version>
<poi.version>3.11</poi.version>
<poi-ooxml.version>3.11</poi-ooxml.version>
<poi-ooxml-schemas.version>3.11</poi-ooxml-schemas.version>
<zip4j.version>1.3.2</zip4j.version>
<concurrent.version>1.3.4</concurrent.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>${dropwizard.version}</version>
</dependency>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-assets</artifactId>
<version>${dropwizard.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
<properties>标签内有些没用的版本标记,懒得删除了。
3、项目全貌
(1)Configuration和yml文件编写(项目启动需要的初始内容)
本demo仅仅为学习,所以yml中没配置什么关键西信息,仅仅将以把yml文件内容输出为目的。
DemoConfiguration.java
package com.zte.demo;
import io.dropwizard.Configuration;
import javax.validation.Valid;
import org.hibernate.validator.constraints.NotEmpty;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.yzh.demo.model.CometdServletInfo;
public class DemoConfiguration extends Configuration {
@NotEmpty
private String template;
@NotEmpty
private String defaultName = "yzn Demo";
private boolean saveTaskToFile = false;
@Valid
private CometdServletInfo cometdServletInfo;
@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;
}
@JsonProperty
public CometdServletInfo getCometdServletInfo() {
return cometdServletInfo;
}
@JsonProperty
public void setCometdServletInfo(CometdServletInfo cometdServletInfo) {
this.cometdServletInfo = cometdServletInfo;
}
public boolean isSaveTaskToFile() {
return saveTaskToFile;
}
public void setSaveTaskToFile(boolean saveTaskToFile) {
this.saveTaskToFile = saveTaskToFile;
}
}
package com.yzh.demo.model;
public class CometdServletInfo {
private String servletClass;
private String servletPath;
/**
* @return the servletClass
*/
public String getServletClass() {
return servletClass;
}
/**
* @param servletClass the servletClass to set
*/
public void setServletClass(String servletClass) {
this.servletClass = servletClass;
}
/**
* @return the servletPath
*/
public String getServletPath() {
return servletPath;
}
/**
* @param servletPath the servletPath to set
*/
public void setServletPath(String servletPath) {
this.servletPath = servletPath;
}
}
demo.yml文件
template: Hello, %s!
defaultName: ${DW_DEFAULT_NAME:-Stranger}
cometdServletInfo:
servletClass: com.zte.ums.zenap.itm.agent.cometd.server.CometdServlet
servletPath: /api/itmagentnotification/v1
可以看出来是对应关系,启动时候读取的配置文件。
(2)DemoApp类,即服务启动类
package com.zte.demo;
import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.yzh.demo.resources.DemoResource;
public class DemoApp extends Application<DemoConfiguration> {
/**
* log print
*/
private static final Logger LOG = LoggerFactory.getLogger(DemoApp.class);
public static void main(String[] args) {
try {
new DemoApp().run(args);
} catch (Exception e) {
LOG.error("service start failed");
e.printStackTrace();
}
}
@Override
public void run(DemoConfiguration configuration, Environment env)
throws Exception {
final DemoResource res = new DemoResource(configuration);
env.jersey().register(res);
}
@Override
public void initialize(Bootstrap<DemoConfiguration> bootstrap) {
super.initialize(bootstrap);
}
}
一个main方法启动,将所以本app中的资源添加到dropwizard管理,关键主要在资源类,run方法首先初始化资源,然后将资源注册到框架。
DW不是将你的程序提交到复杂的服务器上,DW上有个main方法来启动我们的服务器,DW是将我们的应用作为一个简单的线程来跑,消去了Java生产环境中一些非常复杂令人讨厌的过程,并且允许我们使用所有现有的Unix进程管理工具。
(3)DemoResource类,资源关键类
package com.yzh.demo.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.zte.demo.DemoConfiguration;
@Path("/demo")
@Produces(MediaType.APPLICATION_JSON)
public class DemoResource {
private DemoConfiguration content;
public DemoResource(DemoConfiguration content){
this.content = content;
}
@GET
@Path("/show")
@Produces(MediaType.APPLICATION_JSON)
public DemoConfiguration printYMLContent(){
return content;
}
}
其实也没什么,和一般的MVC框架类似,只是标注了不同的注解。
@Produces(MediaType.APPLICATION_JSON)让Jersey的内容协商代码知道这个资源产生的是application/json.
三、运行结果
直接运行main方法,但是需要传入两个参数,一个是固定的server,一个是我们编写的yml文件
run as -->run configuration
上面arguments里填写你自己的yml地址,前面的server固定不变,然后Run,我这里报端口占用,dropwizard默认端口是8080.需要改一下yml文件,配置自己的端口号。
新的yml
template: Hello, %s!
defaultName: ${DW_DEFAULT_NAME:-Stranger}
cometdServletInfo:
servletClass: com.zte.ums.zenap.itm.agent.cometd.server.CometdServlet
servletPath: /api/itmagentnotification/v1
server:
type: simple
rootPath: '/*'
applicationContextPath: /
connector:
type: http
port: 9090
启动以后
访问注册的资源:
demo入门项目搭建完成,没有任何逻辑。
关键就只有两个地方,启动类app的run方法注册资源流程和资源类的注解(url、数据类型)等。