Go を使用して高パフォーマンスの転送サービスを実装する方法

PHPz
リリース: 2023-03-30 09:27:03
オリジナル
858 人が閲覧しました

Go は、学習と使用が簡単であるだけでなく、高性能のサーバー開発機能を提供する非常に人気のあるプログラミング言語です。ネットワーク アプリケーションでは、転送は一般的なタスクの 1 つです。 Go は、高パフォーマンスの転送サービスの実装に役立つ一連の HTTP 関連ライブラリを提供します。この記事では、Go を使用して高パフォーマンスの転送サービスを実装する方法を紹介します。

1. はじめに

転送とは、クライアントから他のサーバーにリクエストを転送することを指します。インターネット アプリケーションでは、アクセス数が多いため、単一のサーバーでユーザーのニーズを満たすことが困難なため、リクエストを処理するために複数のサーバーを使用する必要があります。この時点で、リクエストを複数のサーバーに分散する効果的な方法が必要になります。

最新の Web アプリケーションでは、転送を実装するためにプロキシ サーバーがよく使用されます。プロキシ サーバーは、HTTP リクエストをフィルタリング、キャッシュ、高速化、転送できます。この記事では、Go を使用して単純なプロキシ サーバーを実装し、パフォーマンス テストを通じて他のプロキシ サーバーと比較します。

2. 実装

Go の net/http パッケージを使用してプロキシ サーバーを実装します。このパッケージは、プロキシ サーバーの実装を容易にする、シンプルかつ強力な HTTP サーバーとクライアントを提供します。

次は、基本的なプロキシ サーバーの実装です:

package main

import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        resp, err := http.DefaultTransport.RoundTrip(r)
        if err != nil {
            http.Error(w, err.Error(), http.StatusServiceUnavailable)
            return
        }
        defer resp.Body.Close()

        // 将其他服务器返回的 Header 添加到响应中 
        for key, values := range resp.Header {
            for _, value := range values {
                w.Header().Add(key, value)
            }
        }

        // 将其他服务器返回的状态码添加到响应中 
        w.WriteHeader(resp.StatusCode)

        //将其他服务器返回的 Body 添加到响应中 
        _, err = io.Copy(w, resp.Body)
        if err != nil {
            log.Println("failed to copy response:", err)
        }
    })

    log.Println("starting server...")
    log.Fatal(http.ListenAndServe(":8000", nil))
}
ログイン後にコピー

このコードは、処理関数を受け取り、すべてのリクエストを処理できる net/http パッケージによって提供される http.HandlerFunc 関数を使用します。この機能に。この関数では、http.DefaultTransport.RoundTrip 関数を使用してリクエストを他のサーバーに送信し、他のサーバーから返された応答をクライアントに送信する前に応答に追加します。

3. パフォーマンス テスト

プロキシ サーバーのパフォーマンスをテストするために、ベンチマーク テストに Apache Bench ツールを使用します。 Apache Bench ツールの詳細については、https://httpd.apache.org/docs/current/programs/ab.html を参照してください。次のコマンドを使用してベンチマークを実行します。

ab -n 1000000 -c 100 http://localhost:8000/
ログイン後にコピー

このコマンドは、100 個の同時リクエストを http://localhost:8000/ に送信し、1,000,000 回繰り返します。テスト結果は次のとおりです。

Server Software:        
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        844 bytes

Concurrency Level:      100
Time taken for tests:   22.679 seconds
Complete requests:      1000000
Failed requests:        0
Total transferred:      926000000 bytes
HTML transferred:       844000000 bytes
Requests per second:    44107.20 [#/sec] (mean)
Time per request:       2.268 [ms] (mean)
Time per request:       0.023 [ms] (mean, across all concurrent requests)
Transfer rate:          39832.25 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0      26
Processing:     0    2   0.9      2      39
Waiting:        0    2   0.9      2      39
Total:          0    2   0.9      2      39
ログイン後にコピー

上記の結果は、プロキシ サーバーが 1 秒あたり 44107.20 リクエスト (平均) を処理でき、リクエストあたりの処理時間は 2.268 ミリ秒 (平均) であることを示しています。

4. 結論

Goを使用してシンプルかつ高性能なプロキシサーバーを実装し、Apache Benchツールを使用してベンチマークテストを実施しました。テスト結果によると、プロキシ サーバーは 1 秒あたり 44107.20 リクエストを処理でき、平均応答時間は 2.268 ミリ秒です。これは、Go を使用して高性能でスケーラブルな Web アプリケーションを構築できることを示しています。

この記事では、Go を使用して単純なプロキシ サーバーを実装し、そのサーバーでパフォーマンス テストを実行する方法のみを紹介していることに注意してください。より複雑なプロキシ サーバーを実装するには、より多くのコードとより完全な機能が必要になる場合があります。したがって、実稼働環境用のアプリケーションを開発する場合は、次の要素を考慮してください。

  • 処理する同時リクエストの数
  • 大きなファイルのアップロードとダウンロードの処理
  • 負荷分散とフェイルオーバー
  • キャッシュとフィルタリング
  • 他のパフォーマンス ツールを使用したテストと測定

以上がGo を使用して高パフォーマンスの転送サービスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!