Spring Boot解説第11回(開発環境編：ホットデプロイとActuator)

こんにちはこんばんは！
株式会社情創 技術開発局
夏が近づいてきてBBQをやって
焼肉が食べたい@YAKINIKUです！
今回はホットデプロイとActuatorについて解説していきます！

#ホットデプロイ
##ホットデプロイとは
アプリケーションサーバー(Tomcat)を停止することなく、
ソースコードの変更を即座に反映する方法のことを言います。

##導入
build.gradleの中にあるbuildscriptのdependenciesに
classpath("org.springframework:springloaded:1.2.1.RELEASE")
を追加します。

```gradle:build.gradle
buildscript {
	ext {
		springBootVersion = '1.3.1.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")	
        classpath("org.springframework:springloaded:1.2.1.RELEASE")
    }
}
```

追加後、プロジェクトを右クリックしてメニューを開き
Gradleからすべてリフレッシュを実行します。


##実行
リフレッシュが完了したら実行します。
Gradleタスクを開いて
プロジェクトを選択
bootRunをダブルクリックして起動します。
![hello.png](https://qiita-image-store.s3.amazonaws.com/0/116032/707274ea-43bc-13e6-b995-655aec69b361.png)

以上で、ホットデプロイの実装は完了です。
これでjavaファイルを編集した後にTomcatを
再起動しなくてもビルド後に編集結果が反映されるようになります！

動作確認をします。
[第2回](http://qiita.com/TEBASAKI/items/a30a7daf11cdb51272fb)で作成したHello World!を表示させるプログラムを、
Hello new World!に変更したところ即座に反映されました。
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/116032/4d355614-f96c-8e9d-4437-787655b352a0.png)
↓↓↓
![world.png](https://qiita-image-store.s3.amazonaws.com/0/116032/fe35150f-9aa6-5bad-3bce-87c2ef5219d5.png)


#Actuator
##Spring Boot Actuatorとは
アプリケーションにエンドポイントを追加して、システムの状態や
メトリクス(ソフトウェアの品質を評価した数値)を
web上から確認することができるようになるサブモジュールで
システムやソフトウェアの監視や検査(ヘルスチェック)を楽にしてくれます。

##導入
導入方法自体はとても簡単でbuild.gradleのdependenciesの下に
下記のように
compile("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}")
を追加するだけです。

```gradle:build.gradle
dependencies {
	compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
    compile("org.springframework.boot:spring-boot-starter-jdbc:${springBootVersion}")　
    compile("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
}

```

次は主なエンドポイントについて解説していきます。
##主なエンドポイント
###autoconfig 
Springのソースファイル内で<span>@</span>Configurationの設定が自動設定された時、されなかった時のエラー等のチェックができます。
###beans
アプリ内で動作しているすべてのBeanの確認をします。
###configprops
Springのソースファイル内で<span>@</span>ConfigrationPropertiesで指定されているプロパティの一覧を表示します。
###dump
サーバー内で動作しているスレッドの一覧をダンプします。
###env
Springに登録されているプロパティ一覧を見ることができます。
環境変数等を見ることができて便利です。
###health
サーバーのステータスの情報を表示します。
healthにはカスタマイズが必要で、
詳細につきましては[こちら](http://qiita.com/yoshidan/items/a6515d37784c6779efc5)を参照してください。
###mappings
Springのソースファイル内で<span>@</span>RequestMapping に登録されているマッピング情報の一覧を表示します。
###metrics
アプリケーションのメトリクス(ソフトウェアの品質を評価した数値)を取得します。
###trance
アクセスログを表示します。
デフォルトでは直近10件を取得します。

ここで説明している以外のエンドポイントは英語のページですが、[こちら](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints)を参照ください。
##パスやポート番号、アドレスの指定
[第7回](http://qiita.com/YAKINIKU/items/bba6d8f0cb2a418ea0ea)で作成した
application.propertiesでパスやポート番号、アドレスの指定ができます。
開発環境用のapplication-dev.propertiesに記載します。
headerがオンのままだと外部から情報を取得される危険があるため、
そういったことが無いように
management.add-application-context-header=false
と記載してオフにしておきます。

```properties:application-dev.properties
#actuator
#headerをオフ
management.add-application-context-header=false
# パスの指定
management.contextPath=/manager
# ポート番号の指定
management.port=8081
# アドレスの指定
management.address=127.0.0.1
```

本番時に使用しないため本番環境用の
application-prd.propertiesに下のコードを記載しておきます。

```properties:application-prd.properties
#actuatorOFF
endpoints.enabled=false
```

##実行
mappingsを例にして動作確認します。

パスに指定した/managerを追加したURLをブラウザに打ち込みます。
http://localhost:8081/manager/mappings/

下記のファイルが出力されます。
※IEはファイルをダウンロード、firefox、googlechromeはそのままブラウザ上に表示されます。

```json:mappings.json
{"/webjars/**":{"bean":"resourceHandlerMapping"},"/**":{"bean":"resourceHandlerMapping"},"/**/favicon.ico":{"bean":"faviconHandlerMapping"},"{[/]}":{"bean":"requestMappingHandlerMapping","method":"public java.lang.String com.qiita.demo.web.controller.HelloWorldController.home()"},"{[/demo]}":{"bean":"requestMappingHandlerMapping","method":"public java.lang.String com.qiita.demo.web.controller.LogbackDemoController.home()"},"{[/error]}":{"bean":"requestMappingHandlerMapping","method":"public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)"},"{[/error],produces=[text/html]}":{"bean":"requestMappingHandlerMapping","method":"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)"}}

```

json形式で整形されずに出力されるため、
[json viewer](http://www.atmarkit.co.jp/fdotnet/dotnettips/995jsonviewer/jsonviewer.html)等で閲覧するのがおすすめです。

最後まで読んでいただきありがとうございました。
名残惜しいですが今回はこの辺で終わりにします。

それではみなさんまた会いましょう！