سأقوم في هذه المقالة بتهيئة بيئة عمل لتطوير لعبة "Epics"، كما سأقوم بتقسيم اللعبة نفسها إلى أجزاء مناسبة للاستخدام في OpenFaaS. سأقوم بجميع عمليات التلاعب على Linux، وسأقوم بنشر Kubernetes في minikube باستخدام VirtualBox. يحتوي جهاز العمل الخاص بي على نواتي معالج وذاكرة وصول عشوائي (RAM) سعة 2 جيجابايت، وأستخدم SSD كقرص النظام. سأستخدم debian 12 كنظام التطوير الرئيسي الخاص بي، مع تثبيت حزم emacs وsudo وgit وvirtualbox، وسيتم تثبيت كل شيء آخر عن طريق التنزيل من GitHub ومصادر أخرى. سنقوم بتثبيت هذه التطبيقات في /usr/local/bin ما لم ينص على خلاف ذلك. هيا بنا نبدأ!
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created
إضافة مستودع للرأس:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories
يتمتع المخطط بالقدرة على تعيين كلمة مرور قبل التثبيت، فلنستخدمها ونحفظ بيانات الوصول باعتبارها سر k8s:
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
Update Complete. Happy Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" does not exist. Installing it now.
NAME: openfaas
LAST DEPLOYED: Fri Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" successfully rolled out
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Forwarding from 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Calling the OpenFaaS server to validate the credentials...
Handling connection for 8080
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
credentials saved for admin http://127.0.0.1:8080
$ faas-cli list
Function Invocations Replicas
تثبيت Mongodb
نقوم بتثبيت كل شيء باستخدام الدفة:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LAST DEPLOYED: Fri Dec 25 11:15:11 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
MongoDB can be accessed via port 27017 on the following DNS name from within your cluster:
mongodb-1577466908.default.svc.cluster.local
To get the root password run:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
To connect to your database run the following command:
kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD
نتحقق من:
kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
If you don't see a command prompt, try pressing enter.
> db.version();
4.0.14
اضغط على ctrl+D للخروج من الحاوية.
إعداد إيماكس
من حيث المبدأ، تم تكوين كل شيء بالفعل وفقا ل هذا المقال، لذلك لن أخوض في التفاصيل.
تقسيم اللعبة إلى وظائف
يتم التفاعل مع الوظائف عبر بروتوكول http، ويتم توفير المصادقة الشاملة بين الوظائف المختلفة بواسطة JWT. يتم استخدام Mongodb لتخزين الرموز، بالإضافة إلى حالة اللعبة وبيانات اللاعب وتسلسل تحركات جميع الألعاب والمعلومات الأخرى. دعونا نلقي نظرة فاحصة على الميزات الأكثر إثارة للاهتمام.
التسجيل
إدخال هذه الوظيفة هو JSON مع اسم اللعبة وكلمة المرور. عند استدعاء هذه الوظيفة، يتم التحقق من عدم وجود هذا الاسم المستعار في قاعدة البيانات، وإذا نجح التحقق، فسيتم إدراج الاسم المستعار وتجزئة كلمة المرور في قاعدة البيانات. التسجيل مطلوب للمشاركة بنشاط في اللعبة.
مدخل
إدخال الوظيفة هو JSON مع اسم مستعار للعبة وكلمة مرور؛ إذا كان هناك لقب في قاعدة البيانات وتم التحقق من كلمة المرور بنجاح باستخدام الاسم المحفوظ مسبقًا في قاعدة البيانات، فسيتم إرجاع JWT، والذي يجب تمريره إلى وظائف أخرى عندما تكون كذلك مُسَمًّى. يتم أيضًا إدراج سجلات الخدمة المختلفة في قاعدة البيانات، على سبيل المثال، آخر وقت لتسجيل الدخول، وما إلى ذلك.
عرض قائمة الألعاب
يمكن لأي مستخدم غير مصرح له أن يطلب قائمة بجميع الألعاب باستثناء الألعاب النشطة. يرى المستخدم المعتمد أيضًا قائمة بالألعاب النشطة. نتيجة الوظيفة هي JSON الذي يحتوي على قوائم الألعاب (معرف اللعبة، الاسم الذي يمكن للإنسان قراءته، وما إلى ذلك).
خلق لعبة
تعمل الوظيفة فقط مع المستخدمين المصرح لهم؛ ويتم قبول الحد الأقصى لعدد اللاعبين عند الإدخال، بالإضافة إلى معلمات اللعبة (على سبيل المثال، الشخصيات التي سيتم تنشيطها في هذه اللعبة، والحد الأقصى لعدد اللاعبين، وما إلى ذلك). معلمة منفصلة للعبة هي وجود كلمة مرور للانضمام، والتي تتيح لك إنشاء ألعاب غير عامة. بشكل افتراضي، يتم إنشاء لعبة عامة. نتيجة الوظيفة هي JSON، الذي يحتوي على حقل نجاح الإنشاء، ومعرف اللعبة الفريد، ومعلمات أخرى.
الانضمام إلى لعبة
تعمل الوظيفة فقط مع المستخدمين المصرح لهم، والإدخال هو معرف اللعبة وكلمة المرور الخاصة بها، وإذا كانت هذه لعبة غير عامة، فإن الإخراج هو JSON مع معلمات اللعبة. يُطلق على المستخدم المصرح له الذي انضم إلى اللعبة، وكذلك منشئ اللعبة، فيما يلي اسم المشاركين في اللعبة.
عرض أحداث اللعبة
يمكن لأي مستخدم غير مصرح له أن يطلب قائمة أحداث الألعاب غير النشطة، ويمكن للمستخدم المصرح له الحصول على قائمة أحداث أي لعبة نشطة. يمكن أن تكون المعلمة الإضافية للوظيفة هي رقم الحدث الذي يمتلكه المستخدم بالفعل. في هذه الحالة، سيتم إرجاع الأحداث التي حدثت لاحقًا فقط إلى القائمة. من خلال تشغيل هذه الوظيفة بشكل دوري، يشاهد المستخدم المعتمد ما يحدث في اللعبة. تقوم هذه الوظيفة أيضًا بإرجاع طلب إجراء، والذي يمكن للمستخدم الرد عليه باستخدام وظيفة إرسال حدث اللعبة.
إرسال حدث اللعبة
تعمل الوظيفة فقط للمشاركين في اللعبة: من الممكن بدء اللعبة، أو القيام بخطوة، أو التصويت، أو كتابة رسالة نصية يتم عرضها في قائمة أحداث اللعبة، وما إلى ذلك.
يبدأ المستخدم المعتمد الذي أنشأ اللعبة بتوزيع الأدوار على جميع المشاركين في اللعبة، بما في ذلك أنفسهم، ويجب عليهم تأكيد دورهم باستخدام نفس الوظيفة. بمجرد تأكيد جميع الأدوار، تتحول اللعبة تلقائيًا إلى الوضع الليلي.
إحصائيات اللعبة
تعمل الوظيفة فقط للمشاركين في اللعبة، فهي تعرض حالة اللعبة وقائمة اللاعبين وعددهم (الأسماء المستعارة) والأدوار وحالتهم (تم النقل أم لا)، بالإضافة إلى معلومات أخرى. كما هو الحال مع الوظيفة السابقة، كل شيء يعمل فقط للمشاركين في اللعبة.
وظائف أطلقت بشكل دوري
إذا لم يتم تشغيل اللعبة لبعض الوقت المحدد عند إنشاء اللعبة، فستتم إزالتها تلقائيًا من قائمة الألعاب النشطة باستخدام الوظيفة الواضحة.
مهمة دورية أخرى هي التبديل القسري لوضع اللعبة من الليل إلى النهار والعودة للألعاب التي لم يحدث هذا لها أثناء الدور (على سبيل المثال، اللاعب الذي يحتاج إلى الرد على حدث لعبة لم يرسل حله لسبب ما ).