Rumah >pembangunan bahagian belakang >Golang >Membina Pemendek URL dengan Had Kadar dan Redis dalam Go

Membina Pemendek URL dengan Had Kadar dan Redis dalam Go

Linda Hamilton
Linda Hamiltonasal
2024-11-05 13:54:02587semak imbas

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.

Gambaran Keseluruhan Projek

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:

  • WebServer: Mengendalikan penghalaan dan permintaan menggunakan rangka kerja Fiber.
  • Penghad Kadar: Mengurus permintaan pengguna untuk mengelakkan penyalahgunaan, mengehadkan bilangan permintaan yang boleh dibuat oleh IP dalam jangka masa tertentu.
  • Pengesah URL: Memastikan URL berada dalam format yang sah dan sedia untuk storan.
  • Penjana URL: Menjana pautan pendek unik untuk setiap URL panjang atau menggunakan alias tersuai yang disediakan oleh pengguna.
  • Pangkalan Data Redis: Menyimpan pemetaan URL dan had kadar IP.

Dengan mengambil kira ciri ini, mari kita pecahkan pelaksanaannya.

Building a URL Shortener with Rate Limiting and Redis in Go

Timbunan Teknologi

  • Go: Pantas dan cekap, Go sesuai untuk membina pemendek URL berprestasi tinggi.
  • Fiber: Rangka kerja web dalam Go, dipilih untuk prestasi ringan dan kesederhanaannya.
  • Redis: Pangkalan data dalam memori yang digunakan untuk menyimpan pemetaan URL dan kuota IP, memberikan kami kelajuan dan kegigihan.
  • Docker: Bekas memudahkan penyediaan Redis dan memastikan aplikasi mudah alih dan berskala.

Struktur Projek

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

Menyediakan Aplikasi

1. Logik Pelayan Utama (main.go)

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")))
}

2. Had Kadar dan Pemendekan URL (shorten.go)

Untuk mengelakkan penyalahgunaan, kami menggunakan Redis untuk menjejaki setiap alamat IP dan mengehadkan bilangan permintaan yang dibenarkan. Inilah alirannya:

  1. Semak Had Kadar: Apabila permintaan dibuat, pengehad kadar menyemak Redis untuk melihat berapa banyak permintaan IP telah dibuat.
  2. URL Proses: Jika had kadar tidak melebihi, pelayan mengesahkan URL dan memendekkannya.
  3. Jana atau Gunakan Alias: Jika pengguna menyediakan alias tersuai, kami menyimpannya. Jika tidak, kami menjana ID unik.
.
├── 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. Persediaan Pangkalan Data Redis (redis.go)

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")))
}

Persediaan Docker

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"`
}

Menjalankan Aplikasi

  1. Klon repositori daripada GitHub: URLShortener
  2. 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
    }
    
  3. Tetapkan pembolehubah persekitaran dalam .env:

    version: '3'
    services:
      redis:
        image: "redis:alpine"
        ports:
          - "6379:6379"
    
  4. Jalankan aplikasi Go:

    docker-compose up -d
    

Kini, aplikasi itu disiarkan secara langsung dan anda boleh mula memendekkan URL!

Menguji Pemendek URL

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

Mengakses URL yang Dipendekkan

Gunakan URL pendek yang dijana, seperti http://localhost:6767/exmpl, untuk diubah hala ke https://example.com.

Pembelajaran Utama

  1. Menggunakan Redis untuk Mengehadkan Kadar: Redis sangat pantas dan menggunakannya untuk penyimpanan URL dan pengehadan kadar adalah cekap dan berkesan.
  2. Membina API REST dengan Fiber: Kesederhanaan dan prestasi Fiber sangat sesuai untuk membina API dalam Go.
  3. Pengendalian dan Pengesahan Ralat: Memastikan pengendalian ralat yang mantap dan pengesahan URL adalah penting untuk menyediakan pengalaman yang mesra pengguna.

Penambahbaikan Masa Depan

Terdapat beberapa ciri dan pengoptimuman yang ingin saya tambahkan pada masa hadapan:

  • Papan Pemuka Pentadbir: UI untuk menjejak penggunaan URL dan memantau statistik.
  • Analitis Terperinci: Jejaki kiraan klik, perujuk dan demografi pengguna.
  • Skalabiliti: Gunakan apl pada pembekal awan dan gunakan Redis yang diedarkan untuk mengendalikan data yang lebih luas.

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn