في هذا البرنامج التعليمي، سنقوم بإنشاء أداة تنزيل قوية تسمح بتنزيل الملفات من Google Drive وموفري الخدمات السحابية الآخرين. باستخدام أنماط التزامن الفعالة في Golang، ستتمكن من إدارة التنزيلات المتعددة بشكل متزامن، ودفق الملفات الكبيرة، وتتبع التقدم في الوقت الفعلي. سواء كنت تقوم بتنزيل بعض الملفات الصغيرة أو التعامل مع مجموعات كبيرة من البيانات، سيعرض هذا المشروع كيفية إنشاء أداة تنزيل قوية وقابلة للتطوير ويمكن توسيعها بسهولة لدعم منصات سحابية متعددة.
إذا كنت تبحث عن طريقة لتبسيط عملية تنزيل الملفات الكبيرة وأتمتتها، فهذا البرنامج التعليمي مثالي لك. وفي النهاية، سيكون لديك برنامج تنزيل مرن وقابل للتخصيص يستند إلى Go ليناسب احتياجاتك.
إذا كنت تتطلع فقط إلى استخدام برنامج التنزيل هذا مع واجهة مستخدم، فتفضل بزيارة موقع Evolvesdev.com لقراءة المقال كاملاً والذهاب إلى Github الخاص ببرنامج التنزيل. ستجد المستندات لتشغيله بسرعة.
أنماط التزامن Go:
تعرف على كيفية استخدام Goroutines والقنوات وكائنات المزامنة للتعامل مع تنزيلات الملفات المتزامنة المتعددة بكفاءة.
تنزيلات كبيرة الحجم:
اكتشف كيفية دفق الملفات الكبيرة مع إدارة الذاكرة وموارد النظام بفعالية.
تنزيلات الملفات المتزامنة:
فهم كيفية تنزيل الملفات بشكل متزامن، مما يؤدي إلى تسريع العملية وتحسين الأداء.
تحديثات التقدم في الوقت الفعلي:
قم بتنفيذ تتبع التقدم لتقديم تعليقات في الوقت الفعلي حول حالة التنزيل.
التعامل مع الانقطاعات والإلغاءات:
تعرف على كيفية إلغاء تنزيل واحد أو كل التنزيلات الجارية بأمان.
ملاحظة: سيركز هذا البرنامج التعليمي فقط على منطق التنزيل الأساسي.
أولاً قبل القيام بأي شيء، تأكد من إعداد بيئتك بشكل صحيح لتجنب الأخطاء المحتملة في المستقبل.
قم بإنشاء ملف تعريفي في جذر المشروع بما يلي.
# 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
جميع سيتم تعريف مسارات واجهة برمجة التطبيقات في هذا هنا. قمنا بإنشاء بنية NewRouter التي تأخذ تكوين env، مما يسمح لجميع المسارات والمعالجات بالوصول إلى متغيرات البيئة.
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 Drive Downloader في Go، والذي يغطي المكونات الرئيسية مثل إعداد هيكل المشروع، والتعامل مع Google OAuth، ووضع الأساس للتوسع المستقبلي. على طول الطريق، تطرقنا إلى بعض المواضيع الهامة:
هذا أكثر من كافٍ لمنشور واحد، حيث كانت الأمور تطول جدًا! سنعود في الجزء الثاني لإنهاء عملنا، حيث سنعمل على وظيفة التنزيل الرئيسية.
حتى ذلك الحين، لا تتردد في استكشاف التنفيذ الحالي في GitHub الخاص بي وترقب الخطوات التالية. تحميل سعيد!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3