このチュートリアルでは、Google ドライブ や他のクラウド プロバイダーからファイルをダウンロードできる強力なダウンローダーを構築します。 Golang の効率的な同時実行パターンを使用すると、複数のダウンロードを同時に管理したり、大きなファイルをストリーミングしたり、進行状況をリアルタイムで追跡したりすることができます。いくつかの小さなファイルをダウンロードする場合でも、大規模なデータ セットを処理する場合でも、このプロジェクトでは、複数のクラウド プラットフォームをサポートするように簡単に拡張できる、スケーラブルで堅牢なダウンローダーを構築する方法を紹介します。
大きなファイルのダウンロードを簡素化および自動化する方法をお探しの場合は、このチュートリアルが最適です。最終的には、ニーズに合わせて柔軟でカスタマイズ可能な Go ベースのダウンローダーが完成します。
このダウンローダーを UI で使用したいだけの場合は、evolveasdev.com にアクセスして記事全文を読み、Go Downloader の Github を参照してください。迅速に実行するためのドキュメントが見つかります。
Go 同時実行パターン:
ゴルーチン、チャネル、ミューテックスを使用して、複数の同時ファイルのダウンロードを効率的に処理する方法を学びます。
大量のストリーミングダウンロード:
メモリとシステム リソースを効果的に管理しながら、大きなファイルをストリーミングする方法を検討します。
同時ファイルダウンロード:
ファイルを同時にダウンロードしてプロセスを高速化し、パフォーマンスを向上させる方法を理解します。
リアルタイムの進行状況更新:
進行状況の追跡を実装して、ダウンロード ステータスに関するリアルタイムのフィードバックを提供します。
中断とキャンセルの処理:
進行中の 1 つまたはすべてのダウンロードを適切にキャンセルする方法を学びます。
注: このチュートリアルでは、コア ダウンロード ロジックのみに焦点を当てます。
まず、何かを行う前に、将来の潜在的なバグを避けるために環境を適切にセットアップしてください。
以下を使用して、プロジェクトのルートに 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 サーバーの作成を開始します。
注意してください! このガイドの主要部分はここから始まります。飛び込む準備をしましょう!
開始するには、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 で応答は 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 처리, 향후 확장을 위한 기반 마련 등 주요 구성 요소를 다뤘습니다. 그 과정에서 우리는 몇 가지 중요한 주제를 다루었습니다:
글이 꽤 길어져서 포스팅 하나면 충분합니다! 2부에서 다시 돌아와서 주요 다운로드 기능을 다루겠습니다.
그때까지는 내 GitHub에서 현재 구현을 자유롭게 살펴보고 다음 단계를 계속 지켜봐 주시기 바랍니다. 즐거운 다운로드 되세요!
위 내용은 Golang에서 Google 드라이브 다운로더 구축(1부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!