Dans ce didacticiel, nous allons créer un puissant téléchargeur qui permet de télécharger des fichiers depuis Google Drive et d'autres fournisseurs de cloud. Grâce aux modèles de concurrence efficaces de Golang, vous pourrez gérer plusieurs téléchargements simultanément, diffuser des fichiers volumineux et suivre les progrès en temps réel. Que vous téléchargiez quelques petits fichiers ou que vous traitiez de grands ensembles de données, ce projet montrera comment créer un téléchargeur évolutif et robuste qui peut facilement être étendu pour prendre en charge plusieurs plates-formes cloud.
Si vous cherchez un moyen de simplifier et d'automatiser le téléchargement de fichiers volumineux, ce didacticiel est parfait pour vous. À la fin, vous disposerez d'un téléchargeur basé sur Go flexible et personnalisable pour répondre à vos besoins.
Si vous souhaitez simplement utiliser ce téléchargeur avec une interface utilisateur, visitez moveasdev.com pour lire l'article complet et le Github de Go Downloader. Vous trouverez la documentation pour le faire fonctionner rapidement.
Go Modèles de concurrence :
Apprenez à utiliser les Goroutines, les canaux et les mutex pour gérer efficacement plusieurs téléchargements de fichiers simultanés.
Diffusion de téléchargements volumineux :
Découvrez comment diffuser des fichiers volumineux tout en gérant efficacement la mémoire et les ressources système.
Téléchargements de fichiers simultanés :
Découvrez comment télécharger des fichiers simultanément, accélérant le processus et améliorant les performances.
Mises à jour des progrès en temps réel :
Mettez en œuvre un suivi des progrès pour fournir des commentaires en temps réel sur l'état du téléchargement.
Gestion des interruptions et des annulations :
Découvrez comment annuler gracieusement un ou tous les téléchargements en cours.
Remarque : Ce didacticiel se concentrera uniquement sur la logique de téléchargement de base.
Avant de faire quoi que ce soit, assurez-vous de configurer correctement votre environnement pour éviter des bugs potentiels à l'avenir.
Créez un makefile à la racine du projet avec ce qui suit.
# 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
Créez un fichier .env à la racine ou gérez les variables d'environnement comme vous le souhaitez, nous utiliserons le package joho/godotenv.
GOOGLE_CLIENT_ID GOOGLE_CLIENT_SECRET SESSION_SECRET=something-super-secret APP_URL=http://localhost:3000 POSTGRES_USER POSTGRES_PASSWORD POSTGRES_DB
Nous allons maintenant commencer à créer le serveur Web qui gérera toutes les requêtes entrantes.
Attention ! La partie principale de ce guide commence ici. Préparez-vous à plonger !
Pour commencer, créez les fichiers suivants dans le dossier API api.go et route.go
Toutes les routes API seront définies ici. Nous créons une structure NewRouter qui prend la configuration env, permettant à toutes les routes et gestionnaires d'accéder aux variables d'environnement.
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") }) }
Ici, nous ajouterons tous les middlewares nécessaires, tels que CORS et la journalisation, avant de démarrer le serveur.
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) }
Il s'agit du package principal du fichier main.go qui servira de point d'entrée à l'ensemble.
func main() { // Loads all Env vars from .env file. env := config.MustLoadEnv() log.Fatal(s.Start()) }
Cela suffit pour démarrer le serveur et le tester.
air
c'est ça.?
curl http://localhost:3000/healthcheck
La réponse doit être OK avec le statut 200
Nous devons mettre en œuvre une solution évolutive pour ajouter la prise en charge de plusieurs fournisseurs de cloud si nécessaire.
// 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 }
Le ProviderRegistry sert de carte centrale pour contenir tous nos fournisseurs OAuth. Lorsque nous initialiserons nos fournisseurs, nous les enregistrerons dans cette carte. Cela nous permet d'accéder facilement aux fonctionnalités de tout fournisseur enregistré tout au long de notre service.
Vous verrez cette action plus tard.
Nous enregistrerons nos fournisseurs en fonction des variables d'environnement fournies.
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 }
Lisez l'article complet ici.
Nous avons jeté les bases du Google Drive Downloader dans Go, en couvrant des éléments clés tels que la configuration de la structure du projet, la gestion de Google OAuth et la pose des bases d'une expansion future. En cours de route, nous avons abordé quelques sujets importants :
C'est largement suffisant pour un seul article, car les choses devenaient assez longues ! Nous reviendrons dans la Partie 2 pour terminer notre travail, où nous travaillerons sur la principale fonctionnalité de téléchargement.
D'ici là, n'hésitez pas à explorer l'implémentation actuelle dans mon GitHub et restez à l'écoute pour les prochaines étapes. Bon téléchargement !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3