「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Golang で Google ドライブ ダウンローダーを構築する (パート 1)

Golang で Google ドライブ ダウンローダーを構築する (パート 1)

2024 年 11 月 8 日に公開
ブラウズ:809

Building a Google Drive Downloader in Golang (Part 1)

導入

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

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

お急ぎですか?

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

学べること

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

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

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

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

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

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

環境設定

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

前提条件

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

次のようにして、プロジェクトのルートにメイクファイルを作成します。


# .env ファイルから環境変数をロードします ./.env を含める # アプリケーションを実行するには 実行: ビルド @./bin/go-downloader # アプリケーションをビルドする 建てる: @go build -tags '!dev' -o bin/go-downloader # データベース移行ステータス データベースステータス: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) ステータス # データベース移行を実行する 上: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) up # 最後のデータベース移行をロールバックします 下: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) down # データベース移行をリセットする リセット: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) リセット
# 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 §── 設定 §── 移住 §── サービス §── 設定 §── 店舗 §── 種類 §── ユーティリティ §── .env §── .air.toml §── メイクファイル §── go.mod §── go.sum └── main.go
# 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
環境変数の設定

ルートに .env ファイルを作成するか、環境変数を自由に処理します。joho/godotenv パッケージを使用します。


GOOGLE_CLIENT_ID GOOGLE_CLIENT_SECRET SESSION_SECRET=超秘密の何か APP_URL=http://localhost:3000 POSTGRES_USER POSTGRES_PASSWORD POSTGRES_DB
# 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
Webサーバーの作成

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

Heads Up! このガイドの主要部分はここから始まります。飛び込む準備をしましょう!

APIレイヤー

まず、API フォルダー api.go およびroute.go 内に次のファイルを作成します

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

すべての

API ルート はここで定義されます。 env 設定を受け取る NewRouter 構造体を作成し、すべてのルートとハンドラーが環境変数にアクセスできるようにします。

パッケージAPI 輸入 ( 「github.com/gofiber/fiber/v2」 「github.com/nilotpaul/go-downloader/config」 ) type Router struct { 環境設定.EnvConfig } func NewRouter(env config.EnvConfig) *ルーター { ルーターを返す(&R){ 環境: 環境、 } } func (h *Router) RegisterRoutes(r Fiber.Router) { r.Get("/healthcheck", func(c *fiber.Ctx) エラー { return c.JSON("OK") }) }
# 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
api.goファイルのセットアップ

ここでは、サーバーを起動する前に、CORS やロギングなどの必要なミドルウェアをすべて追加します。


type APIServer struct { listenAddr 文字列 環境設定.EnvConfig } func NewAPIServer(listenAddr string, env config.EnvConfig) *APIServer { &APIサーバーを返す{ listenAddr: listenAddr、 環境: 環境、 } } func (s *APIServer) Start() エラー { app := ファイバー.New(ファイバー.Config{ アプリ名: "Go ダウンローダー"、 }) ハンドラー := NewRouter() handler.RegisterRoutes(アプリ) log.Printf("サーバーは http://localhost:%s で起動しました", s.listenAddr) return app.Listen(":" s.listenAddr) }
# 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
メインエントリポイント

これは、main.go ファイル内のメイン パッケージであり、全体へのエントリポイントとして機能します。


関数 main() { // .env ファイルからすべての環境変数をロードします。 env := config.MustLoadEnv() log.Fatal(s.Start()) }
# 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
サーバーを起動してテストするにはこれで十分です。

サーバーを起動します

空気
# 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
それでおしまい。?

テスト

curl http://localhost:3000/healthcheck
# 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
ステータス 200 で応答は OK になるはずです

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

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

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

// 別のフォルダーに保存した方がよいでしょう。 // OAuth プロバイダーにのみ固有。 タイプ OAuthProvider インターフェイス { 認証(文字列)エラー GetAccessToken() 文字列 GetRefreshToken() 文字列 RefreshToken(*fiber.Ctx, string, bool) (*oauth2.Token, エラー) IsTokenValid() ブール値 GetAuthURL(状態文字列) 文字列 CreateOrUpdateAccount() (文字列、エラー) CreateSession(c *fiber.Ctx, userID string) エラー UpdateTokens(*GoogleAccount) エラー } タイプ ProviderRegistry struct { プロバイダー マップ[文字列]OAuthProvider } func NewProviderRegistry() *ProviderRegistry { &ProviderRegistryを返す{ プロバイダー: make(map[string]OAuthProvider)、 } } func (r *ProviderRegistry) Register(providerName string, p OAuthProvider) { r.Providers[プロバイダ名] = p } func (r *ProviderRegistry) GetProvider(providerName string) (OAuthProvider, error) { p、存在します := r.Providers[プロバイダ名] !存在する場合 { nil を返す、fmt.Errorf("プロバイダーが見つかりません") } p、nilを返す }
# 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
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", }、環境) r.Register("google", googleProvider) } rを返す }
# 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 の

Google ドライブ ダウンローダー の基礎を築き、プロジェクト構造の設定、Google OAuth の処理、将来の拡張のための基盤の構築などの主要なコンポーネントをカバーしました。その過程で、いくつかの重要なトピックについて触れました:

    Goose を使用した
  • データベース移行により、スムーズでスケーラブルなデータ管理を実現します。
  • 将来的に追加のクラウド ストレージ プロバイダーのサポートを簡単に拡張できるように、
  • プロバイダー レジストリを構築しています。
  • 将来的により複雑なロジックを簡単に処理できる柔軟なアーキテクチャを設計します。
かなり長くなってしまったので、1 つの投稿にはこれで十分です。

パート 2に戻って作業を完了し、メインのダウンロード機能を作業します。

それまでは、GitHub で現在の実装を自由に調べて、次のステップに注目してください。ダウンロードを楽しんでください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/evolvedev/building-a-google-drive-downloader-in-golang-part-1-3fmk?1 侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3