site_review: 2021-12-08 01:24:38.285862 【技術本】Go言語によるWebアプリケーション開発

【技術本】Go言語によるWebアプリケーション開発

https://amzn.to/4nUchFo


【技術本】Go言語によるWebアプリケーション開発


x postへポスト
内容はGoの基本的な言語仕様を理解していることを前提で記載されています。
(※そのためか環境構築は末尾の「付録A」に記載)
ただし、初心者でも他言語の経験者であれば読み進められると思います。

下記項目を学べます:
・認証を備えたチャットアプリの作成でHTTP,WebSocket,OAuthの基礎
・マッシュアップ:Google Place, Goole Map, TwitterストリーミングAPIなどからデータを取得し、加工したデータの公開APIの作成
(REST形式でCORS(Cross-Origin Resource Sharing)にも対応したAPIの公開方法から取得結果をWebでグラフィカルに表示活用するまで)
・mongoDB,NSQなどのミドルウェアとの連携
・コマンドラインツールで標準入出力を橋渡した複数連携までの応用や、デーモンツールの作成方法

環境:
・作業環境:mac,linuxでの前提で記されている
・必須:git, (homebrew)
・章の途中で使用:mongoDB,NSQ

読み進めていくことでGo言語には独自の慣用表現があり、その癖をつかむことで強力でコンパクトなコードが書ける事がわかってくる。(特に並行処理をシンプルに記述できる)
利用するAPI、パッケージもサービスが大きなもの、コミュニティでバグフィックスや更新が活発なものをチョイスし、アジャイル開発やテスト駆動開発で実装をすすめるといった作業の実践における基本は抑えている。
内容はWeb関連とコマンドラインツール作成での基本項目は抑えている。また、新たにサービスを作り上げる際、各システムのコンポーネントをマイクロサービス化し、将来的にスケーリングや耐障害性を考慮した柔軟な構成を作るノウハウについても軽く触れている。
以上の点を踏まえ、各章の技術を応用し、Go言語による独自サービスのアーキテクチャを構想する上での礎となりうる参考書だと感じた。

注意事項:
記載されているソースコードは一部が省略されていたり、バグがあったりで、紙面のみですすめる場合は注意が必要だが、基本的にコンパイラのエラーメッセージを追えば解決できるレベル。
※(例)紙面4章 bighuge.goは存在しないjsonキーを参照する場合にメモリセグメントエラーが起こる。
※2章-P42:gomniauthを使用:mac環境では、依存ライブラリは右記のコマンドで解決した。: brew install bazaar
筆者がWeb(Github)で公開してる全てのソースコードは、bugfixしたり機能改善されたものに刷新されている。

記載されている概要は以下の様です。

--------------------------------------------
1章.WebSocketを使ったチャットアプリケーション

・net/httpパッケージで簡易Webサーバの実装。
・テキスト、html用のテンプレートの使用によるコンテンツの分離。
 -> text/template テキスト向け
 -> html/template html向け、データ挿入時にコンテキスト認識をする。不正スクリプト埋め込み回避やエンコード処理(エスケープ)が行われる
・sync.Onceによる一度だけの実行。
・ユーザが作成した構造体にServerHTTPメソッドを実装してhttp.Handler型のインタフェースに適合させHTTPリクエストを処理できるようにする。
・Goプログラムのビルドと実行の方法。
・サードパーティ・オープンソースのwebsocketを利用。(go getでパッケージ取得)
・goroutineによる並行化と、goroutine間で安全にメッセージパッシングするチャネルによる情報共有。
・defer文による関数終了時呼び出し。
・select文のcase節は同時実行されない再入可能な性質の利用。
・コマンドライン引数から値を取得し、サーバの設定を動的に指定する実装例。
・ログトレース用の自作パッケージの作成とインポート:インタフェースの定義と実装を踏まえ処理の追加。
・公開してない構造体の型をユーザに返す事ができ、ユーザは型について関知しないが、その型で公開されているインタフェースに基づいて操作できる。
・TDD(Test Driven Development)に準じたユニットテストの簡単な実装例と実行。 (go test)。

--------------------------------------------
2章.認証機能の追加
1章で作成したチャットアプリを、Facebook,Github,Googleアカウントの認証を利用してログインできるように機能追加。認証で得たユーザ名でチャットできるようになる。

・Decoratorパターンで、http.Handler型をラップし複数のハンドラを指定順に処理できるように実装。
・OAuth2を使用した他サービス認証連携。(オープンソースgomniauthを使用)
※mac環境では、依存ライブラリは右記のコマンドで解決した:brew install bazaar
・Cookie,Base64,JSONを使った実装。
・htmlテンプレートに動的値を渡す。

--------------------------------------------
3章.プロフィール画像を追加する3つの方法
1章で作成したチャットアプリの画面にユーザのアバター画像を以下の方法で取得する
(1).認証サービスからアバターの画像を取得
(2).GravaterというWebサービスでユーザのメールアドレスから画像を検索し取得
(3).ユーザが作成したアプリに画像をアップロードして取得(Goで静的サーバ:ファイルサーバ)

・md5のハッシュの利用。
・例外処理:error.Newでエラーオブジェクトへのポインタを作成できる。以降はポインタで渡される。(Javaなどの例外は高いコストでオブジェクトが作られる)
・グローバル変数の利用。

--------------------------------------------
4章.ドメイン名を検索するコマンドラインツール
指定したドメイン名とその候補を検索し、使用可能かチェックできるツールの作成。
小さなコマンドラインツールを組み合わせて強力な処理を可能にする。
ツール中で使用する外部サービス:
(1)Big Huge Thesaurus(Webサービス)のAPIを利用(類語候補選出)
(2)WHOISサーバ問い合わせを利用(使用可能domain照合)

・os.Getenvで環境変数から設定値の取得。
・コマンドライン(パイプ)を利用した複数のGoプログラム間での標準入出力の連携。
・Goプログラム内で標準入出力の連携。
・bashによる複数Goプログラムのビルド。

--------------------------------------------
5章.分散システムと柔軟なデータの処理
TwitterのストリーミングAPIを使用して、ツイートのトレンドワード状況をリアルタイムに取得して集計するアプリの作成。
各システムのコンポーネントをマイクロサービス化し将来的にスケーリングや耐障害性を考慮した構成を可能とする設計も提示。
必須ミドルウェア環境
・mongoDB:ドキュメント指向DB
・NSQ:メッセージキュー
・上記各種Go用ドライバ
※各種環境構築はhomebrew(mac環境)などでインストール可能。
※ドライバも[go get]で取得可能。
※mongoDBはドキュメント指向でありテーブル定義も不要ですぐ使える。

・envdecodeパッケージの`env:"HOGE"`による環境変数からの設定値の取得。
・プログラムを穏やかに終了する手法。
 -> 問題発生時、必須処理を実行してから終了する実装方法
 -> シグナルのチャネルを使用する方法
 -> ctrl+cでの終了に対応した実装方法
・構造体struct{}{}はフィールドがないためメモリを全く消費しない。
 -> シグナルのチャネル送受信でメモリ消費削減に利用できる。
・mongoDB:イテレータでfindした結果を格納し順次アクセスすることによるメモリ消費削減。
・time.AfterFunc(int,func)でgoroutineによる一定時間後実行とcallback関数による実装。

--------------------------------------------
6章.REST形式でデータや機能を公開する
5章で作成したTwitterツイート検索アプリのAPIを作成しブラウザで利用できるようにする。

・ハンドラ間でのデータ共有のためグローバル変数を操作するロック機構を備えたヘルパー関数群の実装方法。
・DRY(Don't Repeat Yourself)に基づく実装方法。
・CORS(cross-origin resource sharing)によるWebドメイン間のリソース共有。
・labix.org/v2/mgo/bsonパッケージによるjson,bsonのキー値取得方法。
・curlコマンドを使ったAPIテスト。
・JQuery等でグラフィカルなブラウザ表示用インタフェースの作成。(※ここはGoでない)

--------------------------------------------
7章.ランダムなおすすめを提示するWebサービス
Google Place, Google Mapを使用した位置情報からおすすめスポットを表示するWebAPIの作成。
※html,js,cssなどを筆者のリポジトリから取得することでグラフィカルな表示結果が可能。
公開するAPIを変更せず内部を改良したり駆動開発の例を踏まえて記載されている。

・runtime.GOMAXPROCS:CPU数の最大値指定。
・sync.WaitGroupによる複数goroutineの終了待ち制御。
・Goに用意されていない列挙の仕組みを実装。

--------------------------------------------
8章.バックアップの作成
Goの標準ライブラリ(ioutil,osなど)を使用したバックアップツールの作成。
コマンドラインで実行するツールと、デーモンで起動するプログラムを作成。
※ファイル変更検知用ハッシュ値の永続化に筆者独自のパッケージを使用

・filePath.Walkを使った全ファイル、フォルダへのアクセス。
・md5によるファイル内容変更検知。
・archive/zipによるファイル圧縮。

--------------------------------------------
付録A 安定した開発環境のためのベストプラクティス
・Goの実行環境、開発環境の構築
 ※最新版等のインストールは、Goの公式サイトのインストール手順もあるのでそちらも参照。

付録B Goらしいコードの書き方
・各章で紹介されたGoによる実装を、よりGo言語ならではの実装に変更した例を紹介。

以上。


x postへポスト