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

     最近新加入一个团队,需要使用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、数据类型)等。

猜你喜欢

转载自blog.csdn.net/ccityzh/article/details/78302366
今日推荐