Bitly や TinyURL などの URL 短縮ツールは非常に人気のあるツールですが、その構築に何が必要なのか疑問に思ったことはありますか?このブログでは、レート制限を備えたカスタム URL 短縮ツールと、データ ストレージと IP 追跡用の Redis データベースを Go で構築した方法について詳しく説明します。コア機能、技術スタック、その過程で遭遇した課題について説明します。
この URL 短縮アプリケーションは、ユーザーから長い URL を受け入れ、より短い一意のリンクを生成し、ユーザーが必要に応じて短縮されたエイリアスをカスタマイズできるようにします。サーバーは、短縮 URL を使用する訪問者を元の長い URL にリダイレクトします。
主なコンポーネントの概要を次に示します。
これらの機能を念頭に置いて、実装を詳しく見てみましょう。
コア ファイルとフォルダーは次のように構成されています:
. ├── 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
メインのアプリケーション ファイルは、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"))) }
悪用を防ぐために、私たちは Redis を使用して各 IP アドレスを追跡し、許可されるリクエストの数を制限します。流れは次のとおりです:
. ├── 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
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"` }
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 }
.env で環境変数を設定します:
version: '3' services: redis: image: "redis:alpine" ports: - "6379:6379"
Go アプリケーションを実行します:
docker-compose up -d
これでアプリケーションが稼働し、URL の短縮を開始できるようになりました!
次の JSON ペイロードを使用して POST リクエストを /api/v1 に送信します:
DB_ADDR="localhost:6379" DB_PASSWORD="" APP_PORT=":6767" DOMAIN="localhost:6767" APP_QUOTA=10
生成された短縮 URL (http://localhost:6767/exmpl など) を使用して、https://example.com にリダイレクトします。
将来追加したい機能と最適化がいくつかあります:
この URL 短縮ツールの構築はやりがいのある経験であり、Go、Fiber、Redis を探索する素晴らしい方法でした。このプロジェクトは、バックエンド開発について学習している場合でも、Web サービスにおける Go の可能性を探求している場合でも、強固な基盤を提供します。
コードの動作を確認したい場合は、ここで GitHub リポジトリをチェックしてください。あなたの考えやプロジェクトを改善するための提案があれば、ぜひお知らせください!
以上がGo でレート制限と Redis を使用した URL Shortener を構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。