Αναγνώστες σαν εσάς βοηθούν στην υποστήριξη του MUO. Όταν κάνετε μια αγορά χρησιμοποιώντας συνδέσμους στον ιστότοπό μας, ενδέχεται να κερδίσουμε μια προμήθεια θυγατρικών.

Ένας από τους παράγοντες που μπορεί να θέλετε να λάβετε υπόψη κατά τη δημιουργία της εφαρμογής σας είναι η ποσότητα της επισκεψιμότητας που περιμένετε από τους χρήστες. Το μέγεθος της επισκεψιμότητας καθορίζει πιθανώς περισσότερους παράγοντες που μπορεί να περιλαμβάνουν την κατανομή πόρων, ειδικά εάν φιλοξενείτε την εφαρμογή σας σε έναν πάροχο υπηρεσιών cloud.

Ο περιορισμός ρυθμού είναι μία από τις τεχνικές που μπορείτε να χρησιμοποιήσετε για να ελέγξετε την κυκλοφορία στην εφαρμογή ή το δίκτυό σας.

Τι είναι το Rate Limiting;

Ο περιορισμός ρυθμού είναι μια ευρέως διαδεδομένη τεχνική περιορισμού πρόσβασης για τον περιορισμό της κυκλοφορίας του δικτύου, κυρίως εντός εικαζόμενων χρονικών πλαισίων ή όταν ο χρήστης έχει εκτελέσει πολλά αιτήματα.

Ο περιορισμός ρυθμού είναι δημοφιλής για τη μείωση των επιθέσεων στον κυβερνοχώρο όπως η ωμή βία και

DDoS (Distributed Denial of Service), περιοριστικός απόξεση ιστού, αιτήματα API και άλλες ακανόνιστες αλληλεπιδράσεις χρηστών, όπως η αυτοματοποίηση bot και η πίεση διακομιστή.

Το Go παρέχει υποστήριξη πρώτης κατηγορίας για εφαρμογές περιορισμού ρυθμού στο τιμή πακέτο που παρέχει έναν περιοριστή ρυθμού και διαλειτουργεί με το χρόνος πακέτο.

ο τιμή Το πακέτο είναι μέρος του έργου Go, αλλά το πακέτο δεν είναι διαθέσιμο στην τυπική βιβλιοθήκη. Θα χρειαστεί να εγκαταστήσετε το πακέτο με το παίρνω εντολή.

Εκτελέστε αυτήν την εντολή στο τερματικό του καταλόγου εργασίας σας για να προσθέσετε το πακέτο στις εξαρτήσεις του έργου σας.

πηγαίνω λάβετε "golang.org/x/time/rate"

Εισαγάγετε αυτά τα πακέτα στο αρχείο Go σας για αυτό το σεμινάριο.

εισαγωγή (
"encoding/json"
"golang.org/x/time/rate"
"κούτσουρο"
"net/http"
)

ο json Το πακέτο προορίζεται για την κωδικοποίηση μιας δομής ως JSON στον πελάτη. Θα χρησιμοποιήσετε το κούτσουρο πακέτο προς κούτσουρο σφάλματα στην κονσόλα και το http πακέτο για να δημιουργήσετε το τελικό σημείο και το ενδιάμεσο λογισμικό και να ξεκινήσετε έναν διακομιστή.

Δημιουργία απλού API με ένα τελικό σημείο

Συμβατικά, θα γράψετε ένα ενδιάμεσο λογισμικό για τις λειτουργίες χειριστή που θέλετε να αξιολογήσετε το όριο. Κάθε φορά που ο χρήστης στέλνει ένα αίτημα, το ενδιάμεσο λογισμικό επικυρώνει την κατάσταση αιτήματος πριν αναμεταδώσει την πρόσβαση στη λειτουργία χειριστή, ανάλογα με την περίπτωση.

Εδώ είναι το μοντέλο struct με πεδία συμβολοσειράς που θα κωδικοποιήσετε στον πελάτη.

τύπος Μήνυμα struct {
Απάντηση σειρά`json:"response"`
Περιγραφή σειρά`json:"περιγραφή"`
}

Η συνάρτηση χειριστή θα ορίσει τον τύπο περιεχομένου σε JSON, θα γράψει έναν επιτυχημένο κωδικό κατάστασης και θα επιστρέψει μια κωδικοποιημένη παρουσία δομής στον πελάτη.

funcendpointΠαράδειγμα(συγγραφέας http. ResponseWriter, αίτημα *http. Αίτηση) {
συγγραφέας. Header().Set("Content-Type", "application/json")
συγγραφέας. WriteHeader (http. Κατάσταση ΟΚ)
μήνυμα := Μήνυμα{
Απάντηση: "Επιτυχής",
Περιγραφή: "Έχετε φτάσει με επιτυχία το τελικό σημείο API",
}
err := json. NewEncoder (συγγραφέας).Encode(&message)
αν λάθος!= μηδέν {
ΕΠΙΣΤΡΟΦΗ
}
}

ο endpointΠαράδειγμα Η λειτουργία χειριστή λαμβάνει ένα http πακέτο συγγραφέας και αίτηση παράδειγμα μεθόδου και επιστρέφει ένα μήνυμα στον πελάτη με το συγγραφέας παράδειγμα.

Rate Limiting a Simple Go Application

Ο περιορισμός τιμών μέσω του αριθμού αιτημάτων ενός χρήστη ή του διαθέσιμου αριθμού αιτημάτων είναι παρόμοιος. Θα πρέπει πάντα να δημιουργείτε έναν περιοριστή πριν από τη διαδικασία εξουσιοδότησης.

Δείτε πώς μπορείτε να δημιουργήσετε έναν περιοριστή τιμών και να εξουσιοδοτήσετε τους χρήστες με βάση τον αριθμό των αιτημάτων.

funcrateLimiterMiddleware(Επόμενο func(συγγραφέας http. ResponseWriter, αίτημα *http. Αίτηση)) http.HandlerFunc {
περιοριστής := ρυθμός. NewLimiter(3, 6) // μέγιστο 6 αιτήματα και μετά άλλα τρία αιτήματα ανά δευτερόλεπτο
ΕΠΙΣΤΡΟΦΗ http. HandlerFunc(func(συγγραφέας http. ResponseWriter, αίτημα *http. Αίτηση) {
αν !περιοριστής. Allow() {
συγγραφέας. Γράφω([]ψηφιόλεξη("υπέρβαση του ορίου ποσοστού"))
ΕΠΙΣΤΡΟΦΗ
} αλλού {
endpointExample (συγγραφέας, αίτημα)
}
})
}

ο rateLimiterMiddleware Η συνάρτηση χειριστή είναι ένα ενδιάμεσο λογισμικό που δέχεται μια συνάρτηση χειριστή ως όρισμα και επιστρέφει το αποτέλεσμα της εξουσιοδότησης μετά τη δημιουργία ενός νέου περιοριστή ρυθμού με το NewLimiter μέθοδος που λαμβάνει δύο παραμέτρους για τον αριθμό των αιτημάτων ανά δευτερόλεπτο μετά τα καθορισμένα μέγιστα αιτήματα.

ο Επιτρέπω Η μέθοδος του στιγμιότυπου περιοριστή επιστρέφει ένα boolean με βάση την κατάσταση των εξουσιοδοτημένων αιτημάτων. ο rateLimiterMiddleware επιστρέφει το μήνυμα JSON εάν το αίτημα είναι εξουσιοδοτημένο ή το "υπέρβαση ορίου ποσοστού" μήνυμα όταν ο πελάτης έχει στείλει τον μέγιστο αριθμό αιτημάτων.

funcκύριος() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
λάθος := http. ListenAndServe(":8080", μηδέν)
αν λάθος!= μηδέν {
κούτσουρο. Println("Παρουσιάστηκε σφάλμα κατά την ακρόαση στη θύρα:8080", λάθος)
}
}

ο κύριος η λειτουργία τοποθετεί το /home τελικό σημείο στο rateLimiterMiddleware λειτουργία χειριστή που αναλαμβάνει το endpointΠαράδειγμα λειτουργία χειριστή.

ο ListenAndServe μέθοδος ξεκινά έναν διακομιστή στη θύρα localhost 8080 και επιστρέφει πιθανά σφάλματα.

Μπορείτε να εκτελέσετε αυτήν την εντολή στο τερματικό του καταλόγου εργασίας σας ή με ένα σενάριο bash για να δοκιμάσετε το τελικό σημείο μετά την εκτέλεση του διακομιστή.

Για Εγώ σε {1..10}; κάνω μπούκλα http://localhost: 8080/σπίτι; Έγινε

Ο κωδικός χτυπά το /home τελικό σημείο δέκα φορές με αίτημα. Εδώ είναι το αποτέλεσμα των αιτημάτων.

Μετά το έκτο αίτημα (μέγιστο), ο πελάτης δεν είναι εξουσιοδοτημένος και δεν μπορεί πλέον να έχει πρόσβαση στο τελικό σημείο.

Ο περιορισμός των τιμών είναι σημαντικός

Ο περιορισμός του ρυθμού είναι απαραίτητος, ειδικά εάν θέλετε να μειώσετε το κόστος φιλοξενίας της εφαρμογής σας, θέλετε να μειώσετε τις παρεμβολές στα ρομπότ ή να προστατεύσετε την εφαρμογή σας από επιθέσεις στον κυβερνοχώρο. Παρόμοιο με το Go's τιμή πακέτο, npm παρέχει το express-rate-όριο πακέτο σε εφαρμογές express-limit rate.