كيفية جعل أي تطبيق NodeJS Serverless

أرجو أن تحب Serverless بقدر ما أحب لأن هذا هو آخر وظيفة في هذا الموضوع.

الآن ، إذا كنا نتحدث عن واجهة برمجة تطبيقات REST بسيطة بدون خادم ، فإن الإعداد الخاص بك واضح جدًا على AWS: Lambda + API Gateway.

ولكن ماذا عن الخدمات الأخرى (الصغيرة) التي قد تكون خلفيتك؟ كما تعلمون ، ليس من الأفضل وضع كل رمز التطبيق الخاص بك في وظيفة AWS Lambda واحدة متجانسة.

التحدي

نريد نشر وحدات التطبيق بسهولة كخدمات ميكروية بدون خادم ، والتي تحتاج أيضًا إلى التواصل مع بعضها البعض. على نحو مفضل ، يجب تنظيم التواصل بين الخدمات بواسطة نوع من ACL.

محاولة 1. بوابة API

هذه هي الفكرة الأولى التي كانت لدي عندما كنت أحاول حل المشكلة: فقط فضح كل الخدمات المصغرة عبر بوابة API. المشكلة هي ... واجهات برمجة التطبيقات التي تم إنشاؤها عامة.

لماذا هذه مشكلة؟ على سبيل المثال ، لا نريد أن نتعرض لخدمة الفواتير للعالم بأسره ، حتى لو كان الدخول مقيدًا باستخدام نوع من التفويض.

حسنًا ، يمكنك جعل API خاصة ، لكن سياسات الأمان محدودة جدًا:

يمكنك استخدام سياسات موارد API Gateway للسماح باستدعاء واجهة برمجة التطبيقات الخاصة بك بشكل آمن عن طريق:
* المستخدمين من حساب AWS المحدد
* نطاقات عنوان IP المصدر المحدد أو كتل CIDR
* السحب الخاصة الافتراضية المحددة (VPCs) أو نقاط نهاية VPC (في أي حساب)

هذا يجعل مزعجة للغاية للسيطرة على الاتصالات بين هذه الخدمات. الطريقة الوحيدة للقيام بذلك هنا هي وضع الخدمات في أجهزة VPC منفصلة ، والكثير من العمل.

محاولة 2. لامدا

لماذا لا نضع كل خدمة microservice في AWS Lambda منفصلة؟ هل سيؤدي هذا إلى حل المشكلة؟

نعم ، ستكون في الحقيقة خدمة ميكروية بدون خادم ، وستتمكن من استخدام سياسات IAM لضبط عمليات الوصول بين الخدمات ، لكن ... ليس الأمر "سهلاً".

أعلم أن هذا أمر طبيعي تمامًا في الوقت الحاضر للحصول على وظيفة صغيرة كوحدة النشر الخاصة بك. وفي حالة وجود أكثر من نقطة واحدة / طريقة / وظيفة في خدمتك ، يُفضل نشرها على هيئة Lambdas متعددة.

أنا أفهم مزايا ذلك ، لكنك تضحي بسهولة الصيانة والتطوير. وأيضًا ، لا أحب فكرة نشر خدمة كمجموعة من وظائف Lambda. تخيل ، عدة وظائف منفصلة التعامل مع الفواتير؟ لم يعد سياق محدد بعد الآن. على الرغم من وجود حالات قد تكون فيها هذه التفاصيل مفيدة ، إلا أنها حالة نادرة.

محاولة 3. فات لامدا

هل يمكننا بالفعل نشر مجموعة من نقاط النهاية باعتبارها Lambda واحدة (بدون استخدام بوابة API ، بالطبع)؟

إذا تمكنا من القيام بذلك ، فسنحصل على كل مزايا الخيار السابق ، لكننا سنكون قادرين أيضًا على اختيار التفاصيل الدقيقة لوحدات النشر لدينا.

الطريقة التي أريدها هي ما يلي: يجب أن تكون كل خدمة قابلة للنشر عبارة عن كائن JS قديم بسيط بسيط مع الأساليب. هذا أمر تافه للغاية لتحقيقه عن طريق إضافة بضعة أسطر من كود الغراء بين الكائن الخاص بك و AWS Lambda.

إليكم تطبيقي: aws-rpc. تكشف وحدة nodejs هذه عن وظيفة lambdaHandler ، حيث تقوم بتمرير كائن ، وتتعرض تلقائيًا لأي شخص قادر على الوصول إلى Lambda:

استيراد {lambdaHandler} من 'aws-rpc' ؛
استيراد {TestServiceImpl} من './TestServiceImpl' ؛
// هذه هي وحدة النشر الخاصة بك
/ / هذا هو ما تحدده كدالة معالج Lambda
معالج const التصدير = lambdaHandler (TestServiceImpl () جديد) ؛

الآن ، يمكنك فقط نشر "معالج" باسم AWS Lambda. إليك كيفية استدعاء أساليبها:

استيراد {TestService} من './TestService' ؛
عميل العميل = في انتظار createClient  ("LambdaName"، "test")؛
console.log (انتظار client.test ()) ؛

يرجى ملاحظة أنه لكي تتمكن من إنشاء طرق لكائن كعب الروتين للعميل ، يجب عليك تمرير جميع أسماء الطرق إلى createClient ، كما فعلنا في المثال.

هذا مطلوب لأن JS لا يحتوي على أي معلومات وقت تشغيل حول واجهات TypeScript. يمكنني تنفيذه باستخدام فئات مجردة ، لكنني لا أحب ذلك ¯ \ _ (ツ) _ / ¯.

علاوة! يمكنك تشغيل كل شيء محليا!

أعتقد أنه من المهم جدًا أن تكون بيئة التطوير المحلية مريحة قدر الإمكان. لهذا السبب أضفت أيضًا قدرة على تشغيل الخدمة والعملاء محليًا دون نشر أي شيء على AWS (راجع وظائف runService و createClient). للحصول على أمثلة ، راجع مستودع على GitHub.

ملخص

من السهل جدًا أن تضيع في الخدمات التي يقدمها مزودو خدمات الحوسبة السحابية ، وبنى هندسة البنية التحتية لديك.

أختار دائمًا الحل الأكثر بساطة ووضوحًا الذي يمكنني التفكير فيه. تذكر دائمًا أنه يمكن إعادة استخدام العديد من التقنيات والممارسات من المنصات الأخرى (فكرة NodeJS Lambda المستوحاة من الدهون مستوحاة من ما يسمى بالجرار الدهنية من عالم Java).

إذا أعجبك هذا الموضوع ، تحقق من ذلك أيضًا:

  • عليك أن تتعلم كيف تصنع أفضل بنية بدون خادم
  • كيفية إنشاء خط أنابيب CI / CD مجاني بدون خادم: 3 أمثلة سهلة
  • كيفية بسهولة تكرار DynamoDB عبر المناطق
  • كيفية جعل التطبيق متعدد الأقاليم (ودفع الصفر)
  • جعل أي تطبيق ويب جافا Serverless

التعليقات ، يحب ، والأسهم هي محل تقدير كبير. في صحتك!