Go 1.22+のnet/httpでアプリケーションを構築するにあたり、ミドルウェアの設計を検討する。特に、リクエストのロギングは必須要件となる。
一般的なアプローチは、複数のミドルウェアをチェインさせる、いわゆるタマネギ構造だ。例えば、リクエストID生成、認証、ロギングなどを個別のミドルウェアとして実装する。この方法は各機能の関心が分離され、再利用性が高い。
しかし、ミドルウェア間で依存関係が生じる場合に複雑化する。例えば、アクセスログを記録するミドルウェアは、リクエストIDを生成するミドルウェアがコンテキストに設定した値に依存する。この依存関係は暗黙的であり、ミドルウェアの適用順序を厳密に管理する必要がある。これが保守性の低下を招くことは経験上明らかだ。