Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską.

Jednym z czynników, które warto wziąć pod uwagę podczas tworzenia aplikacji, jest oczekiwany ruch ze strony użytkowników. Ilość ruchu prawdopodobnie decyduje o większej liczbie czynników, które mogą obejmować alokację zasobów, zwłaszcza jeśli hostujesz swoją aplikację u dostawcy usług w chmurze.

Ograniczanie szybkości to jedna z technik, których można użyć do kontrolowania ruchu w aplikacji lub sieci.

Co to jest ograniczenie stawki?

Ograniczanie szybkości to szeroko rozpowszechniona technika ograniczania dostępu do ruchu sieciowego, głównie w spekulowanych przedziałach czasowych lub gdy użytkownik wykonał kilka żądań.

Ograniczanie szybkości jest popularne w celu ograniczenia ataków cybernetycznych, takich jak brutalna siła i DDoS (rozproszona odmowa usługi), ograniczający skrobanie sieci, żądania API i inne nieregularne interakcje użytkowników, takie jak automatyzacja botów i obciążenie serwera.

instagram viewer

Go zapewnia pierwszorzędne wsparcie dla aplikacji ograniczających szybkość w wskaźnik pakiet, który zapewnia ogranicznik szybkości i współpracuje z czas pakiet.

The wskaźnik pakiet jest częścią projektu Go, ale nie jest dostępny w standardowej bibliotece. Musisz zainstalować pakiet z Dostawać Komenda.

Uruchom to polecenie w terminalu swojego katalogu roboczego, aby dodać pakiet do zależności projektu.

Iść pobierz „golang.org/x/time/rate”

Zaimportuj te pakiety do pliku Go na potrzeby tego samouczka.

import (
„kodowanie/json”
„golang.org/x/czas/stawka”
"dziennik"
„sieć/http”
)

The json package służy do kodowania struktury jako JSON dla klienta. Użyjesz dziennik paczka do dziennik błędy do konsoli i http pakiet do zbudowania punktu końcowego i oprogramowania pośredniczącego oraz uruchomienia serwera.

Tworzenie prostego interfejsu API z jednym punktem końcowym

Konwencjonalnie piszesz oprogramowanie pośrednie dla funkcji obsługi, które chcesz ograniczyć. Za każdym razem, gdy użytkownik wysyła żądanie, oprogramowanie pośrednie sprawdza status żądania przed przekazaniem dostępu do funkcji obsługi, w zależności od przypadku.

Oto model struktury z polami łańcuchowymi, które zakodujesz klientowi.

typ Wiadomość struktura {
Odpowiedź strunowy`json:"odpowiedź"`
Opis strunowy`json:"opis"`
}

Funkcja obsługi ustawi typ zawartości na JSON, zapisze pomyślny kod stanu i zwróci klientowi zakodowaną instancję struktury.

funkcjapunkt końcowyPrzykład(pisarz http. ResponseWriter, żądanie *http. Wniosek) {
pisarz. Header().Set("Typ zawartości", "aplikacja/json")
pisarz. Nagłówek zapisu (http. Stan OK)
wiadomość := Wiadomość{
Odpowiedź: „Sukces”,
Opis: "Pomyślnie trafiłeś w punkt końcowy API",
}
błąd:= json. NewEncoder (zapis).Encode(&message)
Jeśli błąd!= zero {
powrót
}
}

The punkt końcowyPrzykład funkcja obsługi przyjmuje an http pakiet pisarz I wniosek instancję metody i zwraca klientowi wiadomość z pisarz instancja.

Ograniczanie szybkości aplikacji Simple Go

Podobnie jest z ograniczaniem szybkości poprzez liczbę żądań użytkownika lub dostępną liczbę żądań. Zawsze będziesz musiał utworzyć ogranicznik przed procesem autoryzacji.

Oto jak możesz utworzyć ogranicznik szybkości i autoryzować użytkowników na podstawie liczby żądań.

funkcjaRateLimiterMiddleware(Następny funkcja(pisarz http. ResponseWriter, żądanie *http. Wniosek)) http.HandlerFunc {
ogranicznik := stawka. Nowy ogranicznik(3, 6) // maksymalnie 6 żądań, a następnie trzy kolejne żądania na sekundę
powrót http. Funkcja obsługi(funkcja(pisarz http. ResponseWriter, żądanie *http. Wniosek) {
Jeśli! ogranicznik. Umożliwić() {
pisarz. Pisać([]bajt(„przekroczono limit stawki”))
powrót
} w przeciwnym razie {
endpointExample (zapisujący, żądanie)
}
})
}

The RateLimiterMiddleware funkcja obsługi to oprogramowanie pośredniczące, które przyjmuje funkcję obsługi jako argument i zwraca wynik autoryzacji po utworzeniu nowego ogranicznika szybkości z Nowy ogranicznik metoda, która przyjmuje dwa parametry dla liczby żądań na sekundę po określonej maksymalnej liczbie żądań.

The Umożliwić Metoda instancji limitera zwraca wartość logiczną na podstawie statusu autoryzowanych żądań. The RateLimiterMiddleware zwraca komunikat JSON, jeśli żądanie jest autoryzowane lub "przekroczono limit stawki" wiadomość, gdy klient wysłał maksymalną liczbę żądań.

funkcjagłówny() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
błąd := http. ListenAndServe(":8080", zero)
Jeśli błąd!= zero {
dziennik. Println("Wystąpił błąd nasłuchiwania na porcie:8080", błąd)
}
}

The główny funkcja montuje /home punkt końcowy do RateLimiterMiddleware funkcja obsługi, która przyjmuje punkt końcowyPrzykład funkcja obsługi.

The Słuchaj i służ metoda uruchamia serwer na porcie localhost 8080 i zwraca ewentualne błędy.

Możesz uruchomić to polecenie na terminalu swojego katalogu roboczego lub za pomocą skrypt basha przetestować punkt końcowy po uruchomieniu serwera.

Do I W {1..10}; Do kędzior http://localhost: 8080/dom; zrobione

Kod uderza w /home punkt końcowy dziesięć razy z żądaniem. Oto wyniki próśb.

Po szóstym żądaniu (maksimum) klient jest nieautoryzowany i nie może już uzyskać dostępu do punktu końcowego.

Ograniczenie stawki jest ważne

Ograniczenie szybkości jest niezbędne, zwłaszcza jeśli chcesz obniżyć koszty hostingu aplikacji, ograniczyć ingerencję botów lub zabezpieczyć aplikację przed cyberatakami. Podobny do Go wskaźnik pakiet, npm zapewnia limit szybkości ekspresowej pakiet do ekspresowych aplikacji z limitem szybkości.