الأنظمة الموزعة تحيط بنا في كل مكان اليوم. مثالهم الأبرز هو الإنترنت الذي يستضيف شبكة الويب العالمية. غالبًا ما يتم توزيع بيئة الحوسبة في أنظمة الحوسبة للمؤسسات أيضًا ، حيث تربط الخدمات المختلفة بالموارد البشرية والإدارات المالية وأنظمة إدارة الأصول. يتم استضافة العديد من التطبيقات في السحابة. أخيرًا ، تعتمد الهندسة والحوسبة العلمية على نطاق واسع اليوم اعتمادًا كبيرًا على المجموعات من أجل موازاة عبء العمل. وتناقش هذه المواضيع في محاضرة الحوسبة الموزعة. في هذا المستودع ، يمكنك العثور على الأمثلة العملية التي أستخدمها في الدورة التدريبية.
مآخذ
شركة
في جافا
HTML و CSS و JavaScript
جافا servlets
أمثلة قابلة للنشر
HTTP Proxy servlet
صفحات Javaserver
أمثلة قابلة للنشر
قائم بذاته JSPs
جافا RMI
XML
أمثلة لمستندات XML والمعايير ذات الصلة
أمثلة لمعالجة XML مع Java
خدمات الويب
JSON RPC
رسالة تمرير الواجهة
هادوب
كل من الروابط أعلاه يقودك إلى دليل فرعي يحتوي على مجموعة من الأمثلة. يحتوي كل دليل فرعي على ملف README.md الخاص به مع أوصاف مفصلة.
نظرًا لأنني أستخدم أيضًا نفس الرمز في الشرائح الخاصة بي ، فهناك بعض التعليقات الخاصة مثل //(*@serverBox{2)}@*) للتنسيق في رموزاتي ... يمكنك تجاهلها بأمان ^_ ^
مفهوم هذه الدورة هو أننا نريد أن نفهم كيف تعمل بيئات تطبيق الويب الموزعة على الويب وتوزيعها. نريد أن نفعل ذلك من خلال البدء في استكشاف كيفية التواصل عبر شبكة في أدنى مستوى من التجريد (عادةً) متاح للمبرمجين ، واجهة برمجة تطبيقات المقبس. من هناك ، نحن نعمل في طريقنا إلى أعلى مستويات من التجريد خطوة بخطوة ، أي API أبسط وأكثر قوة على قمة بعضها البعض (وتستند في نهاية المطاف في مآخذ). وبهذه الطريقة ، سوف نكتسب فهمًا قويًا لكيفية عمل التطبيقات الموزعة وعمل الويب. سنكون قادرين على إلقاء نظرة على موقع ويب على الفور وفهمًا تقريبيًا لكيفية عمله ، وصولاً إلى المكسرات والبراغي. لكل مستوى من المستويات التي نستكشفها ، نتعلم دائمًا تقنيات المثال.
كما قيل ، نبدأ في الأسفل: الاتصالات في الأنظمة الموزعة اليوم عادة ما تعتمد على UDP أو TCP. يتم الوصول إلى كلا البروتوكولات عبر واجهة برمجة تطبيقات المقبس ، حيث نقدم أمثلة في كل من C و Java. كجزء من هذه الأمثلة ، نوضح أيضًا كيف يمكن ترميز النص في Java وكيفية إنشاء خوادم يمكنها معالجة طلبات متعددة بالتوازي. وبالتالي ، فإن المقابس هي أساس التطبيقات الموزعة ، وهو أدنى مستوى قد يضطر به المبرمج إلى العمل.
نحن الآن قادرون على فهم عمليات الاتصال الأساسية الجارية في أي شبكة كمبيوتر حالية والإنترنت تقريبًا. سوف نستخدم هذا الفهم للتحقيق في كيفية تقديم المؤسسة أو المؤسسة إلى العالم الخارجي عبر موقع ويب. نريد أن نفهم التقنيات اللازمة لبناء موقع ويب يمكنه التفاعل ديناميكيًا مع المستخدم.
تعتمد شبكة الويب العالمية على ثلاثة أعمدة: HTTP و HTML/CSS/JavaScript و URL. HTTP ، بروتوكول نقل النص المفرط ، هو بروتوكول مستند إلى النص للاستعلام عن موارد يتم نقله عادةً عبر اتصالات TCP. في الواقع ، نحن نقدم بالفعل تطبيقات مثال لكل من الخادم (خادم الويب) وجانب عميل العميل (متصفح الويب) من اتصال HTTP باستخدام مآخذ (وحتى خادم ويب متوازي صغير. نوفر بعد ذلك بعض الأمثلة البدائية لـ HTML و CSS و JavaScript.
تطبيق HTTP على أساس مآخذ التعقيد معقد للغاية. مآخذ تسمح لنا بالوصول إلى TCP. ما نود أن يكون لدينا واجهة برمجة تطبيقات أنيقة مماثلة للوصول إلى HTTP (المستوى الأعلى التالي من التجريد). واحدة من هذه التكنولوجيا هي Java Servlets. يتم استخدام Servlets لتنفيذ جانب الخادم لمحادثة HTTP. Servlet هو فئة فرعية من فئة Java الخاصة التي تنفذ أساليب المعالج لتفاعلات HTTP المختلفة ("طرق HTTP"). يتم استدعاء هذه الطرق بواسطة حاوية servlet ، والتنفيذ الفعلي للخادم. لذلك يمكننا التركيز تمامًا على منطق التطبيق ولا نحتاج إلى القلق بشأن تفاعل البروتوكول نفسه. نحن نقدم مجموعة واسعة من الأمثلة لـ Java Servlets ، كلاهما أمثلة قابلة للنشر بالإضافة إلى خدمة وكيل HTTP المستقلة. لذلك مع Servlets Java ، يمكننا إنشاء مكونات الخادم التي يمكنها التفاعل ديناميكيًا مع عميل HTTP (مثل متصفح الويب). هذا يعني أنه يمكننا إنشاء محتويات صفحة ويب ديناميكيًا عندما يطلبها المتصفح. ومع ذلك ، فإن بناء مواقع ويب ديناميكية كاملة حيث أن Java Servlets هو مرة أخرى مرهقة للغاية ، حيث أن Servlets هي فصول Java بينما صفحات الويب هي HTML ، والتي سنكتبها بعد ذلك في شكل ثوابت سلسلة ليتم كتابتها إلى إخراج servlet.
المستوى الأعلى التالي من التجريد هو صفحات Javaserver (JSPs) ، والتي تسمح لنا بكتابة صفحات HTML (أو تنسيقات نصية أخرى) وتضمين رمز مصدر Java فيه. ثم يتم تقديم الصفحات مرة أخرى بواسطة حاوية servlet. كلما تم إرسال صفحة إلى عميل ، يتم تنفيذ رمز Java المضمن لأول مرة على جانب الخادم (وقد يولد إخراج إضافي). عند الفحص الدقيق ، يمكننا أن نجد أن JSPs هي في الواقع "خاصة" servlets: عندما يتم الوصول إلى JSP لأول مرة ، تنشئ حاوية Servlet ديناميكيا رمز المصدر لخدمة Java المقابلة. يتم تجميع هذا servlet وتحميله وتنفيذه لإنشاء المحتوى الديناميكي للصفحة ليتم إرساله إلى العميل. يصبح كل ما كان "نصًا" في JSP سلسلة داخل Servlet مكتوبة إلى استجابة HTTP الخاصة بـ Servlet. يتم نسخ كل ما كان "رمز" في JSP مباشرة في أساليب معالج servlet. JSPs هي وسيلة أكثر طبيعية لإنشاء ناتج النص (HTML) ديناميكيًا وتقديمه للعميل. الآن ، لدينا فهم قوي لكيفية إنشاء المحتويات الديناميكية في الويب ، وكيف يمكن للمستخدم التفاعل مع تطبيق الويب عبر نماذج الويب باستخدام متصفحها ، وكيف يمكننا تحقيق الجلسات.
على الرغم من أن هذه التقنيات تسمح لنا ببناء عرض ديناميكي "خارج" للشركة ، فإن الطريقة التي تقدم بها الشركة نفسها في الويب ، نستكشف الآن عرض "الداخل" لبيئة الحوسبة الموزعة للمؤسسة. هنا الهدف هو بناء بيئة يمكن من خلالها ربط الطلبات من الإدارات المختلفة (الإدارة المالية ، الموارد البشرية ، إدارة الأصول ، ...) مع بعضها البعض بطريقة آمنة في المستقبل.
الخطوة الأولى على هذا الطريق إلى حوسبة المؤسسة هي مكالمات الإجراءات عن بُعد (RPCs) ، والتي نستكشفها على مثال Java Remote Method Invocation (RMI). توضح أمثلةنا كيف يمكن الوصول إلى كائن من تطبيق واحد تم استضافته على الكمبيوتر من برنامج آخر يعمل على جهاز كمبيوتر آخر. هذا يقتربنا بالفعل من تحقيق التطبيقات الموزعة المترابطة على الشبكة. ومع ذلك ، لا تزال Java RMI تقنية خاصة بـ Java وبروتوكولها ثنائي. نود تنفيذ تطبيقاتنا الموزعة بطريقة مستقلة عن النظام الأساسي ، من خلال استخدام بروتوكولات واضحة للغاية ومحددة جيدًا وسهلة الفهم.
إن سعينا لمثل هذه التكنولوجيا يجبرنا أولاً على اتخاذ قرار من التعرف على لغة الترميز القابلة للتمديد (XML. XML هو تنسيق توثيق ذاتي لتخزين هياكل البيانات المعقدة في النص. إنه مشابه لـ HTML ، ولكن دون أي تجهيزات محددة مسبقًا.
ثم نناقش خدمات الويب. خدمات الويب هي الأساس الأساسي للعديد من أنظمة الحوسبة الموزعة للمؤسسات والبنية الموجهة نحو الخدمات. يتم استدعاءها باستخدام بروتوكول الصابون المستند إلى XML عادةً عبر HTTP. يتم وصف الواجهة والوظائف المقدمة عبر لغة وصف خدمة الويب (WSDL) ، وهو معيار XML آخر. استنادًا إلى ما نعرفه بالفعل ، يمكننا الآن إرسال بيانات XML إلى Servlet Java عبر HTTP-Post ، وتوضع هذه البيانات باستخدام تقنيات معالجة Java XML هذه ، واستخدام نفس التقنيات لإنشاء مستند إخراج XML ، وإرسال هذا إلى الوراء كرد على استجابة Java Servlet. في الواقع ، يمكننا حتى استخدام صفحات Javaserver لهذا الغرض. ومع ذلك ، هناك مرة أخرى طريقة أبسط: يمكننا إنشاء خدمات ككائنات Java بسيطة ونشرها على خادم Apache Axis2/Java. سيجعل الخادم متاحًا عبر الصابون وإنشاء أوصاف WSDL تلقائيًا. يمكن بعد ذلك استخدامها لإنشاء كائنات وكيل لجانب العميل باستخدام ، على سبيل المثال ، Maven. نحن نبحث في هذه التكنولوجيا على عدة أمثلة.
JSON RPC هو نهج آخر استدعاء الإجراء عن بُعد (RPC) (محدد هنا) حيث يتم ترميز هياكل البيانات المتبادلة في تدوين كائن JavaScript (JSON). يتم تبادل البيانات عبر HTTP أو TCP. تشبه JSON RCPs خدمات الويب ، ولكنها مصممة لتكون أكثر ربحًا. نناقش مرة أخرى عدة أمثلة.
كآخر حالة استخدام مهمة للحوسبة الموزعة ، فإننا نعتبر كيف يمكن تحقيق الحسابات الموزعة على نطاق واسع. هناك حاجة إلى مثل هذه الحسابات في العديد من السيناريوهات ، بدءًا من عمليات المحاكاة في الهندسة إلى استخراج البيانات ومعالجتها في المؤسسات.
نركز الآن على كيفية استخدام قوة الحوسبة للمجموعات الضخمة للحسابات العلمية والهندسية على نطاق واسع. غالبًا ما تنقسم هذه الحسابات الكبيرة أو المحاكاة إلى عدة مشكلات فرعية أصغر. ثم يتم حل هذه المشكلات الأصغر بشكل تعاوني بواسطة مؤشرات ترابط أو عمليات متعددة بالتوازي. يتضمن ذلك غالبًا تبادل الرسائل على فترات زمنية منتظمة بين العمليات التي تعمل على المشكلات الفرعية ذات الصلة الوثيقة. من الواضح أن خدمات الويب أو Java Servlets أو حتى Java و Protocol HTTP ، ستكون التقنيات الخاطئة لذلك: بالنسبة للحسابات الواسعة النطاق ، نريد أن نكون فعالة قدر الإمكان مع أقل قدر ممكن من النفقات العامة. يتعلق هذا بالاتصال بشكل خاص ، وهو مكلف للغاية وعامل الحد من التسريع الذي يمكننا تحقيقه مع التوزيع. نريد تبادل أنواع البيانات البدائية بكفاءة ونريد استخدام نماذج الاتصال التي لا تدعمها HTTP/TCP ، مثل البث ، البث المتعدد ، والاتصال غير المتزامن. لهذا ، سيكون تطبيق واجهة تمرير الرسالة (MPI) هو الطريقة المفضلة. نستكشف هذه التكنولوجيا بناءً على عدة أمثلة في لغة البرمجة C.
في خطوة أخيرة ، نناقش تقنية تجمع بين القدرة على إنشاء حسابات موزعة واسعة النطاق (من عالم MPI) ودعم الأداة الغنية للنظام الإيكولوجي Java: MapPreduce with Apache Hadoop. MPI هي التكنولوجيا المفضلة إذا كانت الاتصالات مكلفة وبين عنق الزجاجة لتطبيقنا ، والاتصال المتكرر مطلوب بين العمليات التي تحل المشكلات الفرعية ذات الصلة ، والأجهزة المتاحة متجانسة ، ويجب أن يتم تنظيم العمليات في مجموعات أو هياكل طوبولوجية للاستفادة من الكفاءة في التصرفات التي لا تحتاج إلى مبدع من التبادل بين تبخيرها. بيئة التطبيق الموزعة غير المتجانسة. Hadoop ، من ناحية أخرى ، يغطي حالات الاستخدام التي لا يكون فيها الاتصال عنق الزجاجة ، لأن الحساب يستغرق وقتًا أطول بكثير من التواصل (التفكير في التعلم الآلي) ، عندما تكون البيئة غير متجانسة ، لا تحتاج العمليات إلى تنظيم بيانات المدخلات الخاصة بالمواد المتساوية ، حيث يمكن أن يتم إجراء عملية تفتيت ، حيث يمكن أن يتم إجراء عمليات غير متوقعة ( يحتمل أن يكون الضخم (التغلب على مزايا الاتصال على طراز MPI) ، أو حيث تأتي البيانات وينبغي إعادة النتائج إلى التطبيقات الأخرى في البيئة ، على سبيل المثال إلى مداخن خدمة HTTP/Java Servlet/Web. تركز أمثلة Hadoop الخاصة بنا على نمط MapReduce (وهو نوع صغير جدًا يشبه Scatter/Gather/Ender in MPI ، فقط للسيناريو الموضح أعلاه).
الكل في الكل ، ستمنحك هذه الدورة فهمًا تقريبيًا للتقنيات المهيمنة في مجالات مختلفة من الحوسبة الموزعة ، من مواقع الويب الديناميكية عبر أنظمة التطبيقات الموزعة الداخلية ، إلى الحسابات الهندسية والعلمية الموزعة. يتم استكشاف كل حقل بأمثلة عملية وتتمكن من الاختبار واللعب مع العديد من تقنيات المثال.
لكل مثال ، أنا أدرج بشكل صريح البرنامج المطلوب ونناقش كيف يمكن الحصول عليه وتثبيته. هنا أعطي نظرة عامة على مكونات البرامج هذه.
تتم كتابة معظم الأمثلة التي أقدمها بلغة برمجة Java ويمكنها تشغيلها تحت أنظمة تعسفية ، بالنظر إلى أن Java مثبتة. من أجل تجميعها ، تحتاج إلى تثبيت Java JDK. تتطلب أمثلةي Java 7 أو أحدث.
تحت Windows ، تحتاج إلى تنزيل وتثبيت Java من موقع Oracle.
تحت Linux ، يمكنك القيام sudo apt-get install openjdk-7-jdk (حيث يمكنك استبدال 7 بأي إصدار لاحق ، مثل 8 ، إذا أردت)
تم تصميم العديد من أمثلة Java الخاصة بي مع Maven. كل هذه الأمثلة لها ملف pom.xml في مجلد الجذر الخاص بهم. من أجل بنائها ، تحتاج بالتالي إلى تثبيت Maven.
تحت Windows ، تحتاج إلى تنزيل وتثبيت Maven من موقع Apache.
تحت Linux ، يمكنك القيام sudo apt-get install maven .
إذا كنت تستخدم Eclipse (انظر أدناه) ، فلن تحتاج إلى تثبيت Maven لأنه تم دمجه بالفعل في Eclipse.
أوصي Eclipse كبيئة مطور لجميع أمثلة Java في هذا المستودع. يأتي كل مثال Java بالفعل بالفعل مع ملف .project Eclipse ومع Eclipse .settings . يدمج Eclipse كلاً من Maven و Git. هذا يعني أنه يمكنك استنساخ هذا المستودع من داخل Eclipse واستيراد مشاريع Jave مباشرة خلال هذه العملية. إذا قمت بعد ذلك بالنقر بزر الماوس الأيمن على مشاريع Maven واختيار Maven -> Update Project... ، ستقوم Eclipse أيضًا بتنزيل واستخدام جميع المكتبات والتبعيات المطلوبة على النحو المحدد من قبل Maven pom.xml لك.
يمكنك تنزيل Eclipse من موقع Eclipse. أوصي باستخدام ما لا يقل عن Eclipse Mars.1 لدعم Maven و Git الممتاز.
لتشغيل بعض أمثلة Java Servlets و Javaserver ، تحتاج إلى تنزيل خادم Glassfish من موقع التنزيل المقابل. أوصي باستخدام على الأقل Glassfish 4.1.2.
لتشغيل أمثلة خدمة الويب ، ستحتاج إلى تنزيل Apache Axis2/Java من صفحة التنزيل المقابلة. أوصي باستخدام على الأقل AXIS2 1.7.3.
من أجل تجميع الأمثلة المكتوبة في لغة البرمجة C (مثل أمثلة المقابس المستندة إلى C ) ، ستحتاج إلى مترجم C مثل GCC. تحت Linux ، يجب عادةً تثبيته بالفعل ويمكن تثبيته عبر sudo apt-get install gcc . تحت Windows ، ستحتاج إلى تثبيت Mingw ، عادةً عبر مثبت الويب.
تأتي العديد من أمثلة C لنظام التشغيل Windows أو Linux. تتيح لك GCC المتبادل ، أي إذا كنت تستخدم Linux ، فيمكنك تجميع برامج C لنظام التشغيل Windows. لهذا الغرض ، يمكنك أولاً تثبيت sudo apt-get install gcc-mingw-w64-i686 ومن ثم يمكنك استخدام الأمر gcc-mingw-w64-i686 بالطريقة نفسها التي تستخدم بها gcc تحت MINGW.
من أجل إنشاء وتجميع أمثلةنا لاستخدام واجهة تمرير الرسالة (MPI) ، نحتاج إلى تطبيق MPI. نختار mpich.
ضمن Linux ، يمكنك تثبيت الملفات المطلوبة عبر sudo apt-get install mpich libmpich-dev .
ssh و rsync ) من أجل اختبار أمثلة Hadoop الخاصة بنا ، نحتاج الآن إلى إعداد مجموعة Hadoop واحدة. لذلك نتبع الدليل المقدم في http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html. نحتاج إلى تثبيت المتطلبات المسبقة مثل ssh و rsync . في مثال Hadoop ، نقدم دليل التثبيت لـ Hadoop 2.7.2 Linux / Ubuntu. يتلخص في تنزيل وتثبيت Hadoop من أحد المرايا المتوفرة على http://www.apache.org/dyn/closer.cgi/hadoop/common/ ، بالإضافة إلى الإرشادات التعليمية المرتبطة.
هذا العمل له أغراض تعليمية بحتة. إلى جانب كل ما هو مذكور أدناه ، لأي شيء في هذا المستودع ، فرض حالة ترخيص إضافية واحدة: يجب ألا يستخدم المدونة أبدًا لأي شيء قد ينتهك قوانين ألمانيا أو الصين أو الولايات المتحدة الأمريكية. هذا أيضًا يحمل أي ملف أو مورد آخر متوفر هنا.
الأمثلة في هذا المستودع مرخصة بموجب الإصدار 3 ، 29 يونيو 2007 ، 29 يونيو 2007 ، مع الاستثناءات التالية:
كل شيء في الدلائل /javaserverpages /مستقل standalonejspswithjetty و /javaservlets /الوكيل مرخصة بموجب ترخيص Apache v2.0 ويتم اشتقاقه جزئيًا من Project-Jetty-JSP مع حقوق الطبع والنشر (C) 1995-2013 Mort Bay Pty. Ltd.
تأخذ بعض أمثلة Hadoop بعض الإلهام من Maven-Hadoop-Java-Wordcount-Template بواسطة H3ML3T ، والتي لا يتم تقديم معلومات ترخيص. الأمثلة ، بشكل مختلف تمامًا بعدة طرق ، على سبيل المثال في الطريقة التي نبني بها الجرار الدهنية. على أي حال ، تم وصف هذا المشروع الأصلي بشكل جيد في إدخال المدونة هذا.
علاوة على ذلك ، تعتمد كلمة Hadoop الخاصة بنا على مثال حساب الكلمات المعروف لخريطة Hadoop تقليل وظائفها. ويستند إلى الإصدار من قبل Luca Menichetti [email protected] تحت إصدار ترخيص GNU العام 2.