書籍概要

WEB+DB PRESS plus

Google App Engine for Java[実践]クラウドシステム構築

著者
発売日
更新日

概要

Google App EngineはGoogleの提供するクラウド環境です。Python版に続いてこの春,Java版が発表されたことで,クラウドベースのシステム構築が,いよいよ業務レベルで現実のものになりました。本書は,Google App Engine for Java(GAE/J)による開発手法,従来型のシステム構築との考え方の違い,GAE/Jのデータベース環境BigTableの活用ノウハウ,Google Appsとの連携,テストのしかた,課金システム解説など,すでにGAE/Jによるシステム事例を持つ筆者が,現時点で持ちうるノウハウを詰め込んで解説した書籍です。

こんな方におすすめ

  • クラウドによるシステム開発に興味のある方
  • 受託開発に携わる方
  • Google App Engineの利用を考えている方
  • お金をかけずにクラウドを試したい方

本書籍に関するお知らせ

目次

第1章 クラウド時代のシステムインテグレーション

1.1 クラウドコンピューティング

  • クラウドコンピューティングの登場
  • クラウドコンピューティングとは
  • 各プロバイダの特徴
  • Force.comプラットフォーム(salesforce.com)
  • Amazon EC2(Amazon.com)
  • Windows Azure(Microsoft)
  • Google App Engine(Google)

1.2 Google App Engine

  • Google App Engineの概要
  • GAEを使うメリット
  • アプリケーション環境としての特徴

1.3 Google App Engine for Java

  • 機能概要
  • Java実行環境
  • Webアプリケーションサーバ環境
  • データストアへのアクセス
  • 各種サービスAPI
  • Java以外のプログラミング言語の利用

第2章 制約

2.1 Quota(割り当て)とLimit(制限)

  • QuotaとLimit,GAEを特徴付ける2つの制約
  • Quotaとは
  • Quotaの種類
  • Quotaの制限を超えてしまった際の動作
  • Tip 分間Quotaのさらなる引き上げ
  • Limitとは
  • Limitを超えた場合の動作
  • サービスAPIに対する制約
  • データストアサービスに関するQuota
  • Column 自動的に生成されるメタデータ
  • データストアサービスに関するLimit
  • メールサービスに関するQuota
  • メールサービスに関するLimit
  • URLフェッチサービスに関するQuota
  • URLフェッチサービスに関するLimit
  • Column URLフェッチサービス使用時の送受信量について
  • Imagesサービスに関するQuota
  • Imagesサービスに関するLimit
  • Memcacheサービスに関するQuota
  • Memcacheサービスに関するLimit
  • リクエストに対する制約
  • リクエストに関するQuota
  • リクエストに関するLimit
  • デプロイに対する制約
  • デプロイに関するQuota
  • デプロイに関するLimit
  • Column データストア使用時のCPU時間

2.2 Java APIに対する制約

  • Java API,Servlet APIに対する制約
  • ファイルに対する制約
  • 書き込みは行えない
  • 参照と読み込みの制限
  • プロセス,スレッドに対する制約
  • プロセス,スレッドは使えない
  • 代替手段となるもの
  • ソケットの利用の禁止
  • User Interface Toolkitsの利用の禁止
  • Tip クラウド環境でのアプリケーションのパス
  • 画像の編集はImages APIで
  • Tip User Interface Toolkits制限緩和の可能性
  • Reflectionに対する制約
  • アプリケーション内のクラス
  • JRE,App Engine SDK内のクラス
  • その他GAE/JのSDKによって提供されるクラス
  • java.lang.Systemに対する制約
  • 何もしないメソッド
  • 常にnullを返すメソッド
  • java.lang.SecurityExceptionを送出するメソッド
  • Logging
  • LoggingライブラリはJava標準で
  • 標準出力もログになる
  • すべての標準出力がログにリダイレクトされるわけではない
  • ClassLoaderに対する制約
  • Column GAEに制約が必要な理由

第3章 開発手順

3.1 GAEアカウントの作成とデプロイの準備

  • デプロイに必要な手続き
  • Googleアカウントの作成
  • GAEへのサインアップ
  • アプリケーションの作成
  • Column Googleアカウント作成時の注意点
  • Column アプリケーションIDの注意点

3.2 開発環境の構築

  • GAE/J環境構築の手順
  • Javaの入手とインストール
  • Windows,Linux環境の場合
  • Mac環境の場合
  • Eclipseの入手
  • Google Plugin for Eclipseのインストール
  • Eclipse 3.4(Ganymede)の場合
  • Eclipse 3.3(Europa)の場合
  • Tip Eclipse,Google Pluginを使わない場合

3.3 アプリケーションの作成とデプロイ

  • 開発からデプロイまでの流れ
  • プロジェクトの作成
  • ディレクトリ構成
  • srcディレクトリ
  • warディレクトリ
  • アプリケーションの実行とデバッグ
  • GAEへのデプロイ
  • Column Eclipse,Google Pluginを使わない場合のビルド,デプロイ
  • Column warディレクトリの応用
  • Column ローカル環境と実環境との違い

3.4 アプリケーションの設定

  • 設定ファイルの記述と配置
  • デプロイの設定(web.xml)
  • web.xmlファイル
  • サーブレットとURLパス
  • JSP
  • ウェルカムファイル
  • フィルタ
  • セキュリティと認証
  • HTTPS通信
  • エラーハンドラ
  • Column デフォルトバージョン以外へのHTTPSアクセス
  • GAE/Jでサポートされていない設定
  • アプリケーションの設定(appengine-web.xml)
  • appengine-web.xmlファイル
  • 静的ファイルとリソースファイル
  • Column 静的ファイルを認識させるための設定例
  • Column ローカル環境と実環境の相違点
  • システムプロパティと環境変数
  • ssl-enabled
  • セッションを有効にする
  • Cronの設定(cron.xml)
  • cron.xmlファイル
  • スケジュールのフォーマット
  • Cronを使用する上での注意点
  • 管理者権限のみでのタスク実行
  • Cronの更新と確認

3.5 アプリケーションの管理

  • 管理コンソールによる管理
  • Main
  • Dashboard
  • Quota Details
  • Logs
  • Cron Jobs
  • データストア
  • Indexes
  • Data Viewer
  • Administration
  • Application Settings
  • Developers
  • Versions
  • Admin Logs
  • Billing
  • Billing Settings
  • Billing History

第4章 データストア

4.1 BigTable

  • 行と列の概念を持つ巨大なテーブル
  • BigTableとは
  • 検索のしくみ
  • GAEで利用されるBigTableの構造
  • Protocol Bu?ersによるデータ構造の構築
  • RDBMSとの違い
  • BigTableでできないこと
  • 考え方をシフトする
  • データストアの利用方法
  • Tip Null値に対する検索

4.2 JDOによるデータストアの操作

  • JDOによるデータ構造の定義
  • 気を付けるポイント
  • キーによるエンティティの操作
  • エンティティの追加
  • エンティティの取得
  • エンティティの更新
  • エンティティの削除
  • クエリを使ったエンティティの取得
  • エンティティのライフサイクル
  • Tip detachCopy( )メソッドの自動設定

4.3 インデックス

  • インデックスの構造と種類
  • Kindインデックス
  • Single-propertyインデックス
  • Compositeインデックス
  • インデックス定義ファイル

4.4 トランザクション

  • トランザクションとは
  • GAEでのトランザクション処理
  • 楽観的ロック
  • 複数のデータを扱うトランザクション処理
  • キーの階層を利用したエンティティグループ
  • トランザクションとエンティティグループ

4.5 JDO以外のデータストアAPI

  • JPA,Low Level APIによるデータストアの利用
  • JPAによるデータストアの操作
  • GAEでサポートされていないJPAの機能
  • JPAを使用するためのセットアップ
  • EntityManagerインスタンス
  • JPAにおけるデータ構造の定義
  • エンティティの追加
  • エンティティの取得
  • エンティティの更新
  • エンティティの削除
  • Low Level APIによるデータストアの操作
  • エンティティの操作
  • Keyの取得と変換

4.6 データストア設計上の注意点

  • データストアのパフォーマンス対策
  • 書き込みと読み込みのコスト
  • 分散カウンター
  • Listプロパティを使った高速検索

第5章 サービスAPI

5.1 Memcache API

  • メモリキャッシュサービスMemcache
  • Memcacheの概要
  • Memcacheに向いている性質のデータ
  • JCacheを使ってデータをキャッシュする
  • キャッシュデータの有効期限
  • Column キャッシュでないメモリへのロード
  • QuotaとLimit
  • Memcacheの注意点
  • Cacheインスタンスが異なっても同じMemcache
  • Cacheインスタンスのsize( )は全Cacheの合計
  • 登録しているキーの一覧が取得できない
  • get( ),put( )の呼び出しパフォーマンス
  • version間でも共有
  • Memcacheを使用する
  • キャッシュ可能なオブジェクト
  • JCacheとLow Level APIの違い
  • JCache API
  • Low Level API

5.2 URLフェッチAPI

  • HTTPリクエストでほかのホストと通信
  • URLフェッチの概要
  • リクエストの作成
  • HTTPSリクエスト
  • リクエストヘッダの扱い
  • レスポンスの扱い
  • ローカル開発サーバでの挙動
  • URLフェッチリクエストのタイムアウト
  • QuotaとLimit
  • URLフェッチを使用する
  • java.net API
  • Low Level API

5.3 Images API

  • Images API~画像データの加工
  • Images APIの概要
  • Javaでの画像変換
  • 利用可能な画像加工
  • 画像の形式
  • 画像とローカル開発サーバ
  • QuotaとLimit
  • Images APIを使用する
  • ①画像リソースを準備する
  • ②画像データを読み出すコードを記述する
  • ③変換処理をケース別に用意する
  • ④サーブレットに画像出力処理を実装する
  • ⑤画像の合成方法を理解する

5.4 Mail API

  • Mailサービス
  • Mail APIの概要
  • メール送信サービスを支える環境
  • Column GoogleのSMTPサーバはいかに分散されているか
  • メール送信APIの制限
  • 送信者のメールアドレスの制限
  • SMTPサーバの制限
  • QuotaとLimit
  • ローカル開発環境における制限
  • Mail APIを使用する
  • Column 見えない送信制限
  • JavaMail API
  • Low Level API
  • 管理者宛メール送信
  • ユーザアカウントAPIとの組み合わせ
  • Column 今後追加される可能性のあるAPI

第6章 テスト

6.1 ユニットテスト

  • テスト環境
  • テストコンテナ
  • SDKで提供されているライブラリ
  • API Proxy
  • API Proxyの環境設定
  • ローカルサービスの実装
  • テストクラスの作成
  • 基底テストクラス
  • データストアのテスト
  • テストの実施

6.2 ローカル環境でのテスト

  • ローカル環境下でのテストのポイント
  • Eclipse上でのアプリケーションデバッグ
  • データストア
  • ローカル環境のデータストアの操作
  • 各種サービスAPIの挙動
  • Images API
  • URLフェッチAPI
  • Mail API
  • ロギングの方法
  • ログフォーマットのカスタマイズ

6.3 実環境でのテスト

  • データストア
  • テストデータのインポート,エクスポート
  • bulkloaderについて
  • ローダ/エクスポータクラス
  • Remote API
  • 実環境でのロギング
  • 管理コンソールの時間表記について
  • システムステージングの手法
  • 別アプリケーションとしてデプロイ
  • 同一アプリケーションの別バージョンとしてデプロイ

6.4 パフォーマンスの確認

  • アプリケーションのパフォーマンス評価
  • ツール
  • レスポンスタイム
  • CPU負荷
  • Tip 負荷増大に応じたスケール変化のタイミング
  • ネットワークトラフィック
  • データストアのパフォーマンス
  • メール送信
  • Column やってはいけないこと
  • Column アプリケーション設計時の注意点

第7章 Googleが提供するサービスとの連携

7.1 GAEが連携可能なGoogleアプリケーション

  • アプリケーション
  • GAEからアプリケーションを利用するためのサービス
  • Google Apps
  • GAEから見たGoogle Appsとアプリケーション利用の違い
  • Editionによる違い

7.2 アカウント認証サービスとの連携

  • アカウント認証サービスとは
  • アカウント認証サービスを使ってみる
  • プロジェクトの作成
  • 認証処理のフロー
  • ローカルサーバでのテスト
  • GAEでのテスト(Google Accountsを利用)

7.3 Google Calendarとの連携

  • Google Data(GData)API
  • GData APIクライアントライブラリ
  • デモアプリケーションの実行
  • デモアプリケーションのダウンロード
  • サンプルアプリケーションの実行
  • コマンドラインアプリケーションでの操作
  • クライアントライブラリのダウンロード
  • Eclipseによるアプリケーション作成
  • 予定を取得するアプリケーション
  • シーケンス
  • サービスクラス
  • クエリ
  • クエリ条件
  • 取得したデータの表示
  • 予定を更新
  • GAE/Jアプリケーションの作成
  • プロジェクトの作成
  • プログラム
  • コマンドアプリケーションとの違い
  • シーケンス
  • ログイン画面へ
  • 認証情報取得
  • ローカルサーバでのテスト
  • GAEにデプロイしてのテスト

7.4 GAE/Jアプリケーションを独自ドメインで運用

  • オリジナルアプリケーションを独自ドメインでサービス
  • GAEでの設定
  • Google Appsでの設定
  • AuthSubが利用できない場合

7.5 Secure Data Connector

  • ファイアウォール内のサーバへの暗号化通信を実現
  • 第8章 追加リソースの購入

    8.1 Billingの体系

    • BillingとQuota
    • Budget
    • Billing Administrator

    8.2 Billingの設定

    • Billingの有効化
    • Billingの有効化に関する注意事項
    • Budgetの変更
    • Billingの無効化

    8.3 課金量の予測

    • 課金量の試算
    • リアルサーバとの比較

    サポート

    ダウンロード

    ソースコードについては,以下のページをご参照ください。

    Google App Engine for Java 書籍情報
    http://www.gluegent.com/books/
    株式会社グルージェント
    http://www.gluegent.com/

    正誤表

    本書の掲載内容に下記の誤りがございました。読者の皆様,および関係者の方々にご迷惑をおかけしましたことをお詫び申し上げます。

    「第4章 データストア」

    P.148 リスト4.5.1内4行目
    createEntityManagerFactory("transactions-optional");
    .createEntityManagerFactory("transactions-optional");

    P.159 リスト4.6.3内47行目
    (List<CounterShard>)query.execute(name)
    (List<CounterShard>)query.execute(name);

    P.162 リスト4.6.6内3行目~4行目
    Query query = pm.newQuery(Entry.class) .setFilter("categories == :category");
    Query query = pm.newQuery(Entry.class); query.setFilter("categories == :category");


    P.164 リスト4.6.9内3行目
    "select key from " + EntryIndex.class.SimpleName() +
    "select key from " + EntryIndex.class.getSimpleName() +

    P.164 リスト4.6.9内4行目
    " where categories == target");
    " where categories == :target");

    「第5章 サービスAPI」

    P.170 リスト5.1.1内7行目
    private final int ONE_HOUR_SEC = 60 * 60;
    private static final int ONE_HOUR_SEC = 60 * 60;

    「第7章 Googleが提供するサービスとの連携」

    P.245 リスト7.2.1内17行目
    if (req.getUserPrincipal() != null) { →②
    if (req.getUserPrincipal() == null) { →②

    P.254 下から3行目
    http://code.google.com/p/gdata-java-client/downloads/list/
    http://code.google.com/p/gdata-java-client/downloads/list

    P.262 図7.3.6

    商品一覧