Go言語を使ってとっても簡単にHTTP2に対応したWebサーバを構築できる事を知りましたので勉強がてら実装してみました。
本当にとっても簡単に実装できます。

作り方の手順

作り方は下記の流れです。

  • 証明書・秘密鍵の取得
  • Go標準のimport net/httpでWebサーバを構築
  • http.ListenAndServeの箇所をhttp.ListenAndServeTSLに変更

環境

ちなみに私は下記の環境で開発しています。

  • Mac OS 10.12
  • IntelliJ IDEA Community 2016.1
  • go 1.7.1

それでは順番に見ていきましょう。

テスト用サーバ証明書・秘密鍵の作成

ターミナルで/usr/local/go/src/crypto/tls/にあるgenerate_cert.go --host hostnameを実行します。

ターミナルで実行

sudo go run /usr/local/go/src/crypto/tls/generate_cert.go --host `hostname`

下記のようにcert.pemkey.pemが出力されます。

2016/10/18 20:47:57 written cert.pem
2016/10/18 20:47:57 written key.pem

作成したcert.pemkey.pemは後で使います。

プロジェクト作成・実装

IntelliJ IDEA CommunityでGoのプロジェクトを作成します。
IntelliJ IDEA CommunityでのGoの環境構築がお済みでない場合には前日開催したハンズオンの資料に詳しく載っていますので確認してください。

http://is-tech-labo.com/seminar/go_restapi/

プロジェクト名はとりあえずhttp2serverにします。この部分はお好みで設定してください。
プロジェクト作成が完了したら先程作成したサーバ証明書cert.pem、秘密鍵証明書key.pemをプロジェクトの中に入れます。

コピーしたらmain.goを作成して下記のコードを追加します。

main.go

package main
import (
"net/http"
"fmt"
"log"
)
func handle(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w,"Hello world!!")
}
func main() {
http.HandleFunc("/",handle)
fmt.Println("server start port 443")
err := http.ListenAndServeTLS(":443","cert.pem","key.pem",nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

これで実装は終わりです。起動してみましょう。

sudo go run main.go

server start port 443と表示されたらブラウザでhttps://localhostにアクセスしてみましょう。

HTTP2になっているかの確認

HTTP/2 and SPDY indicatorというChromeエクステンションを使えば簡単に確認できます。

HTTP/2 and SPDY indicator

下図のようにアクセスしたURLのページがHTTP2に対応している場合は矢印の部分が青色になります。

たった数行でWebサーバを構築できるのがGo言語の魅力の一つです。さらにHTTP2の対応もこんなに簡単にできます。
ただ今回は証明書と秘密鍵はテスト用を使っています。本番環境に対応するにはLet's encryptか信頼のある認証局から証明書・秘密鍵を作成しないといけませんので注意してください。