Bitly 또는 TinyURL과 같은 URL 단축기는 엄청나게 인기 있는 도구이지만 이를 구축하는 데 무엇이 필요한지 궁금한 적이 있습니까? 이 블로그에서는 속도 제한이 있는 Go에서 사용자 지정 URL 단축기와 데이터 저장 및 IP 추적을 위한 Redis 데이터베이스를 구축한 방법을 자세히 살펴보겠습니다. 핵심 기능, 기술 스택, 그리고 그 과정에서 직면했던 과제에 대해 다루겠습니다.
이 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 페이로드를 사용하여 /api/v1에 POST 요청을 보냅니다.
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를 탐색할 수 있는 좋은 방법이었습니다. 이 프로젝트는 백엔드 개발에 대해 배우거나 웹 서비스에서 Go의 잠재력을 탐색하는 등 견고한 기반을 제공합니다.
코드가 실제로 작동하는 모습을 보려면 여기에서 GitHub 저장소를 확인하세요. 여러분의 생각이나 프로젝트 개선을 위한 제안 사항이 있으면 알려주세요!
위 내용은 Go에서 속도 제한 및 Redis를 사용하여 URL 단축기 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!