Dropwizard框架搭建微服务入门学习(maven)

来源:互联网 发布:齐天乐春节晚会 知乎 编辑:程序博客网 时间:2024/06/05 20:08

     最近新加入一个团队,需要使用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;    }    @JsonPropertypublic CometdServletInfo getCometdServletInfo() {return cometdServletInfo;}    @JsonPropertypublic 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();}}@Overridepublic void run(DemoConfiguration configuration, Environment env)throws Exception {final DemoResource res = new DemoResource(configuration);env.jersey().register(res);}@Overridepublic 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、数据类型)等。