結構前にElasticSearchをちょっとだけ勉強していました。
とりあえず動けばよかったんですが、今回はもうちょっと勉強してみます。
今回つくるもののイメージ
ただのイメージです。
環境準備
毎度のことながらDockerで環境を用意します。 ElasticSearchとKibanaはほとんどセットみたいなもんなんで、一緒に作ってみます。
まずディレクトリはこんな感じですかね。
. ├── data ├── docker-compose.yml ├── env │ └── elasticsearch │ └── Dockerfile └── microservice ├── Dockerfile ├── instance ├── microservice │ ├── __init__.py │ └── myapp.py ├── setup.py └── test ├── conftest.py └── test_factory.py
DockerfileはElasticSearchとFlaskでこんな感じにしました。
ElasticSearch
Flask
docker-compose.yml
ここまでは前回とほとんどいっしょですね。
ドキュメントストアに関するマイクロサービス
Pythonからつなぐ
今回はPythonで文書を成形して登録していきます。
まずは、ElasticSearchへの登録を考えます。
この前やってた感じでは、こんな感じでElasticSearchに登録できるようです。
ちゃんと登録されてますね。
Flaskを使ったエンドポイント接続
Flaskを使ってエンドポイントを定義してリクエストを受け付けるようにします。 今回はお上品な方のFlaskの書き方でやってみます。
まず、ファクトリ関数を作ります。
ここでエンドポイントはこんな感じにしています。
- /myapp/search
- /myapp/register
まずはこれだけこれだけ動かしてみます。
microservice $flask run * Serving Flask app "microservice" (lazy loading) * Environment: development * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 273-900-170
この状態でエンドポイントにアクセスしてみます。
~ $curl localhost:5000/myapp/register/ register ~ $curl localhost:5000/myapp/search/ search
まずは期待通りの応答が返ってきています。
次に、ElasticSearchにアクセスするように書き換えます。 先ほどのファクトリ関数をいじります。
これで連携できました。 また動かしてみます。
flask run
試しに検索してみます。
$curl localhost:5000/myapp/search/ {"_shards":{"failed":0,"skipped":0,"successful":5,"total":5},"hits":{"hits":[{"_id":"qmPYbGoBESqVGIVWwFuJ","_index":"sample","_score":1.0,"_source":{"contents":"contents","title":"title"},"_type":"sample"},{"_id":"q2PZbGoBESqVGIVWDFuo","_index":"sample","_score":1.0,"_source":{"contents":"contents","title":"title"},"_type":"sample"}],"max_score":1.0,"total":2},"timed_out":false,"took":8}
ちゃんとFlask側から中身を取得できました。
テストも書いてみる
せっかくテスト駆動開発の勉強をしたことですし、練習でテストもちゃんと書いてみます。 本来なら先にテストを書くのが普通ですが、そのへんはご愛嬌ということで。。。
テスト観点としては、
- search
- 検索が成功すること
- 検索結果がjsonで取得できること
- register
- POSTメソッドによってインデックスできること
- POSTメソッドのパラメータがインデックスされること
テストコードとしてはとりあえずこんな感じでしょうか。
できたもの
今回作ったものはこちらに置いておきます。
感想
そもそも論で、今回やったことはElasticSearch自体がREST APIで接続できるので、あまり意味はありません。笑
単純にマイクロサービスの勉強として、それを適当につないでみました。 あとは、DBの共有はやめろとマイクロサービスアーキテクチャの本に書いてあったので、こういうのが必要になってくるでしょうね。
ElasticSearchに接続するマイクロサービスを使って、ElasticSearchに関して復習してみました。 次は、Logstashの勉強してみます。