project omega
آخر نمط لهندسة الويب الخاصة بالمؤسسة ستحتاج إليه على الإطلاق. حتى اليوم التالي.
ليرة تركية؛ د
الهدف هو تحسين تجربة المطور من خلال القدرة على:
- تطوير محليا كما لو كان متراصة
- النشر كخدمات صغيرة منفصلة
- محاكاة بيئة الإنتاج محليًا باستخدام عامل الإرساء
تجريبي
project omega إثبات المفهوم - Microservices Monolith Hybrid
العرض التوضيحي project omega - Kubernetes Microserves ونشر الحاويات المستقلة
لماذا
أريد أن أثبت أنه ليس علينا التضحية بكفاءة المطورين للحصول على قابلية التوسع. المزيد من المناقشات حول إيجابيات وسلبيات الخدمات الصغيرة والوحدات المتراصة هنا: الخدمات الصغيرة والوحدات المتراصة.
انطباعي هو أن العديد من خبراء الصناعة يريدون منا أن نعتقد أن هذه هي خياراتنا الثلاثة الرئيسية:
- متراصة
- الخدمات المصغرة
- "مختلط" (ليس مختلطًا حقًا، فهو عبارة عن وحدة متراصة وأيضًا بعض الخدمات الصغيرة)
أريد أن أبين أنه ليس علينا اختيار أي من هذه الخيارات. مع القليل من الإبداع، يمكننا الحصول على "هجين" حقيقي يكون عبارة عن وحدة متراصة ومجموعة من الخدمات الصغيرة. من خلال استراتيجيتي الحالية، لا أعتقد أنه يمكننا التخلص من جميع الجوانب السلبية للخدمات المتجانسة والخدمات الصغيرة، ولكن يمكننا التخلص من العديد من نقاط الضعف في كليهما.
ما هو ليس كذلك
- أنا لا أحاول إنشاء إطار عمل (ليس بعد على الأقل...). أنا فقط أقوم بتجميع كل قطع الليغو التي أملكها في تكوين مختلف كتجربة.
- وليس المقصود أن يكون هذا مشروع مجتمعي. أنوي إجراء تغييرات جذرية متكررة دون سابق إنذار. إذا كان هذا المفهوم يبدو مثيرًا للاهتمام بالنسبة لك وترغب في المساهمة فيه، فاتصل بي أولاً.
أهداف المشروع
- أنشئ نمطًا يناسب المشاريع كمشاريع هواية صغيرة للمطورين الفرديين ويتسع أيضًا ليشمل العشرات أو حتى المئات من المطورين الذين يعملون على تطبيقات الويب الخاصة بالمؤسسات الكبيرة والمعقدة.
- أن تكون قادرًا على التطور محليًا كما لو كانت وحدة متراصة:
- مستودع واحد. لنفس الأسباب تختار الشركات نهج مونوريبو.
- الحد الأقصى 3 عمليات للتشغيل (واجهة مستخدم العميل، الخادم، تبعيات عامل الإرساء مع قاعدة البيانات، قائمة انتظار الرسائل، إلخ). لا نريد أن يتم تشغيل صفحات مستندات الإعداد.
- تكون قادرة على النشر كخدمات صغيرة.
- تكون قادرًا على محاكاة بيئة الإنتاج باستخدام الخدمات الصغيرة التي تعمل في حاويات الإرساء.
- وقت الإعداد سريع للغاية. يجب تضمين جميع التبعيات بخلاف Node و.NET كتبعيات عامل إرساء (قاعدة بيانات، قائمة انتظار الرسائل، إلخ). يجب أن يكون المستخدمون الجدد قادرين على تثبيت .NET وNode واستنساخ الريبو ثم تنفيذ أوامر التثبيت والتشغيل.
- إعادة تحميل سريع للغاية لكل من العميل والخادم في بيئة التطوير.
- أن تكون قادرًا على تطوير التطبيق وتشغيله على أنظمة التشغيل Windows وLinux وMac.
- أن تكون قادرًا على تشغيل خدمة جديدة بسرعة.
مكدس التكنولوجيا
مجموعة التكنولوجيا غير ذات صلة في الغالب بالمفهوم عالي المستوى الذي أحاول إثباته، ولكن بالنسبة لهذا المشروع سأستخدم:
- .NET 5 للخدمات
- الواجهة الأمامية للتفاعل (إنشاء تطبيق تفاعلي أساسي باستخدام الكتابة النصية)
- عامل ميناء
مفاهيم عالية المستوى
يتم دفع الشركات ذات التطبيقات الكبيرة أكثر فأكثر نحو الخدمات الصغيرة حتى تتمكن من التوسع أفقيًا (من بين أسباب أخرى). لذلك، لتحقيق ذلك نحن ننظر إلى شيء مثل ما يلي:
فيما يلي إصدار آخر يوضح إحدى الطرق التي يمكن بها تنفيذ القياس الأفقي:
وبمجرد أن نسير في هذا الطريق، سينتهي بنا الأمر إلى مشكلة حقيقية تتعلق بالتنمية المحلية. يعتمد الأمر حقًا على شكل المنتج، وعدد المطورين، ومن يعمل على ماذا، وكم مرة. ومع ذلك، فإن جزءًا كبيرًا من الشركات التي تختار الخدمات الصغيرة سينتهي بها الأمر في موقف حيث يتعين على المطورين اتخاذ بعض الخيارات الصعبة حول كيفية القيام بالتطوير اليومي. مع project omega ، الهدف هو إظهار أنه يمكننا التخلص من الحمل الزائد لتشغيل خدمة محليًا من خلال دمجها جميعًا في تطبيق واحد أثناء تشغيلها محليًا:
هنا هو هيكل المجلد:
وإليكم ما سيبدو عليه الأمر عند نشره كخدمات صغيرة:
يحتوي كل مثيل على نسخة من كل التعليمات البرمجية ولكنه يقوم فقط بتشغيل التهيئة ومسارات نقطة نهاية الخدمة والعمليات المنفذة لخدمة صغيرة محددة.
هذا هو السبب في أنه من السهل جدًا تشغيل التطبيق محليًا كوحدة واحدة لأننا ببساطة نبحث عن متغير بيئة يسمى SERVICE_KEY
أو إذا لم يكن موجودًا، فقم بتهيئة جميع الخدمات.
أمثلة على التهيئة الخاصة بالخدمة الأخرى:
- إعداد حقن التبعية
- سلاسل اتصال قاعدة البيانات
- ترحيل قاعدة البيانات
- تهيئة قائمة انتظار الرسائل
- إعداد اتصال ذاكرة التخزين المؤقت الموزعة
- إعداد اتصال الموارد السحابية الأخرى
- تهيئة واجهة برمجة التطبيقات لجهة خارجية
عندما يتم استدعاء بدء التشغيل، فإنه يقوم بفحص التجميعات بحثًا عن الأنواع التي ترث ProjectOmegaService
، ويقوم بإنشاء مثيل وتشغيل منطق تهيئة تلك الخدمة. عند التشغيل محليًا، سيتم تشغيلهم جميعًا.
تعليمات الإعداد
تثبيت المتطلبات المسبقة:
- نت 5
- العقدة
- غزل
- عامل ميناء
لاحظ أن الحصول على أحدث إصدار من عامل الإرساء الذي يعمل على نظام التشغيل Windows قد يتطلب بعض الخطوات الإضافية إذا لم تقم بذلك منذ فترة، مثل تثبيت WSL 2 وتحديث توزيعة WSL الخاصة بك. اتبع أي تعليمات موجودة على موقع Docker الإلكتروني.
خطوات:
- استنساخ هذا الريبو
- في محطة من جذر الريبو، قم بتشغيل
yarn run installAll
- إذا كنت تريد تشغيل خادم SQL على منفذ غير 1434:
- قم بتشغيل
yarn run syncEnvFiles
- قم بتغيير
OMEGA_DEFAULT_DB_PORT
و OMEGA_MSSQL_HOST_PORT
في .env.server
- ابدأ التبعيات باستخدام الأمر
yarn run dockerDepsUpDetached
- قم بتشغيل عمليات ترحيل قاعدة البيانات في المرة الأولى التي تقوم فيها بالتشغيل، أو عندما تحصل على تغييرات شخص آخر مع تحديثات قاعدة البيانات:
yarn run dbMigrate
- قم بتشغيل التطبيق في وضع التطوير المحلي باستخدام أحد هذه الخيارات:
- الخيار 1: في محطة طرفية من الريبو،
yarn run both
(يستخدم هذا بشكل متزامن لتشغيل الأوامر من الخيارات 2) - الخيار 2: استخدام محطتين منفصلتين. في محطة واحدة، يتم تشغيل
yarn run client
وفي yarn run server
الآخر
- الوصول إلى https://localhost:3000 (انقر فوق تحذير https السابق)
قبل تشغيل اختبارات الوحدة باستخدام dotnet test
في المرة الأولى أو بعد إضافة اختبارات الوحدة على مخطط قاعدة البيانات الجديد:
- ابدأ التبعيات إذا لم تكن قيد التشغيل بالفعل باستخدام
yarn run dockerDepsUpDetached
- تشغيل
yarn run testDbMigrate
- ثم قم بإجراء
dotnet test
لمحاكاة الإنتاج والخدمات الصغيرة في عامل الإرساء:
- تأكد من تشغيل تبعيات عامل الإرساء باستخدام
yarn run dockerDepsUpDetached
- في محطة من جذر الريبو، قم
yarn run dockerRecreateFull
- الوصول إلى https://localhost:3000 (انقر فوق تحذير https السابق)
الخطوات التالية
- تسجيل التغييرات
- تجربة مع منسق Serilog json
- أضف معرف الارتباط والمعلومات السياقية الأخرى لتسجيل الإدخالات
- أضف وثائق إضافية
- مخططات لكيفية عمل محاكاة عامل الإرساء
- تبعيات عامل الميناء
- وصف نصي لما هو وكيف يعمل
- مخططات لكيفية تناسب عمال الإرساء في عملية التطوير
- وثائق التوجيه/الوكيل
- ترحيلات قاعدة البيانات
- اختبار RPC بين الخدمات بدلاً من مكالمات الراحة http (ربما باستخدام شيء مثل هذا: https://github.com/aspnet/AspLabs/tree/main/src/GrpcHttpApi)
- أضف إلى الفئة الأساسية للعميل بين الخدمات لتجريد معالجة الأخطاء وتسجيلها
- تنفيذ المصادقة
- تسجيل الموقع الأمامي
- خدمة لمصادقة الخدمة (OAuth؟)
- إنشاء الوثائق تلقائيًا (إخراج وثائق swagger وhtml xml)
- خدمات إعداد قائمة الانتظار والعمليات المنفذة
- تعريف قائمة الانتظار المجردة (للسماح باستخدام الخدمات السحابية كخيار)
- خدمة نوع العملية المنفذة الأساسية مع حلقة حدث تبحث عن الرسائل
- RabbitMQ في docker-compose.deps.yml
- يتم توصيل التنفيذ الأساسي لـ RabbitMQ بخدمة العمليات المنفذة
- عمل تجريبي إضافي لـ kubernetes المحلي
- من المحتمل أن تتطلب قاعدة البيانات تعلم كيفية استخدام وحدة تخزين kubernetes المستمرة، إلا إذا تمكنت من معرفة كيفية ضبط الشبكة لكشف قاعدة بيانات المضيف
- أضف Seq أو اجعل وظيفة Seq اختيارية ولا تستخدمها عند التشغيل في kubernetes
- مشروع ميتا/البرنامج النصي لتحليل الحل
- تحليل الخدمات المتأثرة بناءً على الملفات التي تم تغييرها (للحصول على تفاصيل النشر)
- سقالات المشروع:
- القدرة على إنشاء نسخة جديدة من المشروع باستخدام "مفتاح" مشروع آخر إلى جانب أوميغا لجميع أسماء المشروع/الدليل
- القدرة على إنشاء مشروع جديد يقوم بتدوير حاويات الإرساء وإجراء اختبارات التكامل بشكل فعال لضمان نجاح إنشاء مشروع جديد
متنوعات
إذا كنت تقوم بالتطوير على نظام Linux، فقد تواجه هذا الخطأ عند بدء تشغيل الخادم:
System.AggregateException: حدث خطأ واحد أو أكثر. (تم الوصول إلى حد المستخدم الذي تم تكوينه (128) لعدد مثيلات inotify، أو تم الوصول إلى الحد الأقصى لكل عملية لعدد واصفات الملفات المفتوحة.)
من المحتمل أن يكون السبب في ذلك هو استخدام vscode لعدد كبير جدًا من عمليات مراقبة الملفات. يمكنك زيادة الحد الأقصى لمثيلات inotify
(وليس فقط حد الساعات، والذي ربما تم تعيينه بالفعل على مستوى مرتفع جدًا في ملف /etc/sysctl.conf
الخاص بك) عن طريق تشغيل هذا الأمر:
echo fs.inotify.max_user_instances=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
وثائق أخرى
تحليل فوائد تكلفة نمط التصميم: DesignPatternCostBenefit.md
اختلافات نمط التصميم: DesignPatternVariations.md
القرارات: القرارات.md
فلسفات تطوير البرمجيات والأحاديث الصاخبة: https://Gist.github.com/mikey-t/3d5d6f0f5316abf9e74fb553be9fdef3