Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie mit Go leistungsstarke Weiterleitungsdienste

So implementieren Sie mit Go leistungsstarke Weiterleitungsdienste

PHPz
PHPzOriginal
2023-03-30 09:12:03858Durchsuche

Go ist eine sehr beliebte Programmiersprache, die nicht nur einfach zu erlernen und zu verwenden ist, sondern auch leistungsstarke Serverentwicklungsfunktionen bietet. Bei Netzwerkanwendungen gehört die Weiterleitung zu den häufigsten Aufgaben. Go bietet eine Reihe von HTTP-bezogenen Bibliotheken, die uns bei der Implementierung leistungsstarker Weiterleitungsdienste helfen können. In diesem Artikel wird erläutert, wie Sie mit Go leistungsstarke Weiterleitungsdienste implementieren.

1. Einleitung

Weiterleitung bezieht sich auf die Weiterleitung von Anfragen vom Client an andere Server. In Internetanwendungen kann ein einzelner Server aufgrund der großen Anzahl von Besuchen die Anforderungen der Benutzer nicht erfüllen, sodass mehrere Server zur Bearbeitung von Anforderungen verwendet werden müssen. An diesem Punkt ist eine effektive Methode erforderlich, um Anfragen an mehrere Server zu verteilen.

In modernen Webanwendungen werden häufig Proxyserver verwendet, um die Weiterleitung zu implementieren. Proxyserver können HTTP-Anfragen filtern, zwischenspeichern, beschleunigen und weiterleiten. In diesem Artikel implementieren wir einen einfachen Proxyserver mit Go und vergleichen ihn durch Leistungstests mit anderen Proxyservern.

2. Implementierung

Wir werden das Net/http-Paket von Go verwenden, um den Proxyserver zu implementieren. Dieses Paket stellt einen einfachen, aber leistungsstarken HTTP-Server und -Client bereit, der die Implementierung von Proxy-Servern erleichtert.

Das Folgende ist die grundlegende Proxy-Server-Implementierung:

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))
}

Dieser Code verwendet die vom Paket net/http bereitgestellte http.HandlerFunc-Funktion, die eine Handler-Funktion empfangen und alle Anforderungen an diese Funktion weiterleiten kann. In dieser Funktion verwenden wir die Funktion http.DefaultTransport.RoundTrip, um die Anfrage an den anderen Server zu senden und die vom anderen Server zurückgegebene Antwort zu unserer Antwort hinzuzufügen, bevor wir sie an den Client senden.

3. Leistungstest

Um die Leistung unseres Proxyservers zu testen, verwenden wir das Apache Bench-Tool für Benchmark-Tests. Weitere Informationen zu den Apache Bench-Tools finden Sie unter https://httpd.apache.org/docs/current/programs/ab.html. Wir werden den Benchmark mit dem folgenden Befehl ausführen:

ab -n 1000000 -c 100 http://localhost:8000/

Dieser Befehl sendet 100 gleichzeitige Anfragen an http://localhost:8000/ und wird 1.000.000 Mal wiederholt. Hier sind die Testergebnisse:

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

Die obigen Ergebnisse zeigen, dass unser Proxyserver 44107,20 Anfragen pro Sekunde (Durchschnitt) bedienen kann, mit einer Verarbeitungszeit von 2,268 ms pro Anfrage (Durchschnitt).

IV. Fazit

Wir haben einen einfachen, aber leistungsstarken Proxyserver mit Go implementiert und Benchmark-Tests mit dem Apache Bench-Tool durchgeführt. Testergebnisse zeigen, dass unser Proxyserver 44107,20 Anfragen pro Sekunde mit einer durchschnittlichen Antwortzeit von 2,268 Millisekunden verarbeiten kann. Dies zeigt, dass mit Go leistungsstarke, skalierbare Webanwendungen erstellt werden können.

Es ist zu beachten, dass in diesem Artikel lediglich erläutert wird, wie man mit Go einen einfachen Proxyserver implementiert und Leistungstests dafür durchführt. Die Implementierung komplexerer Proxyserver erfordert möglicherweise mehr Code und eine umfassendere Funktionalität. Berücksichtigen Sie also bei der Entwicklung Ihrer Anwendung für die Produktion Folgendes:

  • Anzahl der gleichzeitig zu verarbeitenden Anforderungen
  • Handhabung großer Datei-Uploads und -Downloads
  • Lastausgleich und Failover
  • Caching und Filterung
  • Andere Leistungstools verwenden Testen und messen

Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit Go leistungsstarke Weiterleitungsdienste. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn