ミドルウェアとは何ですか?定義と使用例

ミドルウェアは、Web開発で一般的に使用される用語です。文脈によっては多くのことを意味する可能性があるため、この用語は少し混乱します。

この記事では、用語を定義することから始め、次にいくつかの異なるユースケースについての議論を続けます。

この記事を読んだ後は、同僚との技術的およびアーキテクチャ的な会話にもっと参加できるようになります。また、安全で信頼性の高いAPIとデータフローの設計に関しても能力が向上します。

ミドルウェアの定義

ミドルウェアは、2つのアプリケーションまたはサービス間の通信を容易にするための仲介役として機能するソフトウェアです。

これは、データアキュムレータ、トランスレータ、または要求を転送する単なるプロキシとして機能できるプロキシと考えることができます。

ミドルウェアの一般的な使用例

1)翻訳者

JSON、XML、Protobufなど、多くのデータ交換フォーマットがあります。最近は主にJSONを使用していますが、それぞれに独自のユースケースがあります。

たとえば、ProtobuffersはJSONよりもパフォーマンスが高いことが知られていますが、人間が読める形式ではありません。したがって、内部サービスにProtobuffersを使用している可能性があり、APIコンシューマーがブラウザーである場合はJSONを使用している可能性があります。

Protobuffersについてもっと知りたい場合は、Protobuffersに関する私の記事をチェックすることもできます。

ここで、互いに通信するために、異なるプロトコルを話すこれら2つのサービスが必要であるとしましょう。

データ変換ライブラリを利用し、受信サービスが理解できる形式にリクエストを変換するミドルウェアを作成できます。

2)データの蓄積-複製

マイクロサービスアーキテクチャは、最新のアプリケーションで一般的に適用されている一般的なアーキテクチャパターンです。

マイクロサービスアーキテクチャに精通していない場合、基本的には、アプリケーションが、互いに独立しており、インターネットを介して通信することで連携して動作する多数の小さなアプリまたはサービスで構成されていることを意味します。

たとえば、eコマースプロジェクトでは、製品を保存および取得するためのマイクロサービス、検索のための別のマイクロサービス、およびユーザーの認証と保存のための別のマイクロサービスがある場合があります。そして、それぞれが独自のデータベースを持っています。

ここで、ユーザーと製品の両方を検索するように検索を実装するとします。

これがモノリシックアプリケーションの場合、クエリを記述して各テーブルを検索し、結果を結合するだけで済みます。しかし現在、私たちのデータベースは異なるサーバーで実行されています。

この問題には複数の解決策があり、そのうちの2つを見ていきます。

データの蓄積

ミドルウェアを使用して両方のサーバーにリクエストを送信し、検索した単語に一致するユーザー名と製品をデータベースで検索するように依頼できます。

次に、両方のサーバーからの結果を蓄積して、クライアントに返すことができます。サーバーの数を増やすと、リクエストの数は直線的に増えることに注意してください(また、これらのデータをマージする必要もあります)。

データの複製

重複データを検索サーバーに保存できるため、製品サーバーやユーザーサーバーから要求する代わりに、データを直接検索できます。これはメモリの点では効率的ではありませんが、はるかに高速です。検索サービスでは速度が重要です。

必要なテーブルがProductとUserの場合、検索サーバーでそれらのテーブルを作成することもできます。次に、新しいユーザーをユーザーデータベースに保存するたびに、検索サーバーにも1つのコピーを保存します。

いくつかのオプションがあります。最初に、ユーザーサーバーと製品サーバーの保存メソッドから検索サーバーの保存メソッドを呼び出して、データを複製できます。または、保存用のミドルウェアを作成することもできます。これにより、次のことが実行されます。

  • 保存要求が到着するたびに、製品/ユーザーサーバーの保存と検索サーバーの保存を呼び出します。
  • 最初の保存が失敗した場合は、他の保存を呼び出さないでください(これによりデータベースの一貫性が保たれます)。

ミドルウェアを使用しない場合と使用する場合の設計図を見てみましょう。まず、これはそれなしでどのように見えるかです:

醜いですよね?確かに、それは醜く、コードをより複雑にし、緊密に結合します。

ミドルウェアを使用した同じソリューションは次のとおりです。

このシナリオでは、クライアント側がミドルウェアを呼び出して製品またはユーザーを保存し、残りを処理します。

製品サーバー、ユーザーサーバー、またはクライアント側でのデータの複製に関連するコードはありません。ミドルウェアがその処理を行います。

3)APIセキュリティ

フロントエンドのクライアント側コードについては、ブラウザのコンソールまたはプロキシ経由で送信リクエストを表示できます。

ログインとサインアップを処理するユーザーサーバーについて話しました。フロントエンドコードがそのサーバーにリクエストを直接送信する場合、認証サーバーのアドレスが公開されます。バックエンドのIPアドレスを学習した後、攻撃者はツールを使用してエンドポイントを見つけ、サーバーをスキャンして脆弱性を見つけることができます。

ミドルウェアをプロキシとして使用して、認証サーバーのURLを隠すことができます。フロントエンドはミドルウェアと通信し、ミドルウェアは要求を認証サーバーに転送し、応答を返します。

このアプローチでは、ミドルウェアのURLからのリクエストを除き、認証サーバーへのすべてのリクエストをブロックすることもできます。これにより、認証サーバーの安全性が大幅に向上します。

フロントエンドが認証サーバーと通信していたため、これは以前は不可能でした。フロントエンドはクライアントのコンピューターを意味するため、IPフィルターを適用できませんでした。

4)パブリックAPIの公開

前のパートでは、ミドルウェアを使用してAPIへのアクセスを制限できることを学びました。

次に、方程式の反対側を見てみましょう。APIへのアクセスを制限したい場合はどうでしょうか。たぶん私たちは銀行のソフトウェアエンジニアであり、銀行はハッカソンを計画しています。APIへのアクセスを提供する必要がありますよね?

しかし、私たちは銀行であるため、もちろんAPI全体へのアクセスを提供してすべての操作を許可することはできません。これは、アクセスを制限する方法を見つける必要があることを意味します。

この目的のために、一部のエンドポイントのみを公開し、リクエストを実際のAPIにリダイレクトするミドルウェアを実装できます。次に、このAPIをハッカソンの開発者に提供します。

結論

この投稿では、ミドルウェアとは何かを定義することから始め、Web開発におけるミドルウェアのユースケースを分類しようとしました。

これはユースケースの完全なリストではありませんが、それでもお役に立てば幸いです。

読んでくれてありがとう。この記事が気に入ったら、私のブログをチェックしてみてください。メーリングリストに登録して、新しい投稿を公開したときに通知を受け取ることもできます:)