皆さん、これまで JWT 認証、データベース接続、ロギング、エラー処理など多くのことを説明してきました。しかし、API にリクエストが殺到し始めたらどうなるでしょうか?制御がなければ、トラフィックが増えると、応答時間が遅くなったり、ダウンタイムが発生したりする可能性があります。 ?
今週、私たちはトラフィックの流れを制御するためにレート制限を実装することでこの問題を解決します。シンプルで効果的な golang.org/x/time/rate パッケージを使用します。後で、私独自の ThrottleX ソリューションの準備ができたら、それをよりスケーラブルなオプションとして統合する方法を説明します。 (最新情報については、私の GitHub (github.com/neelp03/throttlex) をチェックしてください。そこで見つかった問題については、お気軽にコメントしてください o7)
レート制限は API の用心棒のようなもので、指定された時間枠内にユーザーが実行できるリクエストの数を制御します。これにより、API が過剰になるのを防ぎ、すべてのユーザーがスムーズかつ公平にアクセスできるようになります。レート制限は次の場合に不可欠です:
golang.org/x/time/rate パッケージは拡張 Go ライブラリの一部であり、簡単なトークンベースのレート リミッターを提供します。始めるには、インストールする必要があります:
go get golang.org/x/time/rate
クライアントが実行できるリクエストの数を制御するレート制限ミドルウェアを作成しましょう。この例では、クライアントを 1 分あたり 5 リクエスト に制限します。
package main import ( "net/http" "golang.org/x/time/rate" "sync" "time" ) // Create a struct to hold each client's rate limiter type Client struct { limiter *rate.Limiter } // In-memory storage for clients var clients = make(map[string]*Client) var mu sync.Mutex // Get a client's rate limiter or create one if it doesn't exist func getClientLimiter(ip string) *rate.Limiter { mu.Lock() defer mu.Unlock() // If the client already exists, return the existing limiter if client, exists := clients[ip]; exists { return client.limiter } // Create a new limiter with 5 requests per minute limiter := rate.NewLimiter(5, 1) clients[ip] = &Client{limiter: limiter} return limiter }
次に、レート制限に基づいてアクセスを制限するミドルウェアで getClientLimiter 関数を使用してみましょう。
func rateLimitingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ip := r.RemoteAddr limiter := getClientLimiter(ip) // Check if the request is allowed if !limiter.Allow() { http.Error(w, "Too Many Requests", http.StatusTooManyRequests) return } next.ServeHTTP(w, r) }) }
次に、レート リミッターを API に接続して、すべてのリクエストが API を通過するようにしましょう。
func main() { db = connectDB() defer db.Close() r := mux.NewRouter() // Apply rate-limiting middleware globally r.Use(rateLimitingMiddleware) // Other middlewares r.Use(loggingMiddleware) r.Use(errorHandlingMiddleware) r.HandleFunc("/login", login).Methods("POST") r.Handle("/books", authenticate(http.HandlerFunc(getBooks))).Methods("GET") r.Handle("/books", authenticate(http.HandlerFunc(createBook))).Methods("POST") fmt.Println("Server started on port :8000") log.Fatal(http.ListenAndServe(":8000", r)) }
r.Use(rateLimitingMiddleware) を適用することで、すべての受信リクエストがエンドポイントに到達する前にレート リミッターによってチェックされるようになります。
サーバーを起動します:
go run main.go
それでは、API にいくつかのリクエストを送信してみましょう。 curl でループを使用すると、複数のリクエストを連続してシミュレートできます。
for i in {1..10}; do curl http://localhost:8000/books; done
制限を1 分あたり 5 リクエストに設定しているため、許可されたレートを超えると、429 Too Many Requests という応答が表示されます。
これで、golang.org/x/time/rate によるレート制限が完了し、プレッシャー下でも API の安定性と応答性を維持できます。レート制限は、スケーラブルな API にとって重要なツールですが、ここではほんの表面をなぞっただけです。
ThrottleX の運用準備が整ったら、それを Go API に統合してさらに柔軟性と分散レート制限を実現する方法を示すフォローアップ チュートリアルを投稿する予定です。最新情報については、ThrottleX GitHub リポジトリに注目してください!
来週、API を Docker でコンテナ化して、どこでも実行できるようにする予定です。楽しみに待って、コーディングを楽しんでください! ??
以上がGo API に API レート制限を追加するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。