Uygulamanızı oluştururken göz önünde bulundurmak isteyebileceğiniz faktörlerden biri, kullanıcılardan beklediğiniz trafik miktarıdır. Özellikle uygulamanızı bir bulut hizmeti sağlayıcısında barındırıyorsanız, trafik miktarı muhtemelen kaynak tahsisini içerebilecek daha fazla faktöre karar verir.

Limit Go Uygulamaları Nasıl Derecelendirilir?

Hız sınırlama, uygulamanızdaki veya ağınızdaki trafiği kontrol etmek için kullanabileceğiniz tekniklerden biridir.

Hız Sınırlaması Nedir?

Hız sınırlaması, ağ trafiğini sınırlamak için yaygın bir erişim kısıtlama tekniğidir, özellikle tahmin edilen zaman dilimleri içinde veya kullanıcı birkaç istek gerçekleştirdiğinde.

Hız sınırlaması, kaba kuvvet ve DDoS (Dağıtılmış Hizmet Reddi) gibi siber saldırıları azaltmak , web kazımasını , API isteklerini ve bot otomasyonu ve sunucu zorlaması gibi diğer düzensiz kullanıcı etkileşimlerini sınırlamak için popülerdir.

Go, hız sınırlayıcı sağlayan ve zaman paketiyle birlikte çalışan hız paketindeki hız sınırlayıcı uygulamalar için birinci sınıf destek sağlar .

tarife paketine genel bakış

Ücret paketi, Go projesinin bir parçasıdır, ancak paket standart kitaplıkta mevcut değildir . Paketi get komutuyla yüklemeniz gerekecek .

Paketi projenizin bağımlılıklarına eklemek için çalışma dizininizin terminalinde bu komutu çalıştırın.

go get “golang.org/x/time/rate”

Bu eğitim için bu paketleri Go dosyanıza aktarın.

import (

    “encoding/json”

    “golang.org/x/time/rate”

    “log”

    “net/http”

)

json paketi , bir yapıyı istemciye JSON olarak kodlamak içindir. Konsolda hataları günlüğe kaydetmek için günlük paketini ve bitiş noktası ve ara yazılımı oluşturmak ve bir sunucu başlatmak için http paketini kullanacaksınız.

Tek Bir Uç Noktayla Basit Bir API Oluşturma

Limit Go Uygulamaları Nasıl Derecelendirilir?

Geleneksel olarak, sınırlamak istediğiniz işleyici işlevleri için bir ara yazılım yazacaksınız. Kullanıcı her istek gönderdiğinde, ara katman, duruma bağlı olarak işleyici işlevine erişimi aktarmadan önce istek durumunu doğrular.

İşte istemciye kodlayacağınız dize alanlı yapı modeli.

type Message struct {

    Response    string `json:”response”`

    Description string `json:”description”`

}

İşleyici işlevi, içerik türünü JSON olarak ayarlayacak, başarılı bir durum kodu yazacak ve istemciye kodlanmış bir yapı örneği döndürecektir.

func endpointExample(writer http.ResponseWriter, request *http.Request) {

    writer.Header().Set(“Content-Type”, “application/json”)

    writer.WriteHeader(http.StatusOK)

    message := Message{

        Response:    “Successful”,

        Description: “You’ve successfully hit the API endpoint”,

    }

    err := json.NewEncoder(writer).Encode(&message)

    if err != nil {

        return

    }

}

endpointExample işleyici işlevi, bir http paket yazıcısı ve istek yöntemi örneğini alır ve yazar örneğiyle birlikte istemciye bir mesaj döndürür .

Basit Bir Go Uygulamasının Hız Sınırlaması

Bir kullanıcının istek sayısı veya mevcut istek sayısı yoluyla hız sınırlaması benzerdir. Yetkilendirme işleminden önce her zaman bir sınırlayıcı oluşturmanız gerekir.

Bir hız sınırlayıcıyı nasıl oluşturabileceğiniz ve isteklerin sayısına göre kullanıcıları nasıl yetkilendirebileceğiniz aşağıda açıklanmıştır.

func rateLimiterMiddleware(next func(writer http.ResponseWriter, request *http.Request)) http.HandlerFunc {

    limiter := rate.NewLimiter(3, 6) // max of 6 requests and then three more requests per second

    return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {

        if !limiter.Allow() {

            writer.Write([]byte(“rate limit exceeded “))

            return

        } else {

            endpointExample(writer, request)

        }

    })

}

RateLimiterMiddleware işleyici işlevi, bir işleyici işlevini argüman olarak kabul eden ve belirtilen maksimum isteklerden sonra saniye başına istek sayısı için iki parametre alan NewLimiter yöntemiyle yeni bir hız sınırlayıcı oluşturduktan sonra yetkilendirmenin sonucunu döndüren bir ara katman yazılımıdır .

Limit Go Uygulamaları Nasıl Derecelendirilir?

Sınırlayıcı örneğinin Allow yöntemi, yetkili isteklerin durumuna göre bir boole döndürür. RateLimiterMiddleware , istek yetkilendirilmişse JSON mesajını veya istemci maksimum sayıda istek gönderdiğinde “hız sınırı aşıldı” mesajını döndürür.

func main() {

    http.HandleFunc(“/home”, rateLimiterMiddleware(endpointExample))

    err := http.ListenAndServe(“:8080”, nil)

    if err != nil {

        log.Println(“There was an error listening on port :8080”, err)

    }

}

Ana işlev, /home uç noktasını, endpointExample işleyici işlevini alan rateLimiterMiddleware işleyici işlevine bağlar .

ListenAndServe yöntemi, 8080 numaralı yerel ana bilgisayar bağlantı noktasında bir sunucu başlatır ve olası hataları döndürür.

Sunucuyu çalıştırdıktan sonra bitiş noktasını test etmek için bu komutu çalışma dizininizin terminalinde veya bir bash betiği ile çalıştırabilirsiniz.

for i in {1..10}; do curl http://localhost:8080/home; done

Kod , bir istekle /home uç noktasına on kez ulaşır. İşte taleplerin sonucu.

Hız sınırlama programından elde edilen sonuç

Altıncı istekten sonra (maksimum), istemci yetkisizdir ve artık uç noktaya erişemez.

Hız Sınırlaması Önemlidir

Özellikle uygulamanızı barındırma maliyetini düşürmeyi hedefliyorsanız, bot müdahalesini azaltmak veya uygulamanızı siber saldırılara karşı korumak istiyorsanız, hız sınırlaması önemlidir. Go’nun hız paketine benzer şekilde , npm, hız sınırı ekspres uygulamalarına ekspres hız sınırı paketi sağlar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir