Rumah > Artikel > pembangunan bahagian belakang > Membina Pemendek URL dengan Had Kadar dan Redis dalam Go
Pemendek URL seperti Bitly atau TinyURL ialah alat yang sangat popular, tetapi pernahkah anda terfikir apa yang perlu dilakukan untuk membina satu? Dalam blog ini, kita akan menyelami cara saya membina pemendek URL tersuai dalam Go dengan pengehadan kadar dan pangkalan data Redis untuk penyimpanan data dan penjejakan IP. Kami akan merangkumi ciri teras, susunan teknologi dan cabaran yang saya hadapi sepanjang perjalanan.
Aplikasi pemendek URL ini menerima URL panjang daripada pengguna, menjana pautan yang lebih pendek dan unik dan membenarkan pengguna menyesuaikan alias yang dipendekkan jika mahu. Pelayan mengubah hala mana-mana pelawat yang menggunakan URL yang dipendekkan ke URL panjang asal.
Berikut ialah gambaran keseluruhan ringkas komponen utama:
Dengan mengambil kira ciri ini, mari kita pecahkan pelaksanaannya.
Fail dan folder teras disusun seperti berikut:
. ├── 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
Fail aplikasi utama kami menyediakan laluan untuk memendekkan dan menyelesaikan URL. Berikut ialah coretan kod:
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"))) }
Untuk mengelakkan penyalahgunaan, kami menggunakan Redis untuk menjejaki setiap alamat IP dan mengehadkan bilangan permintaan yang dibenarkan. Inilah alirannya:
. ├── 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
Dalam redis.go, kami mentakrifkan fungsi pembantu untuk menyambung ke Redis. Sambungan ini digunakan merentas komponen yang berbeza untuk menyimpan URL pendek dan menguatkuasakan had kadar. Berikut ialah contoh mudah tentang cara Redis dikonfigurasikan:
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"))) }
Untuk memudahkan penyediaan Redis, saya menggunakan Docker. Ini menjadikan aplikasi mudah alih dan mudah digunakan.
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"` }
Jalankan bekas Docker untuk Redis:
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 }
Tetapkan pembolehubah persekitaran dalam .env:
version: '3' services: redis: image: "redis:alpine" ports: - "6379:6379"
Jalankan aplikasi Go:
docker-compose up -d
Kini, aplikasi itu disiarkan secara langsung dan anda boleh mula memendekkan URL!
Hantar permintaan POST ke /api/v1 dengan muatan JSON berikut:
DB_ADDR="localhost:6379" DB_PASSWORD="" APP_PORT=":6767" DOMAIN="localhost:6767" APP_QUOTA=10
Gunakan URL pendek yang dijana, seperti http://localhost:6767/exmpl, untuk diubah hala ke https://example.com.
Terdapat beberapa ciri dan pengoptimuman yang ingin saya tambahkan pada masa hadapan:
Membina pemendek URL ini merupakan pengalaman yang bermanfaat dan cara yang bagus untuk menerokai Go, Fiber dan Redis. Projek ini menyediakan asas yang kukuh, sama ada anda belajar tentang pembangunan bahagian belakang atau meneroka potensi Go dalam perkhidmatan web.
Jika anda ingin melihat kod itu sedang beraksi, lihat repositori GitHub di sini. Beritahu saya pendapat anda atau jika anda mempunyai cadangan untuk menambah baik projek!
Atas ialah kandungan terperinci Membina Pemendek URL dengan Had Kadar dan Redis dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!