Appengine Java Night #2 LT
-
Upload
shinichi-ogawa -
Category
Technology
-
view
1.552 -
download
2
description
Transcript of Appengine Java Night #2 LT
![Page 1: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/1.jpg)
appengine java night #2ProtocolBuffer on HTTP
shin1ogawa@株式会社トップゲート
![Page 2: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/2.jpg)
各サービスの実行の仕組みApiProxy#getDelegate()
Application
LowLevelAPI
ApiProxy#getDelegate()
サービスのStubサービス本体
PBPB
![Page 3: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/3.jpg)
Delegate#makeSyncCall()Service名,Method名,Request(byte[])
ApiProxy#getDelegate()#makeSyncCall()
サービスのStub/本体PB(byte[])
![Page 4: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/4.jpg)
重要な事実に気づいたねっとりとServer側を監視してたら…
•デプロイ環境でApiProxy.setDelegate(覗き見Delegate)して、実際のサービスとやりとりされるProtocolBufferオブジェクトを観察。
•よくよく観察してみると、ローカル環境と同じProtocolBufferオブジェクトが使用されている。
![Page 5: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/5.jpg)
何か思いついちゃった!つまり•ローカル環境でOreOreDelegateを実装し、#makeSyncCall()をフックして、Stubにリクエストを渡さずそのままデプロイ環境へ転送する。
•デプロイ環境は受け取った値を使用してApiProxy.getDelegate().makeSyncCall()を実行し、結果をローカル環境へ返す。
•ローカル側のOreOreDelegateはその結果を何食わぬ顔でLow-Level APIへ返す• Low-Level APIを経由してApplicationまで返る
![Page 6: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/6.jpg)
ProtocolBuffer on HTTP左がローカル環境、右がデプロイ環境
OreOreDelegate
サービス本体
OreOreServletPB
PB
Application
LowLevelAPI
PB
![Page 7: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/7.jpg)
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);
![Page 8: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/8.jpg)
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[]を受け取るだけ。}
![Page 9: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/9.jpg)
あっさり動いたこの仕組みを使うと
•ローカル環境でDatastoreにクエリ"なぜかデプロイ環境のDatastoreの結果が返る
•ローカル環境でDatastoreに保存"なぜかデプロイ環境のDatastoreに保存される
•ローカル環境でMemcacheをクリア"なぜかデプロイ環境のMemcacheが空っぽ
![Page 10: Appengine Java Night #2 LT](https://reader036.fdocuments.net/reader036/viewer/2022082805/54c2e7a44a795987048b45ab/html5/thumbnails/10.jpg)
ご清聴ありがとうございました!
shin1ogawa@株式会社トップゲート