Go API に API レート制限を追加する
皆さん、これまで JWT 認証、データベース接続、ロギング、エラー処理など多くのことを説明してきました。しかし、API にリクエストが殺到し始めたらどうなるでしょうか?制御がなければ、トラフィックが増えると、応答時間が遅くなったり、ダウンタイムが発生したりする可能性があります。 ?
今週、私たちはトラフィックの流れを制御するためにレート制限を実装することでこの問題を解決します。シンプルで効果的な golang.org/x/time/rate パッケージを使用します。後で、私独自の ThrottleX ソリューションの準備ができたら、それをよりスケーラブルなオプションとして統合する方法を説明します。 (最新情報については、私の GitHub (github.com/neelp03/throttlex) をチェックしてください。そこで見つかった問題については、お気軽にコメントしてください o7)
なぜレート制限を行うのか? ?
レート制限は API の用心棒のようなもので、指定された時間枠内にユーザーが実行できるリクエストの数を制御します。これにより、API が過剰になるのを防ぎ、すべてのユーザーがスムーズかつ公平にアクセスできるようになります。レート制限は次の場合に不可欠です:
- 悪用の防止: 悪意のあるユーザーや過度に熱心なユーザーが API を圧倒するのを防ぎます。
- 安定性: トラフィックの急増時でも、API の応答性と信頼性を維持します。
- 公平性: ユーザー間でリソースを平等に共有できるようにします。
ステップ 1: 時間/料金パッケージのインストール
golang.org/x/time/rate パッケージは拡張 Go ライブラリの一部であり、簡単なトークンベースのレート リミッターを提供します。始めるには、インストールする必要があります:
go get golang.org/x/time/rate
ステップ 2: レート リミッターの設定
クライアントが実行できるリクエストの数を制御するレート制限ミドルウェアを作成しましょう。この例では、クライアントを 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 }
ステップ 3: レート制限ミドルウェアの作成
次に、レート制限に基づいてアクセスを制限するミドルウェアで 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) }) }
仕組み:
- IP ベースの制限: 各クライアントは IP アドレスによって識別されます。クライアントの IP を確認し、それにレート リミッターを割り当てます。
- リクエスト チェック: limiter.Allow() メソッドは、クライアントがレート制限内にあるかどうかをチェックします。一致する場合、リクエストは次のハンドラに進みます。そうでない場合は、429 Too Many Requests で応答します。
ステップ 4: ミドルウェアをグローバルに適用しますか?
次に、レート リミッターを 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) を適用することで、すべての受信リクエストがエンドポイントに到達する前にレート リミッターによってチェックされるようになります。
ステップ 5: レート制限をテストしますか?
サーバーを起動します:
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

GolangisidealforBuildingsCalables Systemsduetoitsefficiency andConcurrency、Whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityand vastecosystem.golang'ssignencouragesclean、readisinediteNeditinesinedinediseNabletinedinedinedisedisedioncourase
