Go でレート制限と Redis を使用した URL Shortener を構築する

Linda Hamilton
リリース: 2024-11-05 13:54:02
オリジナル
510 人が閲覧しました

Bitly や TinyURL などの URL 短縮ツールは非常に人気のあるツールですが、その構築に何が必要なのか疑問に思ったことはありますか?このブログでは、レート制限を備えたカスタム URL 短縮ツールと、データ ストレージと IP 追跡用の Redis データベースを Go で構築した方法について詳しく説明します。コア機能、技術スタック、その過程で遭遇した課題について説明します。

プロジェクト概要

この URL 短縮アプリケーションは、ユーザーから長い URL を受け入れ、より短い一意のリンクを生成し、ユーザーが必要に応じて短縮されたエイリアスをカスタマイズできるようにします。サーバーは、短縮 URL を使用する訪問者を元の長い URL にリダイレクトします。

主なコンポーネントの概要を次に示します。

  • WebServer: ファイバー フレームワークを使用してルーティングとリクエストを処理します。
  • レート リミッター: ユーザー リクエストを管理して悪用を防止し、特定の時間枠内に IP が実行できるリクエストの数を制限します。
  • URL バリデータ: URL が有効な形式であり、保存できる状態であることを確認します。
  • URL ジェネレーター: 長い URL ごとに一意の短いリンクを生成するか、ユーザーが提供するカスタム エイリアスを使用します。
  • Redis データベース: URL マッピングと IP レート制限を保存します。

これらの機能を念頭に置いて、実装を詳しく見てみましょう。

Building a URL Shortener with Rate Limiting and Redis in Go

技術スタック

  • Go: 高速かつ効率的な Go は、高性能 URL 短縮ツールの構築に最適です。
  • Fiber: 軽量のパフォーマンスとシンプルさのために選ばれた Go の Web フレームワーク。
  • Redis: URL マッピングと IP クォータを保存するために使用されるメモリ内データベースで、速度と永続性が得られます。
  • Docker: コンテナーを使用すると、Redis のセットアップが簡単になり、アプリケーションの移植性と拡張性が確保されます。

プロジェクトの構造

コア ファイルとフォルダーは次のように構成されています:

.
├── main.go               # Entry point for the application
├── routes/
│   ├── shorten.go        # Handles URL shortening and redirects
├── database/
│   ├── redis.go          # Database connection logic
├── helpers/
│   ├── helper.go         # Utility functions for URL validation
├── .env                  # Environment variables
├── docker-compose.yml    # Docker setup for Redis
ログイン後にコピー
ログイン後にコピー

アプリケーションのセットアップ

1. メインサーバーロジック (main.go)

メインのアプリケーション ファイルは、URL の短縮と解決のためのルートを設定します。コードスニペットは次のとおりです:

package main

import (
    "log"
    "os"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/joho/godotenv"

    "github.com/ravikisha/url-shortener/routes"
)

func setupRoutes(app *fiber.App) {
    app.Get("/:url", routes.ResolveURL)
    app.Post("/api/v1", routes.ShortenURL)
}

func main() {
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    app := fiber.New()
    app.Use(logger.New())

    setupRoutes(app)

    log.Fatal(app.Listen(os.Getenv("APP_PORT")))
}
ログイン後にコピー
ログイン後にコピー

2. レート制限と URL 短縮 (shorten.go)

悪用を防ぐために、私たちは Redis を使用して各 IP アドレスを追跡し、許可されるリクエストの数を制限します。流れは次のとおりです:

  1. レート制限の確認: リクエストが行われると、レート リミッターが Redis をチェックして、IP が行ったリクエストの数を確認します。
  2. URL を処理: レート制限を超えていない場合、サーバーは URL を検証し、URL を短縮します。
  3. エイリアスの生成または使用: ユーザーがカスタム エイリアスを提供した場合、それを保存します。それ以外の場合は、一意の ID が生成されます。
.
├── main.go               # Entry point for the application
├── routes/
│   ├── shorten.go        # Handles URL shortening and redirects
├── database/
│   ├── redis.go          # Database connection logic
├── helpers/
│   ├── helper.go         # Utility functions for URL validation
├── .env                  # Environment variables
├── docker-compose.yml    # Docker setup for Redis
ログイン後にコピー
ログイン後にコピー

3. Redis データベースのセットアップ (redis.go)

redis.go では、Redis に接続するためのヘルパー関数を定義します。この接続は、短い URL を保存し、レート制限を適用するために、さまざまなコンポーネント間で使用されます。 Redis の構成方法の簡単な例を次に示します。

package main

import (
    "log"
    "os"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/joho/godotenv"

    "github.com/ravikisha/url-shortener/routes"
)

func setupRoutes(app *fiber.App) {
    app.Get("/:url", routes.ResolveURL)
    app.Post("/api/v1", routes.ShortenURL)
}

func main() {
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    app := fiber.New()
    app.Use(logger.New())

    setupRoutes(app)

    log.Fatal(app.Listen(os.Getenv("APP_PORT")))
}
ログイン後にコピー
ログイン後にコピー

ドッカーのセットアップ

Redis のセットアップを簡素化するために、Docker を使用しました。これにより、アプリケーションが移植可能になり、デプロイが容易になります。

package routes

import (
    "os"
    "strconv"
    "time"

    "github.com/asaskevich/govalidator"
    "github.com/go-redis/redis/v8"
    "github.com/gofiber/fiber/v2"

    "github.com/ravikisha/url-shortener/database"
    "github.com/ravikisha/url-shortener/helpers"
)

// Define structs for the request and response data
type request struct {
    URL         string        `json:"url"`
    CustomShort string        `json:"short"`
    Expiry      time.Duration `json:"expiry"`
}

type response struct {
    URL             string        `json:"url"`
    CustomShort     string        `json:"short"`
    Expiry          time.Duration `json:"expiry"`
    XRateRemaining  int           `json:"x-rate-remaining"`
    XRateLimitReset time.Duration `json:"x-rate-limit-reset"`
}
ログイン後にコピー

アプリケーションの実行

  1. GitHub からリポジトリのクローンを作成します: URLShortener
  2. Redis の Docker コンテナを実行します:

    package database
    
    import (
        "context"
        "github.com/go-redis/redis/v8"
    )
    
    var Ctx = context.Background()
    
    func NewClient(dbNum int) *redis.Client {
        rdb := redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "",
            DB:       dbNum,
        })
        return rdb
    }
    
    ログイン後にコピー
  3. .env で環境変数を設定します:

    version: '3'
    services:
      redis:
        image: "redis:alpine"
        ports:
          - "6379:6379"
    
    ログイン後にコピー
  4. Go アプリケーションを実行します:

    docker-compose up -d
    
    ログイン後にコピー

これでアプリケーションが稼働し、URL の短縮を開始できるようになりました!

URL短縮機能のテスト

URLの短縮

次の JSON ペイロードを使用して POST リクエストを /api/v1 に送信します:

DB_ADDR="localhost:6379"
DB_PASSWORD=""
APP_PORT=":6767"
DOMAIN="localhost:6767"
APP_QUOTA=10
ログイン後にコピー

短縮URLへのアクセス

生成された短縮 URL (http://localhost:6767/exmpl など) を使用して、https://example.com にリダイレクトします。

重要な教訓

  1. レート制限に Redis を使用する: Redis は信じられないほど高速で、URL ストレージとレート制限の両方に Redis を使用すると効率的かつ効果的でした。
  2. Fiber を使用した REST API の構築: Fiber のシンプルさとパフォーマンスは、Go での API の構築に適しています。
  3. エラー処理と検証: ユーザー フレンドリーなエクスペリエンスを提供するには、堅牢なエラー処理と URL 検証を確保することが不可欠でした。

今後の改善点

将来追加したい機能と最適化がいくつかあります:

  • 管理ダッシュボード: URL の使用状況を追跡し、統計を監視するための UI。
  • 詳細な分析: クリック数、参照元、ユーザー統計を追跡します。
  • スケーラビリティ: アプリをクラウド プロバイダーにデプロイし、分散 Redis を使用してより大規模なデータを処理します。

結論

この URL 短縮ツールの構築はやりがいのある経験であり、Go、Fiber、Redis を探索する素晴らしい方法でした。このプロジェクトは、バックエンド開発について学習している場合でも、Web サービスにおける Go の可能性を探求している場合でも、強固な基盤を提供します。

コードの動作を確認したい場合は、ここで GitHub リポジトリをチェックしてください。あなたの考えやプロジェクトを改善するための提案があれば、ぜひお知らせください!

以上がGo でレート制限と Redis を使用した URL Shortener を構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!