`

REST微服务架构之DropWizard

阅读更多
    DropWizard是由Yammer开发团队贡献的一个后台服务开发框架,其集成了Java生态系统中各个问题域中最优秀的组件,帮助开发者快速的打造一个Rest风格的后台服务。
   
对开发者来说,使用DropWizard有如下好处:
1、和Maven集成良好,也就是说和Gradle集成也很良好;
2、开发迅速,部署简单;
3、代码结构好,可读性高;
4、自动为服务提供OM框架;
5、让开发者自然的把一个应用拆分为一个个的小服务

DropWizard结构的Web服务组成
1、Configuration:用于设置该服务的配置,比方说在服务开放在哪个端口,数据库配置是怎样的等等。
2、Service:该服务的主入口,定义该服务使用哪个配置文件,开放哪些Resource,该服务需要哪些HealthCheck等等。
3、Resource:定义一个资源,包括如何获取该资源,对该资源做Get/Post/Delete/Query时,对应的各种业务逻辑。
4、Representation:定义了一个服务返回值对象,当服务返回该对象时,会自动的把该对象按属性值生成一个Json格式的字符串返回给服务调用者。
5、HealthCheck:在DropWizard为每个服务提供的OM框架中用到,通过它可以随时检测当前服务是否可用。


DropWizard之Hello World
怎样开发一个DropWizard的Web服务呢?首先,在你的项目中引入DropWizard依赖
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile(
            'com.yammer.dropwizard:dropwizard-core:0.6.1'
    )
}


然后,定义Configuration
public class HelloWorldConfiguration extends Configuration {
    @NotEmpty //参数检查
    @JsonProperty //自动映射配置文件
    private String template;

    @NotEmpty
    @JsonProperty
    private String defaultName;

    public String getTemplate() {
        return template;
    }

    public String getDefaultName() {
        return defaultName;
    }
}

再接着,定义服务想要开放的Resource,(DropWizard中大量使用了Annotation,大大简化了代码开发)
@Path("/helloWorld")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {
    private final String template;
    private final String defaultName;
    private final AtomicLong counter;

    public HelloWorldResource(String template, String defaultName) {
        this.template = template;
        this.defaultName = defaultName;
        this.counter = new AtomicLong();
    }

    @GET
    @Timed
    public SayingRepresentation sayHello(@QueryParam("name")Optional<String> name){
        return new SayingRepresentation(counter.incrementAndGet(),String.format(template,name.or(defaultName)));
    }
}

然后,定义该服务返回值的Representation:
public class SayingRepresentation {
    private long id;
    private String content;

    public SayingRepresentation(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

然后,为该服务定义一个HeatlthCheck,这个是可选的,但是,有HealthCheck的web服务让人放心很多:
public class TemplateHealthCheck extends HealthCheck {
    private final String template;

    protected TemplateHealthCheck(String template) {
        super("template");
        this.template = template;
    }

    @Override
    protected Result check() throws Exception {
        final String saying = String.format(template,"TEST");
        if(!saying.contains("TEST")){
            return Result.unhealthy("template doesn't include a name!");
        }
        return Result.healthy();
    }
}

最后,把该服务涉及的配置,资源,HealthCheck统一整合到Service主类中:
public class HelloWorldService extends Service<HelloWorldConfiguration> {

    //服务入口
    public static void main(String[] args) throws Exception {
        new HelloWorldService().run(args);
    }

    @Override
    public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
        //指定配置文件的名字
        bootstrap.setName("helloWorld");
    }

    @Override
    public void run(HelloWorldConfiguration helloWorldConfiguration, Environment environment) throws Exception {
        final String template = helloWorldConfiguration.getTemplate();
        final String defaultName = helloWorldConfiguration.getDefaultName();
        environment.addResource(new HelloWorldResource(template,defaultName));
        environment.addHealthCheck(new TemplateHealthCheck(template));
    }
}


另外配置文件如下:
template: Hello, %s!
defaultName: Stranger

这就是一个完整的REST风格的Web服务代码,另外,DropWizard的部署也非常简单,只需要使用构建脚本把该服务打包,然后使用如下的命令即可运行服务:
 java -jar <jar包> server <config_file>

注意:1、在打包的时候一定要把依赖库也打进去
          2、配置文件的名字一定要和Service类中设置的一样

最后,前面只是关于DropWizard的最基本的应用,DropWizard开发团队还为开发者考虑了很多贴心的功能,比方说,和Hibernate,Liquidbase的集成等等。更多更详细的信息,请移步:http://dropwizard.codahale.com/manual/
1
4
分享到:
评论
14 楼 ningandjin 2015-02-11  
hobitton 写道
看了文章,不知道dropwizard的优势在哪里?因为文章中提到的所有的代码都是jersey很方便就提供了。google了下,好像是提供一站式的解决方法,方便大家不用去了解各个framework的版本就可以使用了?但是如果就这点好处的话,我觉得完全没必要用dropwizard了啊?不管是它文档里面提到的validation,embedded server,rest client等等,这个都是很方便就实现了,这些东西在jersey的文档中都很完善的提到了啊?
完全没懂这个框架的优点在哪里。
严重同意, 他的优点就是你有了做微服务的想法之后,只需要他你就能开发完这个服务, 他本来就是各项技术的一个集成封装,然后加点Annotation用起来更直观,再加一点约定优于配置的思路简化一点配置。 如果你对各项技术都很了解,自己来集成这些技术灵活性可能会更好。。
13 楼 hobitton 2015-02-11  
看了文章,不知道dropwizard的优势在哪里?因为文章中提到的所有的代码都是jersey很方便就提供了。google了下,好像是提供一站式的解决方法,方便大家不用去了解各个framework的版本就可以使用了?但是如果就这点好处的话,我觉得完全没必要用dropwizard了啊?不管是它文档里面提到的validation,embedded server,rest client等等,这个都是很方便就实现了,这些东西在jersey的文档中都很完善的提到了啊?
完全没懂这个框架的优点在哪里。
12 楼 ron.luo 2014-09-18  
ningandjin 写道
ron.luo 写道

1、就是如何配合spring mvc 实现restful风格的web service 并且可以集成Swagger UI测试。
2、这个jar包在哪可以下载呢?
3、因为Dropwizard使用的是Jetty Embedded Container,能支持tomcat服务吗?


DropWizard是一个微服务框架,其目标是所有东西自己一肩挑,同时能保持代码的短小。

1. 配合spring mvc是一个伪命题,用了spring MVC就不要用DropWizard了,任选其一吧。这2者都可以集成swagger,具体的可以去看Swagger官网。

2. jar包是项目build出来的

3. 之前只支持jetty,目前不知道。用tomcat的化可以看看spring boot。

呵呵,现在才有点豁然开朗给,多谢!
11 楼 ningandjin 2014-09-18  
ron.luo 写道

1、就是如何配合spring mvc 实现restful风格的web service 并且可以集成Swagger UI测试。
2、这个jar包在哪可以下载呢?
3、因为Dropwizard使用的是Jetty Embedded Container,能支持tomcat服务吗?


DropWizard是一个微服务框架,其目标是所有东西自己一肩挑,同时能保持代码的短小。

1. 配合spring mvc是一个伪命题,用了spring MVC就不要用DropWizard了,任选其一吧。这2者都可以集成swagger,具体的可以去看Swagger官网。

2. jar包是项目build出来的

3. 之前只支持jetty,目前不知道。用tomcat的化可以看看spring boot。
10 楼 ron.luo 2014-09-18  
ron.luo 写道
ron.luo 写道
ron.luo 写道
ningandjin 写道
ron.luo 写道
请问下,如何部署dropwizard,还是不太明白?能不能给以demo?

dropwizard打出来就是一个jar包,包含所有的依赖,目前流行的CI,Contuinuous Delivery都可以直接上啊。你所谓的部署是指?

1、就是如何配合spring mvc 实现restful风格的web service 并且可以集成Swagger UI测试。
2、这个jar包在哪可以下载呢?
3、因为Dropwizard使用的是Jetty Embedded Container,能支持tomcat服务吗?


9 楼 ron.luo 2014-09-18  
ron.luo 写道
ron.luo 写道
ningandjin 写道
ron.luo 写道
请问下,如何部署dropwizard,还是不太明白?能不能给以demo?

dropwizard打出来就是一个jar包,包含所有的依赖,目前流行的CI,Contuinuous Delivery都可以直接上啊。你所谓的部署是指?

1、就是如何配合spring mvc 实现restful风格的web service 并且可以集成Swagger UI测试。
2、这个jar包在哪可以下载呢?
3、同时因为Dropwizard使用的是Jetty Embedded Container.

8 楼 ron.luo 2014-09-18  
ron.luo 写道
ningandjin 写道
ron.luo 写道
请问下,如何部署dropwizard,还是不太明白?能不能给以demo?

dropwizard打出来就是一个jar包,包含所有的依赖,目前流行的CI,Contuinuous Delivery都可以直接上啊。你所谓的部署是指?

1、就是如何配合spring mvc 实现restful风格的web service 并且可以集成Swagger UI测试。
2、这个jar包在哪可以下载呢?
7 楼 ron.luo 2014-09-18  
ningandjin 写道
ron.luo 写道
请问下,如何部署dropwizard,还是不太明白?能不能给以demo?

dropwizard打出来就是一个jar包,包含所有的依赖,目前流行的CI,Contuinuous Delivery都可以直接上啊。你所谓的部署是指?

就是如何配合spring mvc 实现restful风格的web service 并且可以集成Swagger UI测试。
6 楼 ningandjin 2014-09-18  
ron.luo 写道
请问下,如何部署dropwizard,还是不太明白?能不能给以demo?

dropwizard打出来就是一个jar包,包含所有的依赖,目前流行的CI,Contuinuous Delivery都可以直接上啊。你所谓的部署是指?
5 楼 ron.luo 2014-09-16  
请问下,如何部署dropwizard,还是不太明白?能不能给以demo?
4 楼 ningandjin 2014-07-14  
mxh_1993 写道
楼主,你能不能留一个联系地址,我有点问题想请教你,谢谢啦

微博@xianlinbox,邮箱xianlinbox@gmail.com皆可。
3 楼 mxh_1993 2014-07-13  
楼主,你能不能留一个联系地址,我有点问题想请教你,谢谢啦
2 楼 maidoudao 2013-11-26  
2、配置文件的名字一定要和Service类中设置的一样
这个没必要一样的,bootstrap.setName("helloWorld"); 这只是指定服务的名字,而不是配置文件的名字。
只需要在运行的时候将yml文件的路径传入即可。
java -jar <jar包> server <config_file_path>  
1 楼 swanky_yao 2013-07-03  
抽时间研究研究

相关推荐

    Java与微服务架构.pptx

    在微服务架构中,Java开发者通常会使用Spring Boot和Dropwizard这两个框架。Spring Boot是由Pivotal Software开发的,它简化了基于Spring的应用程序创建。Spring Boot的核心特性包括SpringApplication,用于初始化...

    1.微服务架构1

    微服务架构是一种现代软件开发的方法论,它将大型应用程序分解为一系列小型、独立的服务,每个服务都专注于特定的业务功能。这种架构风格促进了服务的松耦合,使得开发团队能够更快地迭代和部署代码,同时允许使用...

    微服务开发手册

    随着软件系统的复杂度不断提高,微服务架构因其高灵活性、可扩展性和易维护性等特点,成为当前软件开发领域的重要趋势之一。本手册旨在为使用Java语言进行微服务开发的技术人员提供一套详尽的指南,帮助他们更好地...

    开源社区的微服务生态体系.pdf

    例如,对于REST框架,可以选择Spring MVC、Jersey或Dropwizard;对于RPC,可以考虑gRPC、Thrift或较老的Hessian。对于网络库,新的项目通常推荐使用支持HTTP/2的Netty 4.1版本。 微服务的实施不仅涉及技术选型,还...

    upickle_2.10-0.1.1.zip

    7. **Scala与微服务**:在微服务架构中,每个服务都是独立的,通常使用轻量级通信机制(如HTTP/REST)。DropWizard-Scala使得在Scala中构建这种服务更加容易,同时也保持了DropWizard的性能优势。 通过这些知识点,...

    Atlas REST-开源

    - 小型项目或微服务架构,对资源和复杂度有严格控制。 - 快速原型开发,需要迅速搭建功能演示或验证概念。 - 教学或学习目的,展示基础的RESTful服务开发。 **总结** Atlas REST 框架以其轻量级、高效和易用的特点...

    hipster-o-mat:Dropwizard演示

    Dropwizard将常见的微服务基础设施打包在一起,让开发者可以专注于业务逻辑而不是基础架构。它包括以下主要部分: 1. **Jersey**:作为JAX-RS(Java API for RESTful Web Services)的实现,Jersey用于创建和消费...

    CurrencyService:REST Web服务

    Java提供了多种库和框架来实现REST服务,如Jersey、Spring Boot和Dropwizard等。其中,Spring Boot是目前最流行的框架,因为它简化了微服务的开发过程,并且集成了许多功能,如自动配置、安全管理和数据访问等。 在...

    RESTful Server

    RESTful Server基于Java RESTful框架构建,这表明它利用了诸如Jersey、Spring Boot、Dropwizard等流行的Java REST库。这些框架提供了强大的功能,如自动资源发现、数据绑定、错误处理、测试工具等,使得开发者能够...

    最好的8个Java RESTful框架

    - Restlet是最早的REST框架之一,提供了一种组件模型来构建RESTful应用。 - 它支持客户端和服务器端的REST开发,提供了一套全面的API。 - Restlet框架具有高度可扩展性,适用于复杂的REST架构。 6. **Vert.x** ...

    sample-server-user:RESTful Web服务样本

    REST(Representational State Transfer)是一种架构风格,常用于设计网络应用程序,尤其是Web服务。它强调资源的表示和通过HTTP协议进行交互。 【描述】提到的"样本服务器用户"可能是该项目的核心部分,即创建一个...

    eventful-server:适用于Eventful的API服务器

    使用Java的微服务架构可以实现水平扩展,以满足不断增长的用户需求。 6. **持续集成/持续部署(CI/CD)**:为了快速迭代和保证代码质量,项目通常会采用Git进行版本控制,结合Jenkins或GitHub Actions实现自动化...

    你好服务

    "你好服务"是一个基于Java开发的服务程序,可能是一个微服务应用或者一个独立的功能模块。在Java编程中,服务通常指的是提供特定功能并可被其他组件或系统调用的代码单元。下面将详细讨论与Java服务相关的知识点。 ...

Global site tag (gtag.js) - Google Analytics