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

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

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

تهيئة بيئة العمل

تثبيت Go

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

$ 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, worldn")
}' > 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 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.github.io/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 مع معلمات اللعبة. يُطلق على المستخدم المصرح له الذي انضم إلى اللعبة، وكذلك منشئ اللعبة، فيما يلي اسم المشاركين في اللعبة.

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

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

إرسال حدث اللعبة

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

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

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

وظائف أطلقت بشكل دوري

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

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

إعلان

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

المصدر: www.habr.com

إضافة تعليق