إلى الخلف
مدينة الحندية
جدول المحتوى

 

هناك انتشار للغات البرمجة الحديثة الآن أكثر من أي وقت مضى. ومع ذلك، تميل منظمات التنمية إلى التمسك بلغة أو لغتين، مما يسمح لها بإدارة مجموعتها بشكل صحيح والحفاظ على نظافتها.

تعد لغات البرمجة أدوات أساسية إذا لم يتم اختيارها بشكل مناسب، فقد يكون لها تأثير معوق على الأعمال. على سبيل المثال، يفضل المطورون Python على Java لإعداد خوارزميات التعلم الآلي، لأن Python لديها مكتبات أفضل مطلوبة للتعلم الآلي وتطبيقات الذكاء الاصطناعي.

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

Microservice multilingual

بناء بنية خدمات مصغرة مستقلة عن اللغة

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

ومع ذلك، يمكن أن تكون إدارة لغات متعددة مهمة ضخمة ويجب على المطور بالتأكيد مراعاة الجوانب التالية عندما يخطط لإضافة المزيد من اللغات إلى مجموعة التكنولوجيا الخاصة به:

  • رمز لوحة الغلاية الجديد،
  • تحديد النماذج/هياكل البيانات مرة أخرى،
  • التوثيق،
  • البيئة التي تعمل عليها،
  • إطار جديد، إلخ.

 

لماذا RESTful API ليست الخيار الصحيح

تتطلب واجهة برمجة تطبيقات REST إطارًا جديدًا لكل لغة جديدة مثل Express لـ Node.js أو Flask لـ Python أو Gin for Go. أيضًا، قد يضطر المطور إلى ترميز نماذجه/هياكل البيانات الخاصة به مرارًا وتكرارًا لكل خدمة أيضًا. هذا يجعل العملية بأكملها زائدة عن الحاجة ويمكن أن يؤدي إلى العديد من الأخطاء.

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

 

إفساح المجال للمخازن المؤقتة لـ gRPC والبروتوكول

gRPC 

gRPC هو إطار مكالمات الإجراءات عن بُعد عالي الأداء والمفتوح المصدر من Google. إنه متوافق مع لغات متعددة مثل Go و Node.js وبيثون وجافا وC-Sharp وغيرها الكثير. يستخدم RPC لتوفير قدرات الاتصال للخدمات المصغرة. علاوة على ذلك، فهو بديل أفضل لـ REST. gRPC أسرع بكثير من REST. ويستخدم هذا الإطار Protocol Buffers كلغة تعريف الواجهة للتسلسل والاتصال بدلاً من JSON/XML. إنه يعمل على أساس الاتصال بين الخادم والعميل.

يتم تقديم تحليل متعمق لـ gRPC هنا.

 

مخازن البروتوكول 

مخازن البروتوكول هي طريقة لتسلسل البيانات التي يمكن نقلها عبر الأسلاك أو تخزينها في ملفات. باختصار، المخزن المؤقت للبروتوكول أو بروتوبوف هو نفس ما تعنيه JSON فيما يتعلق بـ REST. إنه بديل لـ JSON/XML، وإن كان أصغر وأسرع. يحدد Protobuf الخدمات والبيانات الأخرى ثم يتم تجميعها في لغات متعددة. ثم يتم استخدام إطار gRPC لإنشاء خدمة.

يستخدم gRPC أحدث بروتوكول نقل - HTTP/2، والذي يدعم الاتصال ثنائي الاتجاه جنبًا إلى جنب مع الطلب/الاستجابة التقليدية. في gRPC، يقترن الخادم بشكل فضفاض بالعميل. من الناحية العملية، يفتح العميل اتصالًا طويل الأمد مع خادم gRPC وسيتم فتح دفق HTTP/2 جديد لكل مكالمة RPC.

 

كيف نستخدم بروتوبوف؟

نقوم أولاً بتعريف خدمتنا في Protobuf وتجميعها بأي لغة. بعد ذلك، نستخدم الملفات المجمعة لإنشاء إطار gRPC الخاص بنا لإنشاء خادمنا وعميلنا، كما هو موضح في الرسم البياني أدناه.

Protobuffers for microservices

لشرح العملية:

  1. تعريف خدمة باستخدام مخازن البروتوكول
  2. قم بتجميع هذه الخدمة إلى لغات أخرى حسب الاختيار
  3. قم بإنشاء كود لوحة معيارية في كل لغة
  4. استخدم هذا لإنشاء خادم gRPC والعملاء

 

مزايا استخدام هذه البنية:

  • يمكنك استخدام لغات متعددة بإطار واحد.
  • تعريف واحد عبر جميع الخدمات، وهو أمر مفيد جدًا في المؤسسة.
  • يمكن لأي عميل التواصل مع أي خادم بغض النظر عن اللغة.
  • يسمح gRPC بالاتصال ثنائي الاتجاه ويستخدم HTTP/2 وهو سريع للغاية.

 

إنشاء خدمة مصغرة باستخدام gRPC

لنقم بإنشاء خدمة مصغرة بسيطة - خدمة هيلو وورلد. هذه خدمة أساسية جدًا تستدعي طريقة واحدة فقط - HelloWorld - والتي ستعيد السلسلة»مرحبا بالعالم».

هذه هي الخطوات الأربع التي يجب اتباعها أثناء إنشاء خدمة مصغرة:

  1. تعريف الخدمة (ملف المخزن المؤقت للبروتوكول)
  2. حدد لغاتك
  3. قم بتجميع الخدمة المحددة إلى لغات محددة
  4. قم بإنشاء خادم gRPC وعميل باستخدام الملفات المجمعة

بالنسبة لهذه الخدمة البسيطة، نختار لغتين: Go و Node.js. نظرًا لأن gRPC يعمل على بنية خادم العميل، فسنستخدم Go على الخادم (نظرًا لأنه سريع وفعال من حيث الموارد) و Node.js للعملاء (نظرًا لأن معظم التطبيقات هذه الأيام هي React/Angular).

** يمكن للمرء أيضًا أن يقرر تشغيل خوادم gRPC باستخدام REST API أيضًا، إذا لم يرغب في إنشاء عملاء. يمكنهم القيام بذلك عن طريق إنشاء خادم REST Proxy. على الرغم من أن الأمر يبدو شاقًا، إلا أنه في الواقع بسيط جدًا وسيتم التعامل معه في قسم «التجميع» الذي سيتبع.

 

الخطوة 1: تعريف الخدمة

يتم تعريف الرسائل والخدمات باستخدام Protobuf في ملف أولي (. بروتو ملف).

بناء الجملة بسيط للغاية؛ يتم تعريف الرسائل واستخدامها كطلب واستجابة لمكالمات RPC، لكل خدمة. هنا هو دليل اللغة للمخازن المؤقتة للبروتوكول.

يمكننا إنشاء مجلد جديد لكل خدمة تحت اسم تلك الخدمة المعينة. ولسهولة الوصول، يمكننا تخزين جميع هذه الخدمات ضمن مجلد «الخدمات».

الخدمة التي نحددها هنا هي «helloworld». ويجب أن يحتوي كل مجلد على ملفين، وهما:

  • service.proto - يحتوي على تعريف
  • .protolangs - يحتوي على اللغات التي يجب إنشاء هذه الخدمة بها.

 

Services folder
بنية المجلد

الآن، دعونا نحدد خدمتنا:

gRPC hello world

 

كما هو موضح أعلاه، قمنا بتعريف الطلب الفارغ واستجابة السلسلة وخدمة HelloWorldService باستخدام استدعاء RPC واحد HelloWorld. تقبل هذه المكالمة الطلبات وتعيد الردود. يمكنك رؤية الريبو الكامل هنا.

 

الخطوة 2: اختيار اللغات

بمجرد تحديد الخدمة، سيتعين علينا اختيار اللغات لتجميع الخدمات فيها. يتم إجراء هذا الاختيار بناءً على متطلبات الخدمة والاستخدام، وكذلك راحة المطور. اللغات المختلفة التي يمكن للمرء أن يختارها هي غو، Node.js، بايثون، جافا، C، C #، روبي، سكالا، PHP، إلخ. كما ذكرنا سابقًا، في هذا المثال، سنستخدم Go و Node.js. سنقوم بعد ذلك بإضافة هذه اللغات إلى ملف.protolangs، مع ذكر كل لغة في سطر جديد.

adding languages for microservices

 

الخطوة 3: التجميع

التجميع هو الجزء الأكثر إثارة للاهتمام من هذه العملية بأكملها. في الخطوة 3، سنقوم بتجميع ملف.proto إلى اللغات المحددة، Go و Node.js.

يأتي Protocol Buffer مع أداة سطر أوامر تسمى «protoc»، والتي تجمع تعريف الخدمة للاستخدام. ولكن بالنسبة لكل لغة، سيتعين علينا تنزيل المكونات الإضافية وتثبيتها. يمكن تحقيق ذلك باستخدام dockerfile.

وبالتحديد هو ملف docker يتضمن كل هذا وهو متاح للجميع. يحتوي على «مترجم بروتو» مع دعم لجميع اللغات وميزات إضافية مثل التوثيق والمدقق وحتى خادم REST Proxy الذي تحدثنا عنه في الخطوة 1.

على سبيل المثال،

$ docker run -v `pwd`: /defs أي/بروتوك-كل -f myproto.proto -l روبي

وهي تقبل ملف.proto و لغة، وكلاهما لدينا بالفعل. فيما يلي برنامج نصي بسيط لـ bash سيتم تكراره عبر مجلد خدماتنا، والتقاط ملف service.proto لتجميعه إلى اللغات الموجودة في ملف.protolangs.

#! /بين/باش صدى «البدء... « مجموعة x repo= «pwd`/repo» وظيفة: أدخل DIR { كرر «إدخال دولار واحد» دفعت $1 >/dev/null } وظيفة LeavDir { كرر «الخروج» popd > /dev/null } وظيفة كومبلي/بروتو { بالنسبة لك في */؛ do إذا؛ ثم أثناء القراءة الطويلة؛ الكلاب target=$ {dir%/*} middir -p $repo/$lang rm -rf $repo/$LANG/$الهدف middir -p $repo/$lang/$target mkdir -p $repo/$lang/$target/doc صدى "التحويل البرمجي لـ $lang» docker run -v `pwd`: /defs نامي/protoc-all -f $target/service.proto -l $lang --with-docs --lint $ (&& echo «--with-typescript» || echo «--with-validator») cp -R gen/pb-$lang/$target/* $repo/$lang/$target cp -R gen/pb-$lang/doc/* $repo/$lang/$target/doc طراز سودو رام جي آر إف تم القيام به < $dir/.protolangs fi تم } تجميع الوظائف { صدى «بدء البناء» متوسط - $ REPO لخدمتك في الخدمات/؛ الكلاب أدخل DIR $dir كومبي/بروتو $dir اترك دير تم } امتثل

 

  • تقوم البرامج النصية بتشغيل حلقة لكل مجلد في /خدمات.
  • ثم تلتقط . بروتولانج قم بملفها وتكرارها مرة أخرى مع كل لغة من اللغات المكتوبة في المجلد.
  • ثم يتم تجميعها خدمة. بروتو مع اللغة.
  • يقوم عامل الإرساء بإنشاء الملفات في مجلد gen/pb- {language}.
  • نقوم ببساطة بنسخ المحتوى إلى مجلد repos/ {language}/{servicename}.

نقوم بعد ذلك بتشغيل البرنامج النصي:

$ chmod +x generate.sh

$. /genetare.sh

يظهر الملف الذي تم إنشاؤه في /إعادة شراء مجلد.

نصيحة: يمكنك استضافة هذه التعريفات في مستودع، واستخدام البرنامج النصي الذي تم إنشاؤه في CI/CD Pipeline لأتمتة هذه العملية.

Microservice node file

يشكل service_pb الذي تم إنشاؤه بنجاح لكل من Node.js و Go، جنبًا إلى جنب مع بعض المستندات والمدققين، رمز اللوحة المعيارية لخادمنا وعملائنا الذين نحن على وشك إنشاءهم.

** كما تمت مناقشته سابقًا، إذا كنت لا تريد استخدام العميل وتريد واجهات برمجة تطبيقات ريست-جسون بدلاً من ذلك، يمكنك إنشاء وكيل REST عن طريق إضافة علامة واحدة في ألا وهو بروتوكول الكل ملف عامل الإرساء، بمعنى آخر. — مع بوابة. لهذا سيتعين علينا إضافة مسارات api في ملفاتنا الأولية. ألق نظرة على هذه لمزيد من المعلومات. الآن، قم بتشغيل هذه البوابة وسيكون خادم REST Proxy جاهزًا لخدمة خادم gRPC.

 

نصيحة: يمكنك أيضًا استضافة هذا protorepo على github كمستودع. يمكنك الحصول على ريبو واحد لجميع التعريفات في مؤسستك، بنفس الطريقة التي تستخدمها Google.

 

الخطوة 4: خادم gRPC والعميل

الآن بعد أن أصبح لدينا رمز service_pb لـ Go و Node.js، يمكننا استخدامه لإنشاء خادم وعميل. بالنسبة لكل لغة، سيكون الرمز مختلفًا قليلاً، بسبب الاختلافات في اللغات. لكن المفهوم سيبقى كما هو.

بالنسبة للخوادم: سيتعين علينا تنفيذ وظائف RPC.

للعملاء: سيتعين علينا استدعاء وظائف RPC.

 

يمكنك رؤية كود gRPC لجميع اللغات هنا. باستخدام بضعة أسطر فقط من التعليمات البرمجية، يمكننا إنشاء خادم ومع عدد أقل من أسطر التعليمات البرمجية يمكننا إنشاء عميل.

 

الخادم (Go):
الحزمة الرئيسية استيراد ( «السياق» «إف إم تي» «سجل» «شبكة» مرحبا بالعالم «github.com/rohan-luthra/service-helloworld-go/helloworld» «google.golang.org/grpc» ) اكتب بنية الخادم { } func (*الخادم) هيلوورلد (سياق ctx، طلب *HelloWorld.request) (*helloWorld.response، خطأ) { الاستجابة: = & مرحبًا بالعالم. الاستجابة { الرسالة: «مرحبًا بالعالم من go grpc»، } استجابة الإرجاع، لا شيء } الوظيفة الرئيسية () { العنوان: = «0.0.0. 0:50051» القائمة، الخطأ: = net.listen («tcp»، العنوان) إذا أخطأت! = لا شيء { log.fatalf («خطأ %v»، خطأ) } fmt.printf («الخادم يستمع إلى %v... «، العنوان) s: = grpc. خادم جديد () مرحبا بالعالم. سجل خادم (خوادم وخادم خدمة هيلو وورلد {}) s.serve (القائمة) }

 

 

 

كما ترى، قمنا باستيراد service.pb.go الذي تم إنشاؤه بواسطة البرنامج النصي shell الخاص بنا. ثم قمنا بتطبيق وظيفة HelloWorld - التي تقوم بإرجاع الاستجابة «مرحبًا بالعالم من go grpc». وبالتالي إنشاء خادم gRPC.

 

العميل (Node.js):
var hellowword = require ('). /helloworld/service_pb ')؛ خدمات var = require ('). /helloworld/service_grpc_pb ')؛ var grpc = مطلوب ('grpc')؛ الوظيفة الرئيسية () { عميل var = خدمات جديدة. مرحبًا بعميل الخدمة العالمية ('المضيف المحلي: 50051'، بيانات اعتماد grpc.createinsecure ())؛ طلب var = كلمة الترحيب الجديدة. request ()؛ مستخدم السيارة؛ إذا (process.argv. الطول >= 3) { المستخدم = process.argv [2]؛ } وإلا { المستخدم = «العالم»؛ } client.helloWorld (طلب، وظيفة (خطأ، استجابة) { if (err) console.log ('خطأ عميل العقدة: '، خطأ) آخر console.log ('رسالة عميل العقدة: '، response.getMessage ())؛ })؛ } رئيسي ()؛

 

لقد قمنا باستيراد ملف service_pb.js الذي تم إنشاؤه بواسطة برنامج shell النصي الخاص بنا. أضف عنوان خادم gRPC واستدعي وظيفة HelloWorld واستجابة الإخراج إلى وحدة التحكم.

 

اختبر الكود

قم بتشغيل الخادم وتأكد من أن الكود يعمل.

Testing code Microservice

الآن بعد تشغيل الخادم الخاص بنا، دعنا نجري مكالمة من عميل Node.js الخاص بنا:

Testing Node.js

*تجاهل التحذير.

 

عندما نتلقى إخراج وحدة التحكم «hello world from go grpc»، يمكننا أن نستنتج أن كل شيء سار على النحو المتوقع.

وبالتالي، نجحنا في إنشاء خادم gRPC وعميل بتعريف أولي واحد ونص برمجي. كان هذا مثالًا بسيطًا لمكالمة RPC تعرض نص «hello world». ولكن يمكنك فعل أي شيء تقريبًا به. على سبيل المثال، يمكنك إنشاء خدمة CRUD المصغرة التي تقوم بإضافة مكالمات RPC أو الحصول عليها أو تحديثها أو عملية من اختيارك. عليك فقط تعريفه مرة واحدة وتشغيل البرنامج النصي shell. يمكنك أيضًا الاتصال بخدمة واحدة من أخرى، من خلال إنشاء عملاء أينما تريد أو بأي لغة تريدها. هذا مثال على بنية الخدمات المصغرة المثالية.

 

ملخص

آمل أن تكون هذه المدونة قد ساعدتك في إنشاء بنية خدمات مصغرة باستخدام مخازن البروتوكول المؤقتة و gRPC وملف docker ونص shell فقط. هذه البنية مستقلة عن اللغة مما يعني أنها تناسب لغات برمجة متعددة. علاوة على ذلك، فهو أسرع بـ 7 مرات تقريبًا من خادم REST التقليدي، مع مزايا إضافية للتوثيق والتحقق من الصحة.

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

عليك فقط اتباع هذه الخطوات عند إنشاء خدمة مصغرة جديدة:

  1. حدد الخدمة الخاصة بك
  2. حدد اللغات
  3. قم بالتجميع، أي تشغيل البرنامج النصي shell (آليًا - يمكن إجراؤه على خط أنابيب CI/CD)
  4. أخيرًا، قم بترميز الخوادم والعملاء.
  5. انشر بالطريقة التي تريدها (اقتراح: استخدم حاويات docker)

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

يمكنك العثور على كود الريبو بالكامل هنا.

 

المكافأة:

يمكنك أيضًا نشر الملفات الأولية التي تم إنشاؤها لخدمة ما كحزم لكل لغة، على سبيل المثال Node.js - npm، Python - pip، golang - GitHub، Java - Maven وما إلى ذلك. اركض»تثبيت npm هيلوورلد بروتو» لاستدعاء ملفات.pb. وإذا قام شخص ما بتحديث تعريف Proto، فما عليك سوى تشغيل»تحديث npm هيلوورلد بروتو».

لم يتم العثور على أية عناصر.

مدونات ذات صلة