横断的関心事の実装

Java 言語、例えば、Spring Framework を使用してアプリケーションを実装する場合に、認証といった横断的関心事は、Spring Security などのライブラリにより実現することがこれまでよく行われていました。

Spring Framework やこれらのライブラリは、ServletServlet Filter といった基盤の上に構築されています。そして、認証のような横断的関心事の中心は Servlet Filter としてライブラリに実装されたコードになります。

外部からくる Ingress traffic が Servlet Filter や Servlet と通信し Egress traffic として外部に出ていく様子を図にすると次のようになります。

f:id:section27:20220212185620p:plain

モノリスなアプリケーションの場合、Servlet Filter のような仕組みを使って認証のような横断的関心事を実装することは特に問題にはなりませんでした。

クラウドコンピューティングの流行とともにマイクロサービスアーキテクチャの時代になり、問題は顕在化されてくることになります。

数百、数千というマイクロサービスに分割されたとき、それぞれのサービスが同時に全く同じ言語、フレームワークで構築されるというよりは、それぞれのサービスに適した言語、フレームワークが利用されることになります。

こうした時に横断的関心事の実装は言語に依存しないことが望ましいといえます。クラウドコンピューティングはコンテナテクノロジーの進化ももたらしました。コンテナはそれぞれが独自のサーバとして動作し独自のアドレスを持っているだけでなく、コンテナ間で通信する独自のネットワークを持つこともできます。

例えば、人気のある Envoy ProxyServlet Filter の代わりに利用すると、次の図のような構成にすることができます。

f:id:section27:20220212185725p:plain

Envoy Proxy と Open Policy Agent などを組み合わせると、JWT を使うユーザ認証や RBAC でのユーザ認可だけでなく、これまでアプリケーションに組み込んでいたさまざまな横断的関心事の実装を分離することができます。

ここで登場した、Envoy Proxy はサービスメッシュのデータプレーンでよく利用されるコンポーネントです。

サービスメッシュは、east-west トラフィックを処理し「The InfoQ eMag - Service Mesh Ultimate Guide 2021」によると、以下のような機能を提供します。

  • 接続性 (Connectivity)
  • 信頼性 (Reliability)
    • サーキットブレーカー
    • 失敗の挿入/カオステスト
  • セキュリティ (Security)
    • サービス間認証 (mTLS)
    • 証明書管理
    • ユーザ認証 (JWT)
    • ユーザ認可 (RBAC)
    • 暗号化
  • 可観測性 (Observability)
    • モニタリング
    • テレメトリ、計測、メトリクス
    • 分散トレーシング
    • サービスグラフ

最後に

このような構成は以前からなかったものではありません。Apache HTTP ServerNginxHAProxy などでも認証をはじめとして横断的関心事を処理する機能があります。

これらにある大きな違いは、パフォーマンスとコンテナ環境での利用のしやすさにあります。

さらに最近、eBPF と呼ばれるこうした横断的関心事の処理を Linux カーネルモジュールとして実現しようという動きもあります。

このようなトレンドがどこに向ったとしても、開発者がドメインのコードに集中できるようにするという目的から離れることはないでしょう。

参考

アイコン等の出典