IBM Cloudantを使いたいと思うことあるかもしれませんが、QiitaにはNodeRedの記事が多いですね。。。
javaで使いたい人向けの記事があまりないので入門編として掲載します。
また、IBMのCloud Foundryにデプロイするまで書きます。
dependency
Spring boot 2.0.4
cloudant-client 2.12.0
okhttp3 3.11.0
※ okhttp3についてjava 1.7以上が必須なので、パフォーマンスなどを気にしなければ省いても良い
cloudantの認証について
cloudantの認証も以前はHMAC keyを発行しなければならなかったのですが、
2018/08/21 現在ではHMAC、VCAP_SERVICES、IAM API key、 ローカル認証やaccount endpoint?など多彩な認証によって認証が可能なようです。
どの認証方式でも良いのですが、今回はローカル環境とCloud Foundry環境の違いを気にすることなくかけるVCAP_SERVICESを利用します。
Cloud FoundryとCludantの接続、VCAP_SERVICEの取得
Cludantを起動してCloud Foundryに接続し、VCAP_SERVICESに接続するまでを記載します。
Cloudantを作成する
cloudantを作成します。
できたらDashboardにアクセスしDBを作成してデータを登録します。
Cloud Foundryを作成しCloudantを接続する
Cloud Foundryを作成します。サービスはあとで書き換えますが一応Tomcatで作成しています。
作成できたらCloudantを接続します。
VCAP_SERVICESを取得する
Cloud Foundryにアクセスし、Runtimeのタブを開くとEnvironment Variablesの項目にVCAP_SERVEICEが作成されています。
application.ymlやapplication.propertiesに登録する際は、JSONの改行を消して1行にして記載しましょう!
実装
propertiesファイルにVCAP_SERVEICESを1行にしたものを記載します。1
また、この設定でCloud Foundry環境にデプロイした場合、変数の優先度の関係でローカルではpropertiesの変数、本番ではCloud Foundryの変数が使われるようになり良い感じに開発できます。
VCAP_SERVICES={ YOUR_VCAP_SERVICES_JSON : YOUR_JSON_PROPERTIES }
@Configuration
public class CloudantConfiguration {
@Value("${VCAP_SERVICES}")
private String vcapService;
@Bean
public CloudantClient cloudantClient() {
return ClientBuilder.bluemix(vcapService).build();
}
}
受け取るDaoを作成していない場合はJsonObjectで受け取るのが良いです。
cloudantのライブラリがデフォルトで使用しているclassなので問題なく動作します。
@RestController
@SpringBootApplication
public class CloudantdemoApplication {
@Autowired
CloudantClient cloudantClient;
public static void main(String[] args) {
SpringApplication.run(CloudantdemoApplication.class, args);
}
@RequestMapping("/")
public String index() {
Database db = cloudantClient.database("users",false);
QueryResult<JsonObject> result = db.query(new QueryBuilder(eq("name","LLENN")).build(), JsonObject.class);
return result.getDocs().toString();
}
}
$ mvn spring-boot:run
などでアプリを実行し、curlを投げると以下のように返却されます。
$ curl http://localhost:8080/
[{"_id":"18f6e5d603317e7a8189513270bc6e28","_rev":"1-487469bb37faf2e391ce4f8897b54e75","name":"LLENN"}]
Cloud Foundryにデプロイする
pom.xmlでwarを出力するように設定し、
ソースコードをビルドします。
$ mvn -DskipTests=true package
作成した環境にデプロイします。
IBM Cloud CLIのbxコマンドを使用します。
# bx コマンドでログインします。
$ bx login
# cloud foundryの環境を選択します。
$ bx target --cf
# アプリの一覧を取得します。
$ bx cf apps
名前 要求された状態 インスタンス メモリー ディスク URL
Cludant-Demo started 1/1 768M 1G Cludant-Demo.mybluemix.net
# アプリをCloud Foundryにデプロイします。
$ bx cf push Cludant-Demo -p ./target/cloudantdemo-0.0.1-SNAPSHOT.war -b https://github.com/cloudfoundry/java-buildpack.git
...
...
状態 開始日時 CPU メモリー ディスク 詳細
# 0 実行 2018-09-01T00:00:00Z 0.0% 1.1M of 768M 1.3M of 1G
自動でCloud Foundryが起動されるので、URLにcurlでアクセスしてみます。
$ curl https://Cludant-Demo.mybluemix.net/
[{"_id":"18f6e5d603317e7a8189513270bc6e28","_rev":"1-487469bb37faf2e391ce4f8897b54e75","name":"LLENN"}]
確認が終わったら停止させておきましょう。
$ bx cf stop Cludant-Demo
備考
ソースコードは以下です。
https://github.com/amanoese/cloudant-demo
参考
https://console.bluemix.net/docs/cli/index.html
https://github.com/cloudant/java-cloudant