"ملحمة جديدة". نحن نأكل الفيل في أجزاء


في هذه المقالة ، سأهيئ بيئة عمل لتطوير لعبة "Epics" ، وكذلك سأقسم اللعبة نفسها إلى أجزاء مناسبة للاستخدام في OpenFaaS. سأقوم بكل عمليات التلاعب على Linux ، وسيتم نشر Kubernetes في minikube باستخدام VirtualBox. يوجد في جهازي العامل نواة للمعالج و 12 جيجابايت من ذاكرة الوصول العشوائي ، يمكنني استخدام SSD كقرص نظام. سأستخدم debian 8 كنظام رئيسي للتطوير ، مع تثبيت حزم emac و sudo و git و virtualbox ، وسأقوم بتثبيت الباقي عن طريق التنزيل من GitHub ومصادر أخرى. سنقوم بتثبيت هذه التطبيقات في / usr / local / bin ، ما لم ينص على خلاف ذلك. لنبدأ!


إعداد بيئة العمل


الذهاب التثبيت


اتبع التعليمات من الموقع الرسمي:


$ curl -L0 https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz -o go.tar.gz $ sudo tar -C /usr/local -xzf go.tar.gz $ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile 

تحقق الأداء:


 $ mkdir -p ~/go/src/hello && cd ~/go/src/hello $ echo 'package main import "fmt" func main() { fmt.Printf("hello, world\n") }' > hello.go $ go build $ ./hello hello, world 

تثبيت faas-cli


اتبع التعليمات من الموقع الرسمي:


 $ curl -sSL https://cli.openfaas.com | sudo -E sh x86_64 Downloading package https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli as /tmp/faas-cli Download complete. Running with sufficient permissions to attempt to move faas-cli to /usr/local/bin New version of faas-cli installed to /usr/local/bin Creating alias 'faas' for 'faas-cli'. ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| CLI: commit: 73004c23e5a4d3fdb7352f953247473477477a64 version: 0.11.3 

بالإضافة إلى ذلك ، يمكنك تمكين إكمال bash:


 faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cli 

تثبيت وتكوين Kubernetes


Minikube يكفي للتطوير ، لذلك سنقوم بتثبيته و kubelet في / usr / local / bin ، وسنقوم أيضًا بتثبيت helm لتثبيت التطبيقات:


 $ curl https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -o minikube && chmod +x minikube && sudo mv minikube /usr/local/bin/ $ curl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl -o kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/ $ curl https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz | tar -xzvf - linux-amd64/helm --strip-components=1; sudo mv helm /usr/local/bin 

تشغيل minikube:


 $ minikube start minikube v1.6.2 on Debian 8.11 Automatically selected the 'virtualbox' driver (alternates: []) Downloading VM boot image ... > minikube-v1.6.0.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s > minikube-v1.6.0.iso: 150.93 MiB / 150.93 MiB [-] 100.00% 5.67 MiB p/s 27s Creating virtualbox VM (CPUs=2, Memory=8192MB, Disk=20000MB) ... Preparing Kubernetes v1.17.0 on Docker '19.03.5' ... Downloading kubeadm v1.17.0 Downloading kubelet v1.17.0 Pulling images ... Launching Kubernetes ... Waiting for cluster to come online ... Done! kubectl is now configured to use "minikube" 

نتحقق من:


 $ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6955765f44-knlcb 1/1 Running 0 29m kube-system coredns-6955765f44-t9cpn 1/1 Running 0 29m kube-system etcd-minikube 1/1 Running 0 28m kube-system kube-addon-manager-minikube 1/1 Running 0 28m kube-system kube-apiserver-minikube 1/1 Running 0 28m kube-system kube-controller-manager-minikube 1/1 Running 0 28m kube-system kube-proxy-hv2wc 1/1 Running 0 29m kube-system kube-scheduler-minikube 1/1 Running 0 28m kube-system storage-provisioner 1/1 Running 1 29m 

تثبيت OpenFaaS


يوصي المطورون بإنشاء مساحة اسمين للعمل:


 $ 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.imtqy.com/faas-netes/ "openfaas" has been added to your repositories 

يتمتع المخطط بالقدرة على تعيين كلمة مرور قبل التثبيت ، واستخدامها وحفظ بيانات الوصول في شكل سر k8s:


 $ PASSWORD=verysecurerandompasswordstring $ kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD" secret/basic-auth created 

نشر:


 $ 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 -n openfaas get deployments -l "release=openfaas, app=openfaas" NAME READY UP-TO-DATE AVAILABLE AGE alertmanager 1/1 1 1 114s basic-auth-plugin 1/1 1 1 114s faas-idler 1/1 1 1 114s gateway 1/1 1 1 114s nats 1/1 1 1 114s prometheus 1/1 1 1 114s queue-worker 1/1 1 1 114s 

تحقق الأداء:


 $ 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 مع معلمات اللعبة. المستخدم المخول الذي انضم إلى اللعبة ، وكذلك منشئ اللعبة ، يسمى المشاركين في اللعبة.


عرض أحداث اللعبة


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


إيفاد الحدث اللعبة


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


احصائيات اللعبة


تعمل الوظيفة فقط للمشاركين في اللعبة ، وتُظهر حالة اللعبة ، وقائمة وعدد اللاعبين (الأسماء المستعارة) ، والأدوار وحالتهم (التحرك من عدمه) ، وكذلك المعلومات الأخرى. بالنسبة للوظيفة السابقة ، كل شيء يعمل فقط للمشاركين في اللعبة.


تشغيل دوريا وظائف


إذا لم يتم تشغيل اللعبة لبعض الوقت المحدد أثناء إنشاء اللعبة ، فستتم إزالتها تلقائيًا من قائمة الألعاب النشطة باستخدام وظيفة المسح.


مهمة دورية أخرى هي التبديل الإجباري لوضع اللعب من الليل إلى النهار والعودة للألعاب التي لم يحدث فيها ذلك أثناء الدور (على سبيل المثال ، اللاعب الذي يحتاج إلى الاستجابة لحدث اللعبة لم يرسل قراره لأي سبب).


إعلان


  • مقدمة
  • إعداد بيئة التطوير ، وتقسيم المهمة إلى وظائف
  • العمل على الخلفية
  • عمل الواجهة الأمامية
  • إعداد CI \ CD ، منظمة الاختبار
  • بدء جلسة تجريبية للعبة
  • النتائج

Source: https://habr.com/ru/post/ar482752/


All Articles