個人学習用にマイクロサービスを体験できるサンプルアプリケーションを探していたら,Weaveworks から公開されている「Sock Shop」を発見した.「Sock Shop」は名前の通り「靴下 EC サイト」で「ユーザー登録/商品閲覧/カート/ウィッシュリスト/購入(ダミー)」など,EC サイトに必要な機能が一通り実装されている.ドキュメントに以下の記載があり,マイクロサービスを体験したり,デモに使ったり,トレーニングに使ったりする用途に適している.良さそう!
Sock Shop can be used to illustrate microservices architectures, demonstrate platforms at talks and meetups, or as a training and education tool.
Sock Shop を動かす
「Sock Shop」は Docker / Kubernetes / Amazon ECS など,多くのプラットフォームをサポートしている.今回はお手軽に試すため,Docker Desktop for Mac と Docker Compose を使って動かす.ドキュメントにある Quick Start も Docker Compose を使う手順になっている.以下のように GitHub リポジトリを clone し,Docker Compose を起動すると,「計15種類」のコンテナが起動する.
$ git clone https://github.com/microservices-demo/microservices-demo $ cd microservices-demo $ docker-compose -f deploy/docker-compose/docker-compose.yml up -d (中略) Creating docker-compose_rabbitmq_1 ... done Creating docker-compose_user_1 ... done Creating docker-compose_user-db_1 ... done Creating docker-compose_front-end_1 ... done Creating docker-compose_carts-db_1 ... done Creating docker-compose_orders_1 ... done Creating docker-compose_orders-db_1 ... done Creating docker-compose_edge-router_1 ... done Creating docker-compose_user-sim_1 ... done Creating docker-compose_carts_1 ... done Creating docker-compose_payment_1 ... done Creating docker-compose_catalogue_1 ... done Creating docker-compose_catalogue-db_1 ... done Creating docker-compose_queue-master_1 ... done Creating docker-compose_shipping_1 ... done
起動後に http://localhost
に接続すると,すぐに「Sock Shop」にアクセスできる.
靴下を検索することもできる.
カート機能も充実している.
マイクロサービス紹介
「計15種類」のコンテナで使われている技術をザッと整理すると以下のようになる.マイクロサービスごとに言語とデータストアが異なり,まさにマイクロサービスの思想でもある「ポリグロット (Polyglot)」な構成になっている.Go API の実装を読んでいると「OpenTracing」を使っていたり,負荷テストに「Locust」を使っていたり,コンテナごとに詳しく調べていく楽しさもある.また Go API の Dockerfile を確認したところ「multi-stage builds 機能」も使っていて,学べる点も多くある.コンテナ同士の関係はdocker-compose.yml
に書いてある.
- front-end
- 概要 : フロントエンド
- 言語 : Node.js
- フレームワーク : Express
- GitHub - microservices-demo/front-end: Front-end application for ALL the microservices
- edge-router
- 概要 : リバースプロキシ
- ツール : Traefik
- GitHub - microservices-demo/edge-router
- catalogue
- 概要 : カタログ API
- 言語 : Go
- ツール : OpenTracing
- GitHub - microservices-demo/catalogue
- catalogue-db
- 概要 : カタログデータベース
- データストア : MySQL
- GitHub - microservices-demo/catalogue
- carts
- 概要 : カート API
- 言語 : Java
- フレームワーク : Spring Framework
- GitHub - microservices-demo/carts: Carts service for microservices-demo application
- carts-db
- 概要 : カートデータベース
- データストア : MongoDB
- orders
- 概要 : 注文 API
- 言語 : Java
- フレームワーク : Spring Framework
- GitHub - microservices-demo/orders: Orders service for Microservices Demo application
- orders-db
- 概要 : 注文データベース
- データストア : MongoDB
- shipping
- 概要 : 配送 API
- 言語 : Java
- フレームワーク : Spring Framework
- GitHub - microservices-demo/shipping: Shipping service for microservices-demo application
- queue-master
- 概要 : 配送キュー
- 言語 : Java
- フレームワーク : Spring Framework
- GitHub - microservices-demo/queue-master: A microservices-demo service that processes the orders queue
- rabbitmq
- 概要 : キュー(どこで使っているんだろう?)
- データストア : RabbitMQ
- payment
- 概要 : 決済 API
- 言語 : Go
- ツール : OpenTracing
- GitHub - microservices-demo/payment
- user
- 概要 : ユーザー API
- 言語 : Go
- ツール : OpenTracing
- GitHub - microservices-demo/user: The users microservice.
- user-db
- 概要 : ユーザーデータベース
- データストア : MongoDB
- GitHub - microservices-demo/user: The users microservice.
- user-sim
- 概要 : 負荷テスト実行
- ツール : Locust
- GitHub - microservices-demo/load-test: A load-test script & container for Sock Shop
API 紹介
API ごとに Swagger ドキュメントがあり,簡単に API 仕様を確認できる.試しに「カタログ API」を実行すると以下のようになる.
$ curl -s http://localhost/catalogue/d3588630-ad8e-49df-bbd7-3167f7efb246 | jq . { "id": "d3588630-ad8e-49df-bbd7-3167f7efb246", "name": "YouTube.sock", "description": "We were not paid to sell this sock. It's just a bit geeky.", "imageUrl": [ "/catalogue/images/youtube_1.jpeg", "/catalogue/images/youtube_2.jpeg" ], "price": 10.99, "count": 801, "tag": [ "geek", "formal" ] }
まとめ
- マイクロサービスを体験できるサンプルアプリケーションとして「Sock Shop」を発見した
- EC サイトに必要な機能が一通り実装されている
- 引き続きマイクロサービスの実装を読み解きながら「Sock Shop」の詳細を追っていく