Appengine Java Night #2 LT
-
Upload
shinichi-ogawa -
Category
Technology
-
view
1.550 -
download
2
description
Transcript of Appengine Java Night #2 LT
appengine java night #2ProtocolBuffer on HTTP
shin1ogawa@株式会社トップゲート
各サービスの実行の仕組みApiProxy#getDelegate()
Application
LowLevelAPI
ApiProxy#getDelegate()
サービスのStubサービス本体
PBPB
Delegate#makeSyncCall()Service名,Method名,Request(byte[])
ApiProxy#getDelegate()#makeSyncCall()
サービスのStub/本体PB(byte[])
重要な事実に気づいたねっとりとServer側を監視してたら…
•デプロイ環境でApiProxy.setDelegate(覗き見Delegate)して、実際のサービスとやりとりされるProtocolBufferオブジェクトを観察。
•よくよく観察してみると、ローカル環境と同じProtocolBufferオブジェクトが使用されている。
何か思いついちゃった!つまり•ローカル環境でOreOreDelegateを実装し、#makeSyncCall()をフックして、Stubにリクエストを渡さずそのままデプロイ環境へ転送する。
•デプロイ環境は受け取った値を使用してApiProxy.getDelegate().makeSyncCall()を実行し、結果をローカル環境へ返す。
•ローカル側のOreOreDelegateはその結果を何食わぬ顔でLow-Level APIへ返す• Low-Level APIを経由してApplicationまで返る
ProtocolBuffer on HTTP左がローカル環境、右がデプロイ環境
OreOreDelegate
サービス本体
OreOreServletPB
PB
Application
LowLevelAPI
PB
MakeSyncCallServletサーバ側でmakeSyncCall()するだけString serviceName = req.getHeader(SERVICE_NAME);String methodName = req.getHeader(METHOD_NAME);byte[] requestBytes = IOUtils.toByteArray(req.getInputStream());byte[] responseBytes = ApiProxy.getDelegate().makeSyncCall( ApiProxy.getCurrentEnvironment(), serviceName, methodName, requestBytes);resp.getOutputStream().write(responseBytes);
MakeSyncCallDelegateMakeSyncCallにつなぐだけpublic byte[] makeSyncCall( Environment environment, String serviceName, String methodName, byte[] request) throws ApiProxyException { return protocolBufferOnHttp( environment, serviceName, methodName, request);}byte[] protocolBufferOnHttp(.....) { // makeSyncCallにPostしてbyte[]を受け取るだけ。}
あっさり動いたこの仕組みを使うと
•ローカル環境でDatastoreにクエリ"なぜかデプロイ環境のDatastoreの結果が返る
•ローカル環境でDatastoreに保存"なぜかデプロイ環境のDatastoreに保存される
•ローカル環境でMemcacheをクリア"なぜかデプロイ環境のMemcacheが空っぽ
ご清聴ありがとうございました!
shin1ogawa@株式会社トップゲート