دعنا نحاول كتابة تدريب صغير ، ولكن نظام معلومات متكامل تمامًا يتكون من جزء خادم على Go وتطبيق ويب عميل على Javascript + Vue JS.
أولاً ، بضع كلمات حول ماهية هذا التطبيق وما الغرض منه. منذ بعض الوقت ، ظهر السؤال أمامي حول كيفية توفير مبلغ معين من المال الذي قمت بتكوينه. حتى بالنسبة لي ، شخص بعيد عن عالم التمويل ، كان من الواضح أن الاحتفاظ بالمال النقدي كان سيئًا لسببين على الأقل:
- المال يأكل التضخم (مخاطر التضخم)
- الروبل قد ينخفض (مخاطر سعر الصرف)
تقرر دراسة القضية واختيار أداة الاستثمار المناسبة. كانت المعايير الرئيسية موثوقية وحماية المدخرات من المخاطر المذكورة أعلاه.
لقد درست القضية ونتيجة لذلك توصلت إلى استنتاج مفاده أن الأداة الاستثمارية الوحيدة المناسبة بالنسبة للروسية هي صناديق البورصة المتداولة في البورصة (ETF) ، وتلك المتداولة في بورصة موسكو.
وبالتالي ، أقترح كتابة طلب تدريب يُظهر ربحية جميع صناديق الاستثمار المتداولة في بورصة موسكو.
يمكنك القول أنه يمكن عرض هذه الربحية على موقع التبادل نفسه ، ويجب أن يكون التطبيق ، على الأقل للتدريب ، مفيدًا إلى حد ما. أوافق ، لذلك ، سنحاول عرض بعض عائدات الأسهم الشرطية الحقيقية. بهذا العائد الحقيقي المشروط ، أعني معدل العائد المعدل للتضخم في روسيا.
في الجزء الأول من المقالة ، سنقوم بتحليل جزء الخادم من التطبيق. الخلفية مكتوبة بلغة Go وخلال التطوير سنحاول تطبيق ميزات اللغة مثل تنفيذ التعليمات البرمجية المتوازية ، والواجهات ، والاختبار ، وأكثر من ذلك.
متطلبات المعارف التقليدية:
- يجب أن يوفر جزء الخادم من التطبيق ، عند الطلب ، بيانات حول أسعار جميع صناديق الاستثمار المتداولة في بورصة موسكو وبيانات التضخم لجميع أشهر التداول لكل ورقة
- يجب أن يدعم جزء الخادم في التطبيق العديد من موفري مستودع البيانات ، ويجب ألا يتطلب التبديل بين مقدمي الخدمة تغييرات في التعليمات البرمجية
- يجب أن يوفر جزء الخادم من التطبيق واجهة برمجة التطبيقات (API) عبر بروتوكول http لتلقي البيانات من وحدة التخزين
لذلك ، دعونا تصميم بنية البرنامج لجزء الخادم من نظامنا.
أولاً ، سنصل إلى بنية الحزمة الخاصة بالتطبيق. وفقًا لبيان العمل ، سيتألف التطبيق من خادم ويب يوفر واجهة برمجة تطبيقات REST ويعطي ملفات تطبيق الويب الخاص بنا (سنقوم لاحقًا بكتابة SPA على Vue). بالإضافة إلى ذلك ، وفقًا لـ ToR ، يجب علينا تقديم عدة حزم لموفري مستودع البيانات.
في هذه المرحلة ، يجب أن نتعمق في التفاصيل. كيف يمكنني توفير القدرة على التبديل بين موفري بعض الوظائف في Go؟ الجواب: استخدام واجهات. وبالتالي ، سنحتاج إلى تطوير واجهة (عقد) للحزم ، يقوم كل منها بتنفيذ عقد لنوع التخزين الخاص به. في المقالة ، سننظر في تخزين البيانات في ذاكرة الوصول العشوائي ، ولكن من خلال القياس ، يمكنك بسهولة إضافة أي قواعد بيانات. هيكل الحزمة النهائي سيكون على النحو التالي:
ثانياً ، لنقرر أنواع البيانات التي سنخزن بها المعلومات المستلمة والعقد لموفري التخزين.
سنحتاج إلى أنواع البيانات لأسعار الأسهم والتضخم. سنتخذ عروض الأسعار والتضخم قبل أشهر ، وهذا المقياس مناسب تمامًا لأداة غير مضاربة مثل ETF.
سيتطلب العقد توافر طرق لملء التخزين بالبيانات من خادم Mosbirzha (التهيئة) وتقديم بيانات الاقتباس عند الطلب. كل شيء بسيط للغاية.
نتيجة لذلك ، نضع أنواع تخزين علامات الاقتباس والواجهة في وحدة التخزين:
للبساطة ، نقوم بتشفير بيانات التضخم في وحدة الخادم:
var inflation = []struct { Year int Values [12]float64 }{ { Year: 2013, Values: [12]float64{0.97, 0.56, 0.34, 0.51, 0.66, 0.42, 0.82, 0.14, 0.21, 0.57, 0.56, 0.51}, }, { Year: 2014, Values: [12]float64{0.59, 0.70, 1.02, 0.90, 0.90, 0.62, 0.49, 0.24, 0.65, 0.82, 1.28, 2.62}, }, { Year: 2015, Values: [12]float64{3.85, 2.22, 1.21, 0.46, 0.35, 0.19, 0.80, 0.35, 0.57, 0.74, 0.75, 0.77}, }, { Year: 2016, Values: [12]float64{0.96, 0.63, 0.46, 0.44, 0.41, 0.36, 0.54, 0.01, 0.17, 0.43, 0.44, 0.40}, }, { Year: 2017, Values: [12]float64{0.62, 0.22, 0.13, 0.33, 0.37, 0.61, 0.07, -0.54, -0.15, 0.20, 0.22, 0.42}, }, { Year: 2018, Values: [12]float64{0.31, 0.21, 0.29, 0.38, 0.38, 0.49, 0.27, 0.01, 0.16, 0.35, 0.50, 0.84}, }, }
ثالثًا ، دعنا نصف نقاط النهاية لواجهة برمجة التطبيقات لدينا. لن يكون هناك سوى اثنين: لعروض الأسعار والتضخم. طريقة HTTP GET فقط.
في الواقع ، يتم استلام ومعالجة البيانات من موقع تبادل موسكو في طريقة التهيئة. نأخذ البيانات وفقًا
للمساعدة في واجهة برمجة تطبيقات التبادل .
ما يجب الانتباه إليه: نحن مجبرون على استخدام طلب منفصل لكل أمان (وهناك بالفعل عشرات منهم). تنفيذ تهيئة البيانات بالتسلسل ، في سلسلة واحدة ، سيستغرق الكثير من الوقت. لذلك ، سوف نستخدم فخر Go-goroutines. انتبه إلى الجزء التالي من الكود:
في وظيفة تهيئة البيانات ، قمنا بموازنة الطلبات إلى الخادم. في الممارسة العملية ، يحتوي تحليل الموقع هذا على عدد من المشكلات:
- قد يؤدي إلى الحظر التلقائي للطلبات بسبب الاشتباه في DoS
- يجب عليك استخدام وحدة السياق أو قناة التحكم لإجبار goroutin على الإنهاء.
- تحتاج إلى استخدام القناة لإرجاع الأخطاء من goroutine
للبساطة ، تم حذف كل هذه النقاط.
لأغراض البرنامج التدريبي ، يعد جهاز توجيه طلب HTTP المضمن كافيًا بالنسبة لنا. في الأنظمة الأكثر تعقيدًا ، ربما تريد استخدام البعض الآخر. شخصيا ، أنا استخدم جهاز التوجيه من مشروع الغوريلا ، ولكن بشكل عام هناك الكثير منهم.
بعد ذلك ، سنضيف نقطة لتحميل ملفات تطبيق الويب الخاص بنا. إذا نظرنا إلى الأمام ، سأقول أنه يجب عليك ببساطة استخدام محتوى الملف المرتجع.
لذلك دعونا نكتب خادمنا:
لن أقدم رمز تنفيذ التخزين في الذاكرة هنا ، كل شيء متاح على
جيثب .
لاختبار API لدينا:
التضخميقتبسهذا يكمل الجزء الأول من المقال. في الجزء الثاني ، سنكتب الاختبارات وقياسات الأداء لحزمنا. في الجزء الثالث ، سنقوم بتطوير تطبيق ويب.