"Neue Epen". Wir essen den Elefanten in Teilen


In diesem Artikel werde ich eine Arbeitsumgebung für die Entwicklung des Spiels "Epics" einrichten und das Spiel in Teile aufteilen, die für die Verwendung in OpenFaaS geeignet sind. Ich werde alle Manipulationen unter Linux durchführen, Kubernetes werden in Minikube mit VirtualBox bereitgestellt. Auf meiner Arbeitsmaschine befinden sich 2 Prozessorkerne und 12 GB RAM. Ich verwende SSD als Systemdatenträger. Ich werde Debian 8 als das Hauptsystem für die Entwicklung verwenden, mit installierten Paketen für Emacs, Sudo, Git und Virtualbox. Den Rest installiere ich durch Herunterladen von GitHub und anderen Quellen. Wir werden diese Anwendungen in / usr / local / bin installieren, sofern nicht anders angegeben. Fangen wir an!


Vorbereitung des Arbeitsumfelds


Installation starten


Folgen Sie den Anweisungen der offiziellen Website:


$ 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 

Überprüfen Sie die Leistung:


 $ 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 

Installieren Sie faas-cli


Folgen Sie den Anweisungen der offiziellen Website:


 $ 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 

Zusätzlich können Sie die Bash-Vervollständigung aktivieren:


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

Installieren und konfigurieren Sie Kubernetes


Minikube ist genug für die Entwicklung, also werden wir es installieren und in / usr / local / bin kubelet, wir werden auch helm installieren, um Anwendungen zu installieren:


 $ 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 starten:


 $ 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" 

Wir prüfen:


 $ 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 

Installieren Sie OpenFaaS


Entwickler empfehlen, zwei Namespaces für die Arbeit zu erstellen:


 $ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml namespace/openfaas created namespace/openfaas-fn created 

Fügen Sie ein Repository für helm hinzu:


 $ helm repo add openfaas https://openfaas.imtqy.com/faas-netes/ "openfaas" has been added to your repositories 

Die Tabelle bietet die Möglichkeit, vor der Installation ein Passwort festzulegen, dieses zu verwenden und die Zugangsdaten in Form eines k8s-Geheimnisses zu speichern:


 $ 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 

Bereitstellung:


 $ 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" 

Führen Sie nach einiger Zeit den vorgeschlagenen Befehl aus:


 $ 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 

Überprüfen Sie die Leistung:


 $ 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 

Installieren Sie Mongodb


Wir setzen alles mit Helm:


 $ 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 

Wir prüfen:


 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 

Drücken Sie Strg + D, um den Container zu verlassen.


Emacs-Setup


Im Prinzip war für diesen Artikel bereits alles konfiguriert, daher werde ich nicht im Detail malen.


Das Spiel in Funktionen aufteilen


Die Interaktion mit Funktionen erfolgt über das http-Protokoll, die Ende-zu-Ende-Authentifizierung zwischen verschiedenen Funktionen wird von JWT bereitgestellt. Zum Speichern von Token sowie des Spielzustands, der Spielerdaten, der Bewegungssequenz aller Spiele und anderer Informationen wird mongodb verwendet. Schauen wir uns die interessantesten Features genauer an.


Registrierung


Am Eingang dieser Funktion steht JSON mit einem Spiel-Alias ​​und einem Passwort. Wenn diese Funktion aufgerufen wird, wird das Fehlen dieses Alias ​​in der Datenbank überprüft und bei erfolgreicher Überprüfung werden der Alias ​​und der Kennwort-Hash in die Datenbank eingefügt. Für die aktive Teilnahme am Spiel ist eine Registrierung erforderlich.


Einloggen


Bei der Eingabe der Funktion steht JSON mit einem Spiel-Alias ​​und einem Passwort. Wenn ein Alias ​​in der Datenbank vorhanden ist und das Passwort erfolgreich mit dem zuvor in der Datenbank gespeicherten Passwort verifiziert wurde, wird das JWT zurückgegeben, das beim Aufruf an andere Funktionen übergeben werden muss. In die Datenbank werden auch verschiedene Serviceaufzeichnungen eingefügt, z. B. der Zeitpunkt der letzten Anmeldung usw.


Spieleliste anzeigen


Jeder nicht autorisierte Benutzer kann eine Liste aller Spiele mit Ausnahme der aktiven Spiele anfordern. Ein autorisierter Benutzer sieht auch eine Liste der aktiven Spiele. Das Ergebnis dieser Funktion ist JSON mit einer Liste von Spielen (Spielekennung, lesbarer Name usw.).


Game-Erstellung


Die Funktion funktioniert nur mit autorisierten Benutzern, die maximale Anzahl von Spielern sowie Spielparameter (z. B. welche Charaktere in diesem Spiel aktiviert werden sollen, maximale Anzahl von Spielern usw.) werden bei der Eingabe akzeptiert. Ein separater Parameter des Spiels ist das Vorhandensein eines Passworts für den Beitritt, mit dem Sie nicht öffentliche Spiele erstellen können. Standardmäßig wird ein öffentliches Spiel erstellt. Das Ergebnis der Funktionsausführung ist JSON, in dem sich ein Erstellungserfolgsfeld, eine eindeutige Kennung für das Spiel sowie andere Parameter befinden.


Am Spiel teilnehmen


Die Funktion arbeitet nur mit berechtigten Benutzern, am Eingang - der Kennung des Spiels und dessen Passwort, wenn es sich um ein nicht öffentliches Spiel handelt, am Ausgang - JSON mit den Parametern des Spiels. Der autorisierte Benutzer, der dem Spiel beigetreten ist, sowie der Ersteller des Spiels werden dann die Teilnehmer des Spiels genannt.


Spielereignisse anzeigen


Jeder nicht autorisierte Benutzer kann eine Liste von Ereignissen inaktiver Spiele anfordern, und ein autorisierter Benutzer kann eine Liste von Ereignissen und jedes aktive Spiel abrufen. Ein zusätzlicher Parameter zur Funktion kann die Ereignisnummer sein, die der Benutzer bereits hat. In diesem Fall werden nur die Ereignisse in der Liste zurückgegeben, die später aufgetreten sind. Durch den regelmäßigen Start dieser Funktion kann ein autorisierter Benutzer beobachten, was im Spiel passiert. Diese Funktion gibt auch eine Anforderung für eine Aktion zurück, auf die der Benutzer mit der Funktion zum Senden eines Spielereignisses antworten kann.


Spielevent Versand


Die Funktion funktioniert nur für Spielteilnehmer: Die Möglichkeit, ein Spiel zu starten, einen Zug zu machen, abzustimmen, eine Textnachricht zu schreiben, die in der Liste der Spielereignisse angezeigt wird, usw. ist implementiert.
Der autorisierte Benutzer, der das Spiel erstellt hat, beginnt mit der Verteilung der Rollen an alle Teilnehmer des Spiels, einschließlich sich selbst. Sie müssen ihre Rolle mit derselben Funktion bestätigen. Sobald alle Rollen bestätigt sind, wechselt das Spiel automatisch in den Nachtmodus.


Spielstatistik


Die Funktion ist nur für Teilnehmer des Spiels verfügbar und zeigt den Status des Spiels, die Liste und Anzahl der Spieler (Aliase), Rollen und deren Status (Zug ausgeführt oder nicht ausgeführt) sowie andere Informationen an. Wie bei der vorherigen Funktion funktioniert alles nur für Spielteilnehmer.


Funktionen regelmäßig ausführen


Wenn das Spiel eine bestimmte Zeit lang nicht gestartet wurde, wird es mithilfe der Suchfunktion automatisch aus der Liste der aktiven Spiele entfernt.


Eine andere periodische Aufgabe ist das erzwungene Umschalten des Spielmodus von Nacht auf Tag und zurück für Spiele, bei denen dies in der Runde nicht geschehen ist (z. B. hat ein Spieler, der auf ein Spielereignis reagieren muss, seine Entscheidung aus irgendeinem Grund nicht gesendet).


Ankündigung


  • Einleitung
  • Einstellen der Entwicklungsumgebung, Aufteilen der Aufgabe in Funktionen
  • Arbeiten Sie am Backend
  • Frontend-Arbeit
  • CI \ CD-Setup, Testorganisation
  • Eine Probesitzung starten
  • Zusammenfassung

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


All Articles