楽しかった!
DDD & Microservices with Spring Cloud
- 前半がこれまで僕が経験してきたDDD
- 後半がこれからのために素振りしておきたいこと
これまで僕が経験してきたDDD
最近、組織について考えるようになってきたのもあって「境界づけられたコンテキスト」が一番大切だなって実感してる。全てを一度に相手にするのではなく、切り取られた世界を作って、その中で適用していく。その切り取られた世界の間の関係性もデザインしていく。そうすることで複雑さを手に負える大きさでコントロールできる。
DDDを知った当初は、エンジニアとしてEntityやValueObjectのところが面白いなーって思ってゴニョゴニョコード書いてたりしてたんだけど、しばらくして「もっと良いコード書くためにはその土台となるチームづくりをしなきゃ!」と思ってスクラムを導入してたんだけど、しばらくして「チームを良くしようと思ったら、組織構造について考えなきゃ!」ってイマココ。ちょうどDDD本の2部→3部→4部って流れかな。
第1部のユビキタス言語については、最近ストンと腑に落ちた。英語のユビキタス言語を英語のまま会話で使って、それがコードに反映されていく感覚。そういうのに興味あるけど、日本語使わなきゃだしなぁ、って人は連絡ください!楽天で一緒に働きましょう!(おい
- 左上が、境界づけられたコンテキストの話
- 真ん中下が、色んなコンテキストを1つのモデルでまかなおうとするとお化けモデルになるよの話
- 右上が、目の前の最短の道は泥沼に向かうかもしれない、最短の道ではなくて壁を乗り越えて向こう側に行くには、勇気とスキルが必要の話
これからのために素振りしておきたいこと
DDDでドメインモデルを作っていくときに、自分のスキルでできる部分だけを適用してきてるから、もう少しスキルを上げるともっと世界が広がりそうだなと思って、素振り。結果整合性を運んでくれるドメインイベント。ビューの関心事を分離させてくれるCQRS。組織が大きくなってきたときのためのMicroservice。
特にCQRSは、僕が一番身につけておきたいスキルだなぁ。というのも、やっぱりビューに引きずられるんだよね。ビューには効率性やスピードを求めたいから、ドメインモデルが更新されたことに反応してビュー用のモデルを更新したいなぁって思ってる。そうすることでリポジトリがビューに引きずられにくくなる。
変化していけるアーキテクチャ
とはいえ、DAOバージョンが良くない!っていう気はなく。むしろ、それでサクッとビジネスを立ち上げるのは良いよなって思う。だけど、そのまま拡張していくと大変になると思うので、ビジネスのフェーズに合わせて変化していけるアーキテクチャが大切だよなと。
- あたるかどうかも分からないような立ち上げ時はRDB中心のDAOモデルでサクッと立ち上げる
- ビジネスが「これはいけそう!」って分かってきたら、それまでに得た知識を元にドメインモデリングをしていく。
- ドメインモデルが大きくなってきたら、境界づけられたコンテキスト(Bounded Context: BC)をシステム内に作っていく。
- チームが複数に分かれるときには、BC単位でシステムを分割していく。その際にマイクロサービスアーキテクチャになっていく。
ということだろうかなと思ってる。
でも、どうやったら変化していける?
考えてみた。なんとなく、ユーザー認証系は最初から切り離しておきたいなって思うので。こんな形で始められると良さそうかなって思う。
- Config Service: 設定の外出し管理用
- Discovery Service: サービス同士の通信用
- Edge Service: 裏側にサービスを切り出していくため用
- Auth Service: 認可サービス
- User Service: 認可サービスからもらった情報を元にユーザー情報を提供する用
この状態でビジネスを立ち上げて、DAOスタイル→DDDスタイル→DomainEvent→CQRSまでやっておく。その後チームが分かれるときに、BC単位でEdgeサービスの後ろ側に移動していく。というイメージ。デモの5-msa0では、この構成でアプリを作ってみた。
デモアプリ
回転寿司屋さんの席についてるタブレットアプリを思い浮かべて作ったよ!
注意点
機能
バージョン
- 1-init/kaiten-sushi-web1→DAOバージョン
- 2-ddd/kaiten-sushi-web2→DDDスタイル
- 3-event/kaiten-sushi-web3→ドメインイベントのお試し実装
- 4-cqrs/kaiten-sushi-web4→イベントを受信してCQRS
- 5-msa0→MSAに向かうための第一歩(ユーザーログインつき、user/password。シークレットタブとかでログインするほうがよいかもです。)
起動
Spring Bootアプリを起動して以下のURLにアクセスー。
- テーブル用のアプリ: http://localhost:8080/seat/index.html
- スタッフ用のアプリ: http://localhost:8080/staff/index.html
楽しかった!
今回はテンパってて他の人のセッションを全然聞けなかったから、次はお客さんできたいなー!それかもっと余裕持って準備するか。