>백엔드 개발 >Golang >Golang에서 Google 드라이브 다운로더 구축(1부)

Golang에서 Google 드라이브 다운로더 구축(1부)

Patricia Arquette
Patricia Arquette원래의
2024-09-30 06:24:02504검색

Building a Google Drive Downloader in Golang (Part 1)

導入

このチュートリアルでは、Google ドライブ や他のクラウド プロバイダーからファイルをダウンロードできる強力なダウンローダーを構築します。 Golang の効率的な同時実行パターンを使用すると、複数のダウンロードを同時に管理したり、大きなファイルをストリーミングしたり、進行状況をリアルタイムで追跡したりすることができます。いくつかの小さなファイルをダウンロードする場合でも、大規模なデータ セットを処理する場合でも、このプロジェクトでは、複数のクラウド プラットフォームをサポートするように簡単に拡張できる、スケーラブルで堅牢なダウンローダーを構築する方法を紹介します。

大きなファイルのダウンロードを簡素化および自動化する方法をお探しの場合は、このチュートリアルが最適です。最終的には、ニーズに合わせて柔軟でカスタマイズ可能な Go ベースのダウンローダーが完成します。

お急ぎですか?

このダウンローダーを UI で使用したいだけの場合は、evolveasdev.com にアクセスして記事全文を読み、Go Downloader の Github を参照してください。迅速に実行するためのドキュメントが見つかります。

学べること

  • Go 同時実行パターン:
    ゴルーチン、チャネル、ミューテックスを使用して、複数の同時ファイルのダウンロードを効率的に処理する方法を学びます。

  • 大量のストリーミングダウンロード:
    メモリとシステム リソースを効果的に管理しながら、大きなファイルをストリーミングする方法を検討します。

  • 同時ファイルダウンロード:
    ファイルを同時にダウンロードしてプロセスを高速化し、パフォーマンスを向上させる方法を理解します。

  • リアルタイムの進行状況更新:
    進行状況の追跡を実装して、ダウンロード ステータスに関するリアルタイムのフィードバックを提供します。

  • 中断とキャンセルの処理:
    進行中の 1 つまたはすべてのダウンロードを適切にキャンセルする方法を学びます。

注: このチュートリアルでは、コア ダウンロード ロジックのみに焦点を当てます。

環境設定

まず、何かを行う前に、将来の潜在的なバグを避けるために環境を適切にセットアップしてください。

前提条件

  • インストールする
  • AIR 自動リロード
  • 複雑なコマンドを実行するための Makefile
  • PostgreSQL 移行用の Goose

メイクファイルの構成

以下を使用して、プロジェクトのルートに 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

Webサーバーの作成

ここで、すべての受信リクエストを処理する Web サーバーの作成を開始します。

注意してください! このガイドの主要部分はここから始まります。飛び込む準備をしましょう!

APIレイヤー

開始するには、API フォルダー api.go およびroute.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")
    })
}

api.goファイルのセットアップ

ここでは、サーバーを起動する前に、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 で応答は OK になるはずです

プロバイダー ストアの作成

必要に応じて複数のクラウドプロバイダーのサポートを追加するためのスケーラブルなソリューションを実装する必要があります。

プロバイダーレジストリの作業

// 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
}

記事全文はこちらからお読みください。

마무리

Go에서 Google 드라이브 다운로더의 기반을 마련하여 프로젝트 구조 설정, Google OAuth 처리, 향후 확장을 위한 기반 마련 등 주요 구성 요소를 다뤘습니다. 그 과정에서 우리는 몇 가지 중요한 주제를 다루었습니다:

  • 원활하고 확장 가능한 데이터 관리를 보장하기 위해 Goose를 사용한 데이터베이스 마이그레이션
  • 향후 추가 클라우드 스토리지 제공업체에 대한 지원을 쉽게 확장할 수 있도록 제공업체 레지스트리를 구축합니다.
  • 향후 더욱 복잡한 로직을 쉽게 처리할 수 있는 유연한 아키텍처를 설계합니다.

글이 꽤 길어져서 포스팅 하나면 충분합니다! 2부에서 다시 돌아와서 주요 다운로드 기능을 다루겠습니다.

그때까지는 내 GitHub에서 현재 구현을 자유롭게 살펴보고 다음 단계를 계속 지켜봐 주시기 바랍니다. 즐거운 다운로드 되세요!

위 내용은 Golang에서 Google 드라이브 다운로더 구축(1부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.