ローカルのDockerコンテナのJVMにSpring Bootのアプリをデプロイしましたが、JVMとコンテナの相性の良さを感じます。Spring Boot と Spring Cloud Netflix と Cloud Foundryを使いMicro Servicesが実現できそうな気がしてきました。まずは簡単なところから、前回作成したspring-cloud-sampleを使い、AmazonRDS互換のClearDBと連携してみます。
cloudfoundry/cliのインストール
cliは、64bit版のdebパッケージをダウンロードします。
$ curl -L -o cf-cli_amd64.deb https://cli.run.pivotal.io/stable?release=debian64
|
dpkgコマンドでdebパッケージをインストールします。バージョンは6.7.0でした。
$ sudo dpkg -i cf-cli_amd64.deb (Reading database ... 46310 files and directories currently installed.) Preparing to unpack cf-cli_amd64.deb ... Unpacking cf-cli (6.7.0) over (6.7.0) ... Setting up cf-cli (6.7.0) ..
|
cloudfoundry/cliは、新しくGoで書かれているのでインストールはとても簡単です。
Pivotal Web Servicesにlogin
最初にcfコマンドから、Pivotal Web Servicesにloginします。
$ cf login -a https://api.run.pivotal.io
|
Pivotal Web Servicesにpush
プロジェクトにあるgradlewを使い、JARファイルをビルドします。
$ git clone https://github.com/masato/spring-cloud-sample $ cd spring-cloud-sample $ ./gradlew clean build $ ls build/libs/ helloconfig-0.0.1-SNAPSHOT.jar build/libs/helloconfig-0.0.1-SNAPSHOT.jar.original
|
JARファイルをPivotal Web Servicesにpushしてデプロイします。この時点では、まだMySQLサービスをバインドしていないので起動に失敗します。{myapp}はアプリケーション名に置き換えてください。
$ cf push {myapp} -p build/libs/helloconfig-0.0.1-SNAPSHOT.jar ... -----> Java Buildpack Version: v2.5 | https://github.com/cloudfoundry/java-buildpack.git -----> Downloading Open Jdk JRE 1.8.0_25 from https://download.run.pivotal.io/openjdk/lucid/x86_64/openjdk-1.8.0_25.tar.gz (1.3s) Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.1s) -----> Downloading Spring Auto Reconfiguration 1.5.0_RELEASE from https://download.run.pivotal.io/auto-reconfiguration/auto-reconfiguration-1.5.0_RELEASE.jar (0.1s) ...
|
CleaDBサービスインスタンスを作成
PivotalCFのドキュメントのManaging Service Instances with the CLIを読みながら、サービスインスタンスの使い方を見ていきます。
MarketplaceからClearDBサービスを探します。
$ cf marketplace | grep cleardb
|
CleaDBサービスのインスタンスを作成します。{mydb}はデータベース名に置き換えてください。
$ cf create-service cleardb spark {mydb}
|
CleaDBサービスのバインド
CleaDBサービスをアプリケーションをバインドします。
$ cf bind-service {myapp} {mydb}
|
確認
curlコマンドを使って、CloudFoundryにデプロイしたアプリに接続します。ClearDBへの接続情報が表示されました。
$ curl {myapp}.cfapps.io <!DOCTYPE html>
<html> <head> <title>Cloud Services</title> </head> <body> <h2>Cloud Services</h2> <table class="table table-striped"> <thead> <tr> <th>Service Connector Type</th> <th>Connection address</th> </tr> </thead> <tbody> <tr> <td><strong>org.apache.tomcat.jdbc.pool.DataSource</strong></td> <td>mysql://xxx.cleardb.net:3306/xxx</td> </tr> </tbody> </table> </body> </html>
|
CloudFoundryで使うDataSourceの指定は以下だけです。
~/spring-cloud-sample/src/main/java/helloconfig/CloudConfiguration.javapackage helloconfig;
import javax.sql.DataSource;
import org.springframework.cloud.config.java.AbstractCloudConfig; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Bean;
@Configuration @Profile("cloud") public class CloudConfiguration extends AbstractCloudConfig { @Bean public DataSource dataSource() { return connectionFactory().dataSource(); } }
|
spring-cloud-cloudfoundry-connectorの中で、VCAP_SERVICES
環境変数のJSONをJacksonを使いアンマーシャルして、MySQLへの接続情報をセットしてくれます。
spring-cloud-cloudfoundry-connectorは、build.gradleのdependenciesに追加してあります。
~/spring-cloud-sample/build.gradle... dependencies { compile("org.springframework.boot:spring-boot-starter-thymeleaf") compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("org.springframework.cloud:spring-cloud-spring-service-connector:${springCloudVersion}") compile("org.springframework.cloud:spring-cloud-cloudfoundry-connector:${springCloudVersion}")
compile("com.h2database:h2") testCompile("org.springframework.boot:spring-boot-starter-test") } ...
|