こんにちは。フリューのジョンです。
Spring Boot良いですよね。設定が楽ですね。弊社ではマイクロサービスを勧めていく上でSpring Bootを使うことが増えてきました。
ただ、Spring Bootのアプリケーションを再起動する際にkillをしても、たまにプロセスが死なない時があり、再起動に失敗するということがありました。
何かいい方法はないのかなぁと見ていたところ以下が見つかりました。
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
この方法を入れると今までは
$ java ${application}.jar
という感じで起動していましたが
$ service ${好きなプロセス名} start
で起動するようになります。startの他には以下があります
- stop
- force-stop
- restart
- force-reload
- status
- run
この方法で起動するには前準備が必要です。
前準備
mavenプロジェクトであればpom.xmlに以下pluginを追加します
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
次にconfファイルを作成します。ファイル名はjarの名前と同じにしておきます。${application}.conf(confファイルは環境変数に設定してある場合は無くても良いです
APP_NAME=${application} JAVA_HOME=/usr/local/java/jdk1.8.0_161 JAVA_OPTS="-Dspring.profiles.active=dev"
次にpackagingしたjarファイルをサーバにデプロイし、権限を変えておきます。
$ chmod 755 ${application}.jar
配置したjarと同じ場所に先ほど作成したconfファイルを配置し、その後以下でリンクを作成します。
$ sudo ln -s ${application}.jar /etc/init.d/${好きなプロセス名}
これで終わりです。
再起動方法
jarファイルをデプロイした後に、以下コマンドで再起動をしていくことになると思います。
$ service ${好きなプロセス名} restart . . . test#72|Stopped [17992]CUTING test#72|Started [18558]CUTING
なぜ動くのか
mavenのpluginを入れることでjarファイルの先頭にスクリプトが挿入されます。
このスクリプトがserviceからの起動に対して動くことになります。
参考: Spring Boot の Fully Executable Jar はなぜ動くのか
application.ymlに書いた日本語文字列が文字化けする
起動はできたのですが、application.ymlに書いた文字列が文字化けしてしまいました。
そこで先ほど記載したconfのJAVA_OPTSにfile.encodingを追加します。
JAVA_OPTS="-Dspring.profiles.active=dev -Dfile.encoding=UTF-8"
まとめ
以上の設定をすることで今までのところ再起動失敗というのはなくなりました。
素敵なマイクロサービス運用、Spring Bootライフを!!
弊社では一緒にサービスを作ってくれるSpringエンジニアを募集しています!!