質問: AngularJSに限ったことでは無いかも知れませんが。 こういうJavaScriptのフレームワークを使った場合、 サーバーサイドはAPIを提供するだけで済むので、たとえば、後から サーバーサイドのフレームワークを変えたり 全く異なる言語のフレームワークにしたり することは可能ということでしょうか? 極端なことを言うと、サーバーサイドは複数のフレームワーク(言語も複数)が交ざっていても 良い、ということになりますか? よろしくお願いします。
回答: その通りです。 フロント側はAngularJSにかぎらず全てのフレームワーク共通で、 Ajax通信を飛ばして値を受け取ってViewに展開したり編集して別のAjax通信を投げて更新という仕組みです。 サーバー側はそのAjax通信を捌ければ言語やフレームワークは問いません。 単純Restfulの概念でURLやメソッドで求められる仕事が異なりますので、 特定のリクエストだけを抽出して、合致するWebサーバーに振り分ける仕組みさえ構築出来れば良いです。 うちの職場でもSPAのWebサービスを公開しており、昔はCakePHPでやってましたが、Node.js+Expressに乗り換えてます。 特に速度が必要になる箇所ではScalaやC#を利用しています。 長くなった割に沢山の箇所がargiusさんの想定通りかと思いますが、 新しい発見のお役に立てると信じて記載します。 ### 例題 開発速度を優先するために、今までCakePHPを利用して開発してきた。 しかし、パフォーマンスが悪いのでScala+PlayFrameworkで置き換えようというプロジェクトが発足しました。 でも、既存のシステムの不具合や要望があるので改修もする必要がある。 いきなり新しい言語とフレームワークで開発速度が出るわけない。 とてもじゃないがイチから作るリソースなんて確保出来ない。 今回は既存システムでアクセスが多くボトルネックの原因であった 「http://example.com/questions」だけをPlayで置き換えることに決定しました。 はい、ここまでで障害となりうる箇所が2つ出てきます。 * ルーティングをどうするのか * ログインが必要な情報はどうするか ログインはどちらかがどちらかのラッパーでも作って対処するしかありません。 両方のシステムが参照出来る箇所にユーザーのログイン情報を格納しておき、両者が同じ実装のロジックで確認する必要があります。 ### ルーティングを解決 上記の例は全てのアクセスをCakePHPで捌く事が前提だったのでApacheに全てアクセスを集めて、 そこから全てのアクセスをCakePHPのウェブルート内のindex.phpに集めるという設計でした。 しかし、80番ポートを受け取れるのは1台のサーバーにつき1つのアプリケーションのみ。 「あれ?これCakePHPとPlayが共存するのは無理じゃね?」 この問題を解決してくれるのがリバースプロキシです。 リバースプロキシとは、自身がWebサーバーとしてアクセスを受け、 URLや負荷状況等の情報を元に、アクセスを別のプロセスやサーバーに振り分けるサーバーを指します。 例えばCakePHPとPlayはそれぞれ8080、8081ポートで待ち構えておき、 「http://example.com/questions」が来た時だけ8081ポート(Play)へ流す。 他のアクセスは全て8080ポート(CakePHP)へ流すという仕組みを構築すれば解決です。 これは沢山ある解決方法の1つで、他にも状況に応じて様々な実装があります。 列挙出来る程詳しくはないので割愛します。 ソースコードやサーバーの依存モジュールが煩雑になる事が想定されるので、 サーバー自体の分割や、Dockerによる仮想マシン化が次なる課題への解決策となりそうです。