이 튜토리얼에서는 Google 드라이브 및 기타 클라우드 제공업체에서 파일을 다운로드할 수 있는 강력한 다운로더를 구축하겠습니다. Golang의 효율적인 동시성 패턴을 사용하면 여러 다운로드를 동시에 관리하고, 대용량 파일을 스트리밍하고, 진행 상황을 실시간으로 추적할 수 있습니다. 몇 개의 작은 파일을 다운로드하든 대규모 데이터 세트를 처리하든 이 프로젝트에서는 여러 클라우드 플랫폼을 지원하도록 쉽게 확장할 수 있는 확장 가능하고 강력한 다운로더를 구축하는 방법을 보여줍니다.
대용량 파일 다운로드를 단순화하고 자동화하는 방법을 찾고 있다면 이 튜토리얼이 적합합니다. 결국에는 필요에 맞게 유연하고 사용자 정의 가능한 Go 기반 다운로더를 갖게 됩니다.
이 다운로더를 UI와 함께 사용하려는 경우, 전체 기사 및 Go Downloader의 Github를 읽으려면 revolutionasdev.com을 방문하세요. 빠르게 실행하는 데 필요한 문서를 찾을 수 있습니다.
Go 동시성 패턴:
고루틴, 채널 및 뮤텍스를 사용하여 여러 동시 파일 다운로드를 효율적으로 처리하는 방법을 알아보세요.
대량 다운로드 스트리밍:
메모리와 시스템 리소스를 효과적으로 관리하면서 대용량 파일을 스트리밍하는 방법을 알아보세요.
동시 파일 다운로드:
파일을 동시에 다운로드하여 프로세스 속도를 높이고 성능을 향상시키는 방법을 이해합니다.
실시간 진행 업데이트:
다운로드 상태에 대한 실시간 피드백을 제공하기 위해 진행 상황 추적을 구현합니다.
중단 및 취소 처리:
진행 중인 다운로드 하나 또는 모두를 정상적으로 취소하는 방법을 알아보세요.
참고: 이 튜토리얼에서는 핵심 다운로드 논리에만 중점을 둡니다.
무슨 일을 하기 전에 먼저 환경을 올바르게 설정하여 향후 잠재적인 버그를 방지하세요.
다음을 사용하여 프로젝트 루트에 makefile을 만듭니다.
# Load environment variables from .env file include ./.env # To run the application run: build @./bin/go-downloader # Build the application build: @go build -tags '!dev' -o bin/go-downloader # Database migration status db-status: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) status # Run database migrations up: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) up # Roll back the last database migration down: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) down # Reset database migrations reset: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) reset
go-downloader/ ├── api ├── config ├── migrations ├── service ├── setting ├── store ├── types ├── util ├── .env ├── .air.toml ├── Makefile ├── go.mod ├── go.sum └── main.go
루트에 .env 파일을 생성하거나 원하는 대로 환경 변수를 처리합니다. joho/godotenv 패키지를 사용하겠습니다.
GOOGLE_CLIENT_ID GOOGLE_CLIENT_SECRET SESSION_SECRET=something-super-secret APP_URL=http://localhost:3000 POSTGRES_USER POSTGRES_PASSWORD POSTGRES_DB
이제 들어오는 모든 요청을 처리할 웹 서버 생성을 시작하겠습니다.
주의하세요! 이 가이드의 주요 부분은 여기에서 시작됩니다. 뛰어들 준비를 하세요!
시작하려면 api 폴더 api.go 및 Route.go 내에 다음 파일을 만듭니다.
모든 API 경로가 여기에 정의됩니다. env 구성을 사용하는 NewRouter 구조체를 생성하여 모든 경로와 핸들러가 환경 변수에 액세스할 수 있도록 합니다.
package api import ( "github.com/gofiber/fiber/v2" "github.com/nilotpaul/go-downloader/config" ) type Router struct { env config.EnvConfig } func NewRouter(env config.EnvConfig) *Router { return &Router{ env: env, } } func (h *Router) RegisterRoutes(r fiber.Router) { r.Get("/healthcheck", func(c *fiber.Ctx) error { return c.JSON("OK") }) }
여기서 서버를 시작하기 전에 CORS, 로깅 등 필요한 모든 미들웨어를 추가하겠습니다.
type APIServer struct { listenAddr string env config.EnvConfig } func NewAPIServer(listenAddr string, env config.EnvConfig) *APIServer { return &APIServer{ listenAddr: listenAddr, env: env, } } func (s *APIServer) Start() error { app := fiber.New(fiber.Config{ AppName: "Go Downloader", }) handler := NewRouter() handler.RegisterRoutes(app) log.Printf("Server started on http://localhost:%s", s.listenAddr) return app.Listen(":" s.listenAddr) }
이것은 전체에 대한 진입점 역할을 하는 main.go 파일의 메인 패키지입니다.
func main() { // Loads all Env vars from .env file. env := config.MustLoadEnv() log.Fatal(s.Start()) }
서버를 시작하고 테스트하기에 충분합니다.
air
그게 다야.?
curl http://localhost:3000/healthcheck
상태 200에서는 응답이 정상이어야 합니다.
필요한 경우 여러 클라우드 제공업체에 대한 지원을 추가하기 위한 확장 가능한 솔루션을 구현해야 합니다.
// Better to keep it in a seperate folder. // Specific only to OAuth Providers. type OAuthProvider interface { Authenticate(string) error GetAccessToken() string GetRefreshToken() string RefreshToken(*fiber.Ctx, string, bool) (*oauth2.Token, error) IsTokenValid() bool GetAuthURL(state string) string CreateOrUpdateAccount() (string, error) CreateSession(c *fiber.Ctx, userID string) error UpdateTokens(*GoogleAccount) error } type ProviderRegistry struct { Providers map[string]OAuthProvider } func NewProviderRegistry() *ProviderRegistry { return &ProviderRegistry{ Providers: make(map[string]OAuthProvider), } } func (r *ProviderRegistry) Register(providerName string, p OAuthProvider) { r.Providers[providerName] = p } func (r *ProviderRegistry) GetProvider(providerName string) (OAuthProvider, error) { p, exists := r.Providers[providerName] if !exists { return nil, fmt.Errorf("Provider not found") } return p, nil }
ProviderRegistry는 모든 OAuth 공급자를 보유하는 중앙 지도 역할을 합니다. 공급자를 초기화할 때 공급자를 이 맵에 등록합니다. 이를 통해 서비스 전반에 걸쳐 등록된 제공업체의 기능에 쉽게 액세스할 수 있습니다.
이 작업은 나중에 표시됩니다.
제공된 환경 변수를 기반으로 공급자를 등록합니다.
func InitStore(env config.EnvConfig) *ProviderRegistry { r := NewProviderRegistry() if len(env.GoogleClientSecret) != 0 || len(env.GoogleClientID) != 0 { googleProvider := NewGoogleProvider(googleProviderConfig{ googleClientID: env.GoogleClientID, googleClientSecret: env.GoogleClientSecret, googleRedirectURL: env.AppURL "/callback/google", }, env) r.Register("google", googleProvider) } return r }
여기에서 전체 기사를 읽어보세요.
우리는 프로젝트 구조 설정, Google OAuth 처리, 향후 확장을 위한 기반 마련과 같은 주요 구성요소를 다루면서 Go에서 Google 드라이브 다운로더의 토대를 마련했습니다. 그 과정에서 우리는 몇 가지 중요한 주제를 다루었습니다:
글이 꽤 길어져서 포스팅 하나면 충분합니다! 2부에서 다시 돌아와 작업을 마무리하고 주요 다운로드 기능을 다루겠습니다.
그때까지는 내 GitHub에서 현재 구현을 자유롭게 살펴보고 다음 단계를 계속 지켜봐 주시기 바랍니다. 즐거운 다운로드 되세요!
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3