🐝

とりあえずやってみるマイクロサービス

2021/12/15に公開

はじめに

1つのプロジェクトでやる事を最低限のサービスに絞り、いくつかのプロジェクトを協調させて1つのシステムにしてみます。

ユーザー管理システムのマイクロサービス化

単純なシステムであれば1つのプロジェクトとして作ってしまう所ですが、今回はシステムを構成する要素をそれぞれ独立したプロジェクトとして考えてみます。
以下の小さなサービスを、それぞれ独立したプロジェクトとします。

認証のサービス

ID情報ともう1つの情報(今回はパスワード)で認証を行い、認証トークンを発行します。認証トークンが有効なものかどうかの検証もこのサービスで行います。
2つのAPIを実装します。

  • パスワード認証API
    メールアドレスについてパスワード認証を行い、一定期間有効な認証済みトークンを払い出します。
  • トークン検証API
    パスワード認証APIで払い出したトークンの有効性の検証を行います。

権限のサービス

あるユーザーがあるリソースへアクセスする際にその権限を持つかどうかを判定します。
1つのAPIを実装します。

  • 権限チェックAPI
    あるユーザーがあるリソースへアクセスする権限を持つかのチェックを行います。

ユーザー管理のサービス

ユーザーという情報に対して確認や編集を行います。
ユーザー情報のCRUDを行うAPIを実装します。

  • 作成API
    ユーザーを新規作成します。
  • 取得API
    ユーザー情報を取得します。
  • 更新API
    ユーザーを更新します。
  • 削除API
    ユーザーを削除します。

サービスとしての独立性を考える

それぞれが独立したサービスであることが重要です。今回は3つのサービスを組み合わせますが、仮にどれか1つが欠けた場合はどうなるか考えてみたいと思います。どれかが欠けたとしても、何らかのサービスとして成り立たなければいけません。

認証サービス×権限サービス

あるユーザーであることを認証し、かつそのユーザーがあることをする権限を持っているかを判定をすることが出来るサービスになります。ログインしたユーザーが自身の状態(=権限の状況)を確認するようなサービスとなることが考えられます。

認証サービス×ユーザー管理サービス

あるユーザーであることを認証し、そのユーザーとしてユーザー管理操作を行うサービスになります。権限管理が無く、ログインユーザーではないゲストユーザーとしてもすべてのユーザー管理操作を行う事が出来るオープンなサービスになります。

権限サービス×ユーザー管理サービス

サービス利用者をすべてゲストユーザーとし、ユーザー管理操作の一部を一律で制限することが出来るサービスになります。ユーザー情報を閲覧するだけや、追加・編集までは行えるが削除は行えない等の制限を掛けられるサービスです。

サービスの依存関係

実装を行ったところ、下の図のようにユーザー管理サービスから認証サービスと権限サービスを呼ぶ形が出来上がりました。これは単純にこれまでサービスとして実装していた部分を外部サービスのAPIを叩く実装に切り替えた形になります。ユーザー管理サービスが認証サービスや権限サービスに依存していることになります。これが良いか悪いかは、一旦置いておきます。

例えばサービス間の依存を無くすことを考えるならば、もう一つサービスを協調させる役割を担わせる部分を追加することが出来そうです。

この時、図の「アプリケーション」が行っていることは、

  1. 認証サービスへ問い合わせを行う。認証に失敗した場合、クライアントへエラーを返す。
  2. 1.で認証されたユーザーがこれから行おうとしている操作の権限を持っているか、権限サービスへ権限の問い合わせを行う。権限が無い場合、クライアントへエラーを返す。
  3. 2.で権限を持つと判定された場合、ユーザー管理サービスへユーザー情報の操作リクエストを行う。

となります。アプリケーションレベルのリバースプロキシみたいな感じですね。クライアントからのリクエストによってルーティングを行い、あらかじめ決めた順番でサービスへ問い合わせその結果によって次のサービスへ問い合わせるか、エラーを返すかを判断させる仕組みにすれば良さそうなので、比較的シンプルな実装にできそうです。

おわりに

なんかそれっぽいものが出来てきた気がします。
ここからさらに「書籍管理サービス」「貸出管理サービス(誰が〇〇をいつまで占有しているかを管理するサービス)」を追加し、書籍管理システムに仕上げられればと思っています。ユーザー管理サービスと書籍管理サービスは、対象が違うだけでCRUDするシステムであることは同じなので、良い感じに分離したいところです(権限も…)。

今回作ってみたもの

Discussion