Go Webプログラミングの重要な違いは、結果として、通常はWebサーバーであるプログラムを取得することです。 したがって、Webサーバーが通常応答するものに対して責任を負うことになります。
Hello WorldがPHPとGoでどのように見えるかを比較すると、
Php
<?php echo “Hello World”; ?>
行く
package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
Go言語サイトwikiから取得
ハブに関する次の記事でも同じコードが使用されています: GoでのWeb開発、GoでのWebターミナルエミュレーターの作成 、 Websocket を使用した Goblog:Goでのブログ用の自家製静的エンジン、GoでのWebアプリケーションの作成
私自身の記事「 私の認証局-5つのOpenSSLチーム」では、Goで同様の例を挙げました。
関連: 言語を移動します。 小さなクライアント/サーバーアプリケーション 、 Go上のTCP / IPプロキシ 。
Goの重要な違いと利点は、Goがネットワークでどのように機能し、たとえば、長いポーリングを実装するために多くのオープン接続を保持できることです。
異なる言語/プラットフォームの記事C10k(問題10,000接続)で、 GoはErlangに続いて2番目の結果を示し、10,000から9,775の接続を開きました。
Goの2番目の利点は、コードのシンプルさと読みやすさ、学習の容易さです。これにより、多くのオープン接続で作業する必要があるアプリケーションを開発する際に、No。1の選択肢になります。
エラーこれらすべての例の欠陥
欠点は、接続のタイムアウト(期限)がデフォルトで0であることです(つまり、タイムアウトはまったく設定されていません)。 クライアントが接続が閉じられたというパケットを送信しない場合、そのような接続は永久にハングします。 これにより、Webサーバーの寿命が終わるまで、スタンバイモードのゴルーチンがブロックされます。 通常、開いている接続リソースの数は制限されています。 デフォルトでは、Linuxでは、アプリケーションは1024個のファイルを開くことができます(TCP接続はファイルと同じです)。
これは、次のようにGoで作成されたサーバーを意味します
http.ListenAndServe(":8080", nil)
非閉鎖化合物を徐々に蓄積し、1日おき、1ヶ月おき、または1年おきにそれらの中にownれさせます。
したがって、デフォルトでインストールされるデフォルトのWebサーバーにタイムアウトを設定することが重要です。
例えば
// log.Fatal(http.ListenAndServe(":8085", nil)) { s := &http.Server{ Addr: ":8085", Handler: nil, ReadTimeout: 1000 * time.Second, WriteTimeout: 1000 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe()) }
2番目の
Goはデフォルトではこれを行いません。Goで接続数を制限する方法、接続数を計算する方法、またはこのプロセスをさらに制御する方法はまったく明らかではありません。
接続の管理方法を理解するには、 func(* Server)ListenAndServeおよびfunc(* Server)ListenAndServeTLSのソースを調べる必要があります。両方の関数がfunc(* Server)Serve関数を使用していることがわかります。
この関数は、引数としてnet.Listenerインターフェースを受け取ります。
ここで、接続を制限および制御するために実装できます。
net.Listenerインターフェースをラップする例はLimitListenerです
[go]タグを使用してハブの記事を調べたところ、Timeout、DeadLineがインストールされている、または接続数が制御されている例は見つかりませんでした。
Goが超並列のネットワーク言語として作成されたことを考えると、接続を操作する際の適切かつ熟考された戦略の実装は、Goアプリケーションの重要な要素です。