今日のお仕事
今日はProxyサーバを作って遊びました。
まあ、評価のお仕事の関係でどうしてもProxyサーバが必要になったので、Proxyサーバを探していたのですが、自分が求めている機能を満たすProxyサーバが見つからないので、結局自分で作ることにしましたとさ。
ただProxyサーバを作るだけなら、そんなに難しくはないのだけれども、パフォーマンスをそれなりに出そうと思ったら、やはりめんどくさそうなので、ライブラリに頼ろうとしてみたり、アプリケーションサーバを無意味にProxy実装にしてみたりしたのですが、結局どれもイマイチ効果がなく、結局1から自分で作ってます。
まあ、めんどくさそうとか散々ごねていた割には、全機能の3,4割が実装できたので、それなら初めから自分でやれば良かったな、と思います。案ずるより生むが易し。
そんな過程で試したものを列挙。
- Ooweb
組み込みHTTPサーバ。
非常に仕組みが簡単。触ってて中々面白かったです。
ただ、Request-URIに対応したアノテーションを書いて、そのクラスに処理を委譲する実装だったので、プロキシサーバ的な実装は作れませんでした。
- Tomcatのアドレスにリクエストがあったらリダイレクトする方式
Tomcatのルートパスに対して、Proxy的な実装を施してURLを取ってくるようにしようと考えたのですが、これもRequest-URIとマッチしないとサーブレットが起動できないようで実現できず。
それならば前述のTomcatのRequest-URIにマッチするようにSquidでURL変換を行って2段プロキシな構成にすることを考えたのですが、Tomcatでアドレスを渡すのをGETメッセージのQueryStringにしていた場合、POSTメッセージで処理したいページのProxyはどうなるのか……という部分で詰まり、これも実現できず。
- Jakarta-Commons HttpClient
HTTPのプロトコルの解析&補助クラスぐらいならJakartaにあるかもしれん……と漁っていたらJakarta-Commonsの中にHttpClientというコンポーネントを発見。HTTPリクエストの生成、HTTPレスポンスの解析を簡単に行うことができるのだが、HTTPリクエストの解析&HTTPレスポンスの生成ができないため、これも実現不可。
ただ、これは便利なので最終的に一部組み込んでます。
ネットで調べていたら、WebLogicにはHttpProxyServletというクラスがあるらしい。
非常に気になる。評価版はダウンロードしたので、いつか試してみよう。
一応Proxy的動作をしてくれるところまではほぼ完成。後は自分が欲しい機能の追加とできればパフォーマンスの改善を。パフォーマンスの改善に関しては、スレッドプールとかProxy-ConnectionのKeep-Alive対応である程度は向上しそうな感じ。