Go에서 속도 제한 및 Redis를 사용하여 URL 단축기 구축

Linda Hamilton
풀어 주다: 2024-11-05 13:54:02
원래의
507명이 탐색했습니다.

Bitly 또는 TinyURL과 같은 URL 단축기는 엄청나게 인기 있는 도구이지만 이를 구축하는 데 무엇이 필요한지 궁금한 적이 있습니까? 이 블로그에서는 속도 제한이 있는 Go에서 사용자 지정 URL 단축기와 데이터 저장 및 IP 추적을 위한 Redis 데이터베이스를 구축한 방법을 자세히 살펴보겠습니다. 핵심 기능, 기술 스택, 그리고 그 과정에서 직면했던 과제에 대해 다루겠습니다.

프로젝트 개요

이 URL 단축기 애플리케이션은 사용자의 긴 URL을 허용하고, 더 짧고 고유한 링크를 생성하며, 원하는 경우 사용자가 단축 별칭을 사용자 정의할 수 있습니다. 서버는 단축 URL을 사용하는 모든 방문자를 원래의 긴 URL로 리디렉션합니다.

기본 구성 요소에 대한 간략한 개요는 다음과 같습니다.

  • WebServer: Fiber 프레임워크를 사용하여 라우팅 및 요청을 처리합니다.
  • Rate Limiter: 남용을 방지하기 위해 사용자 요청을 관리하고 특정 기간에 IP가 만들 수 있는 요청 수를 제한합니다.
  • URL 유효성 검사기: URL이 유효한 형식이고 저장 가능한지 확인합니다.
  • URL 생성기: 각 긴 URL에 대해 고유한 짧은 링크를 생성하거나 사용자가 제공한 사용자 정의 별칭을 사용합니다.
  • Redis 데이터베이스: URL 매핑 및 IP 속도 제한을 저장합니다.

이러한 기능을 염두에 두고 구현을 분석해 보겠습니다.

Building a URL Shortener with Rate Limiting and Redis in Go

기술 스택

  • Go: 빠르고 효율적인 Go는 고성능 URL 단축기를 구축하는 데 이상적입니다.
  • Fiber: 가벼운 성능과 단순성을 위해 선택된 Go의 웹 프레임워크입니다.
  • 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을 검증하고 단축합니다.
  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 페이로드를 사용하여 /api/v1에 POST 요청을 보냅니다.

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를 탐색할 수 있는 좋은 방법이었습니다. 이 프로젝트는 백엔드 개발에 대해 배우거나 웹 서비스에서 Go의 잠재력을 탐색하는 등 견고한 기반을 제공합니다.

코드가 실제로 작동하는 모습을 보려면 여기에서 GitHub 저장소를 확인하세요. 여러분의 생각이나 프로젝트 개선을 위한 제안 사항이 있으면 알려주세요!

위 내용은 Go에서 속도 제한 및 Redis를 사용하여 URL 단축기 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!