dropwizard微服務(wù)實(shí)踐

一 Dropwizard是什么昔逗?
Dropwizard是一個(gè)跨越了庫(kù)和框架的界限备籽,他的目標(biāo)是提供一個(gè)生產(chǎn)就緒的web應(yīng)用程序所需的一切性能可靠的實(shí)現(xiàn)冀续。
(一)它主要包含以下組件:
1、Jetty for HTTP
將Jetty的http庫(kù)嵌入到項(xiàng)目中熔萧,不需要將我們的服務(wù)提交到復(fù)雜的服務(wù)器上糖驴。只需要一個(gè)main方法就可以啟動(dòng)服務(wù)。
2佛致、Jersey for REST
使用Jersey來(lái)支持ResJul風(fēng)格的web應(yīng)用的贮缕。它允許你編寫干凈的,可以測(cè)試的類俺榆,這個(gè)類可以優(yōu)雅的將http請(qǐng)求映射成為簡(jiǎn)單的Java對(duì)象
3感昼、Jackson for JSON
主要使用Jackson進(jìn)行JSON和Java對(duì)象轉(zhuǎn)換,方便快速罐脊。
4定嗓、Metrics for metrics
在生產(chǎn)環(huán)境中,Metrics為你提供獨(dú)一無(wú)二的洞察力萍桌,也就是說這個(gè)是用來(lái)監(jiān)控Java進(jìn)程的運(yùn)行狀態(tài)的
5宵溅、其他?
Logback,slf4j:日志類的庫(kù)?
Jdbi:連接關(guān)系型數(shù)據(jù)庫(kù)的工具類上炎。
?JodaTime:時(shí)間處理工具類?
Freemarker and Mustache:用戶界面模版?
Httpclient恃逻,JerseyClient:第三方接口通訊工具類。

(二)dropwizard優(yōu)勢(shì):
1藕施、更輕量寇损,不依賴外部的容器環(huán)境。
2铅碍、部署簡(jiǎn)單润绵,快速
3、約定優(yōu)于配置的思想胞谈,省卻了一些配置上的麻煩
4、代碼結(jié)構(gòu)良好,可讀性強(qiáng)
5烦绳、快速的項(xiàng)目引導(dǎo)

二 dropwizard使用步驟
使用dropwizard搭建服務(wù)的步驟:
1卿捎、創(chuàng)建maven工程
2、創(chuàng)建配置類
3径密、創(chuàng)建應(yīng)用類
4午阵、創(chuàng)建資源類
5、注冊(cè)資源類
6享扔、build工程
7底桂、運(yùn)行Jar

三 demo實(shí)例
1 創(chuàng)建maven工程,pom引用dropwizard dependency
pom:

<dependency>
     <groupId>io.dropwizard</groupId>
     <artifactId>dropwizard-core</artifactId>
        <version>1.2.0-rc1</version>
</dependency>

編譯配置:

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>           <createDependencyReducedPom>true</createDependencyReducedPom>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
   implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            <transformer
        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>application類路徑</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

    </plugins>
</build>

2惧眠、創(chuàng)建配置類

package com.jasonlee.dropwizard.configuration;

import io.dropwizard.Configuration;

public class HelloWorldConfiguration extends Configuration {
       private String template;
       private String defaultName = "Stranger";
    
       public String getTemplate() {
           return template;
       }
       public void setTemplate(String template) {
           this.template = template;
       }
       public String getDefaultName() {
           return defaultName;
       }
       public void setDefaultName(String defaultName) {
           this.defaultName = defaultName;
       }
}

對(duì)應(yīng)的yml文件:

template: Hello, %s!
defaultName: Stranger

3籽懦、創(chuàng)建應(yīng)用類

package com.jasonlee.dropwizard.app;

import com.jasonlee.dropwizard.configuration.HelloWorldConfiguration;
import com.jasonlee.dropwizard.health.MyHealthCheck;
import com.jasonlee.dropwizard.resource.HelloServlet;
import com.jasonlee.dropwizard.resource.HelloWorldResource;

import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;

public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
    public static void main(String[] args) throws Exception {
        new HelloWorldApplication().run(args);//執(zhí)行run,此時(shí)run方法為空氛魁,待注冊(cè)資源
    }

    @Override
    public String getName() {
        return "hello-world";
    }

    @Override
    public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
        // nothing to do yet
    }

    @Override
    public void run(HelloWorldConfiguration configuration, Environment environment) throws Exception {
        //todo
    }
}

4暮顺、創(chuàng)建資源類

package com.jasonlee.dropwizard.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.codahale.metrics.annotation.Timed;
import com.google.common.base.Optional;


@Path("/hello-world")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {
      private final String template;
      private final String defaultName;
      public HelloWorldResource(String template, String defaultName) {
            this.template = template;
            this.defaultName = defaultName;
        }
      
        @GET
        @Timed
        public String sayHello(@QueryParam("name") Optional<String> name) {
            final String value = String.format(template, name.or(defaultName));
            return value;
        }
}

也可以直接創(chuàng)建servlet作為服務(wù)發(fā)布:

package com.jasonlee.dropwizard.resource;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
      /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {
               response.setContentType("text/html");
               PrintWriter out = response.getWriter();
               out.println("test over");
               out.flush();
               out.close();
          }
}

可以創(chuàng)建健康檢查類供注冊(cè):

package com.jasonlee.dropwizard.health;

import com.codahale.metrics.health.HealthCheck;

public class MyHealthCheck extends HealthCheck {

     private final String template;

     public MyHealthCheck(String template) {
          this.template = template;
      }

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

    
}

5、注冊(cè)資源類
在application的run方法中注冊(cè)上步創(chuàng)建的資源和servlet:

    @Override
    public void run(HelloWorldConfiguration configuration, Environment environment) throws Exception {
        final HelloWorldResource resource = new HelloWorldResource(
                configuration.getTemplate(),
                configuration.getDefaultName()
        );
        environment.jersey().register(resource);
        environment.getApplicationContext().addServlet(HelloServlet.class, "/test");
        MyHealthCheck healthCheck =
                new MyHealthCheck(configuration.getTemplate());
            environment.healthChecks().register("template", healthCheck);
    }

6秀存、build工程
在項(xiàng)目根目錄使用mv clean --mvn package進(jìn)行編譯或eclipse編譯捶码。
7運(yùn)行jar
java -jar jar路徑 server test.yml路徑

8 驗(yàn)證
訪問http://localhost:8080/hello-world/name=jasonlee可以訪問資源類發(fā)布的接口。
訪問http://localhost:8080/test可以訪問servlet發(fā)布的服務(wù)或链。
訪問http://localhost:8081可以查看metrics和health check等監(jiān)控信息惫恼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澳盐,隨后出現(xiàn)的幾起案子尤筐,更是在濱河造成了極大的恐慌,老刑警劉巖洞就,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盆繁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旬蟋,警方通過查閱死者的電腦和手機(jī)油昂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倾贰,“玉大人冕碟,你說我怎么就攤上這事〈艺悖” “怎么了安寺?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)首尼。 經(jīng)常有香客問我挑庶,道長(zhǎng)言秸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任迎捺,我火速辦了婚禮举畸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凳枝。我一直安慰自己抄沮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布岖瑰。 她就那樣靜靜地躺著叛买,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹋订。 梳的紋絲不亂的頭發(fā)上率挣,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辅辩,去河邊找鬼难礼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛玫锋,可吹牛的內(nèi)容都是我干的蛾茉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撩鹿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谦炬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起节沦,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤键思,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甫贯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吼鳞,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年叫搁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赔桌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渴逻,死狀恐怖疾党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惨奕,我是刑警寧澤雪位,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梨撞,受9級(jí)特大地震影響雹洗,放射性物質(zhì)發(fā)生泄漏香罐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一队伟、第九天 我趴在偏房一處隱蔽的房頂上張望穴吹。 院中可真熱鬧幽勒,春花似錦嗜侮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咪惠,卻和暖如春击吱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遥昧。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工覆醇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炭臭。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓永脓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鞋仍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子常摧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)威创,斷路器落午,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司肚豺,掛了不少溃斋,但最終還是拿到小米、百度吸申、阿里梗劫、京東、新浪呛谜、CVTE在跳、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,253評(píng)論 11 349
  • 內(nèi)容已經(jīng)移動(dòng)到這里[https://blog.csdn.net/WeiPeng2K/article/details...
    weipeng2k閱讀 4,370評(píng)論 1 11
  • 文/孤鳥差魚 他是否沒學(xué)就會(huì)的裝聾作啞 讓你覺得生活 缺了口疤
    孤鳥差魚閱讀 90評(píng)論 0 4