«Νέα Έπη». Τρώμε τον ελέφαντα τμηματικά

«Νέα Έπη». Τρώμε τον ελέφαντα τμηματικά

Σε αυτό το άρθρο, θα δημιουργήσω ένα περιβάλλον εργασίας για την ανάπτυξη του παιχνιδιού "Epics", και επίσης θα σπάσω το ίδιο το παιχνίδι σε μέρη κατάλληλα για χρήση στο OpenFaaS. Θα κάνω όλους τους χειρισμούς στο Linux, θα αναπτύξω το Kubernetes στο minikube χρησιμοποιώντας το VirtualBox. Το μηχάνημα εργασίας μου έχει 2 πυρήνες επεξεργαστή και 12 GB μνήμης RAM· χρησιμοποιώ έναν SSD ως δίσκο συστήματος. Θα χρησιμοποιήσω το debian 8 ως κύριο σύστημα ανάπτυξης, με εγκατεστημένα πακέτα 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:

$ 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

Οι προγραμματιστές προτείνουν τη δημιουργία 2 χώρων ονομάτων για εργασία:

$ 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 για έξοδο από το κοντέινερ.

Ρύθμιση emacs

Κατ 'αρχήν, όλα είχαν ήδη ρυθμιστεί σύμφωνα με Αυτό το άρθρο, οπότε δεν θα μπω σε λεπτομέρειες.

Ανάλυση του παιχνιδιού σε λειτουργίες

Η αλληλεπίδραση με τις λειτουργίες πραγματοποιείται μέσω του πρωτοκόλλου http, ο έλεγχος ταυτότητας από άκρο σε άκρο μεταξύ διαφορετικών συναρτήσεων παρέχεται από το JWT. Το Mongodb χρησιμοποιείται για την αποθήκευση διακριτικών, καθώς και κατάσταση παιχνιδιού, δεδομένα παίκτη, ακολουθίες κινήσεων όλων των παιχνιδιών και άλλες πληροφορίες. Ας ρίξουμε μια πιο προσεκτική ματιά στα πιο ενδιαφέροντα χαρακτηριστικά.

Εγγραφή

Η είσοδος αυτής της συνάρτησης είναι JSON με το ψευδώνυμο και τον κωδικό πρόσβασης του παιχνιδιού. Όταν καλείται αυτή η συνάρτηση, ελέγχεται ότι αυτό το ψευδώνυμο δεν βρίσκεται στη βάση δεδομένων· εάν ο έλεγχος είναι επιτυχής, το ψευδώνυμο και ο κατακερματισμός του κωδικού πρόσβασης εισάγονται στη βάση δεδομένων. Απαιτείται εγγραφή για ενεργή συμμετοχή στο παιχνίδι.

Εισαγωγή

Η είσοδος της συνάρτησης είναι JSON με ψευδώνυμο και κωδικό πρόσβασης παιχνιδιού. Εάν υπάρχει ένα ψευδώνυμο στη βάση δεδομένων και ο κωδικός πρόσβασης επαληθευτεί επιτυχώς με αυτόν που είχε αποθηκευτεί προηγουμένως στη βάση δεδομένων, επιστρέφεται ένα JWT, το οποίο πρέπει να μεταβιβαστεί σε άλλες συναρτήσεις όταν που ονομάζεται. Διάφορες εγγραφές υπηρεσιών εισάγονται επίσης στη βάση δεδομένων, για παράδειγμα, ο χρόνος τελευταίας σύνδεσης κ.λπ.

Δείτε μια λίστα με παιχνίδια

Οποιοσδήποτε μη εξουσιοδοτημένος χρήστης μπορεί να ζητήσει μια λίστα με όλα τα παιχνίδια εκτός από τα ενεργά. Ένας εξουσιοδοτημένος χρήστης βλέπει επίσης μια λίστα με ενεργά παιχνίδια. Το αποτέλεσμα της συνάρτησης είναι JSON που περιέχει λίστες παιχνιδιών (αναγνωριστικό παιχνιδιού, όνομα αναγνώσιμο από τον άνθρωπο, κ.λπ.).

Δημιουργία παιχνιδιού

Η λειτουργία λειτουργεί μόνο με εξουσιοδοτημένους χρήστες· ο μέγιστος αριθμός παικτών γίνεται δεκτός στην είσοδο, καθώς και οι παράμετροι του παιχνιδιού (για παράδειγμα, ποιοι χαρακτήρες να ενεργοποιηθούν σε αυτό το παιχνίδι, ο μέγιστος αριθμός παικτών κ.λπ.). Μια ξεχωριστή παράμετρος του παιχνιδιού είναι η παρουσία ενός κωδικού πρόσβασης για συμμετοχή, ο οποίος σας επιτρέπει να δημιουργείτε μη δημόσια παιχνίδια. Από προεπιλογή, δημιουργείται ένα δημόσιο παιχνίδι. Το αποτέλεσμα της συνάρτησης είναι το JSON, το οποίο περιέχει ένα πεδίο επιτυχίας δημιουργίας, ένα μοναδικό αναγνωριστικό παιχνιδιού και άλλες παραμέτρους.

Συμμετοχή σε ένα παιχνίδι

Η λειτουργία λειτουργεί μόνο με εξουσιοδοτημένους χρήστες, η είσοδος είναι το αναγνωριστικό του παιχνιδιού και ο κωδικός πρόσβασης, εάν αυτό είναι ένα μη δημόσιο παιχνίδι, η έξοδος είναι JSON με τις παραμέτρους του παιχνιδιού. Ο εξουσιοδοτημένος χρήστης που μπήκε στο παιχνίδι, καθώς και ο δημιουργός του παιχνιδιού, καλούνται εφεξής συμμετέχοντες στο παιχνίδι.

Προβολή γεγονότων του παιχνιδιού

Οποιοσδήποτε μη εξουσιοδοτημένος χρήστης μπορεί να ζητήσει μια λίστα συμβάντων για ανενεργά παιχνίδια και ένας εξουσιοδοτημένος χρήστης μπορεί να λάβει μια λίστα συμβάντων για οποιοδήποτε ενεργό παιχνίδι. Μια πρόσθετη παράμετρος στη συνάρτηση μπορεί να είναι ο αριθμός συμβάντος που έχει ήδη ο χρήστης. Σε αυτήν την περίπτωση, μόνο εκείνα τα συμβάντα που συνέβησαν αργότερα θα επιστραφούν στη λίστα. Με την περιοδική εκκίνηση αυτής της λειτουργίας, ένας εξουσιοδοτημένος χρήστης παρακολουθεί τι συμβαίνει στο παιχνίδι. Αυτή η λειτουργία επιστρέφει επίσης ένα αίτημα ενέργειας, στο οποίο ο χρήστης μπορεί να απαντήσει χρησιμοποιώντας τη λειτουργία αποστολής συμβάντων του παιχνιδιού.

Αποστολή εκδήλωσης παιχνιδιού

Η λειτουργία λειτουργεί μόνο για τους συμμετέχοντες στο παιχνίδι: μπορείτε να ξεκινήσετε το παιχνίδι, να κάνετε μια κίνηση, να ψηφίσετε, να γράψετε ένα μήνυμα κειμένου που εμφανίζεται στη λίστα συμβάντων του παιχνιδιού κ.λπ.
Ο εξουσιοδοτημένος χρήστης που δημιούργησε το παιχνίδι αρχίζει να διανέμει ρόλους σε όλους τους συμμετέχοντες στο παιχνίδι, συμπεριλαμβανομένων των εαυτών τους, πρέπει να επιβεβαιώσουν τον ρόλο τους χρησιμοποιώντας την ίδια λειτουργία. Μόλις επιβεβαιωθούν όλοι οι ρόλοι, το παιχνίδι μεταβαίνει αυτόματα σε νυχτερινή λειτουργία.

Στατιστικά παιχνιδιού

Η λειτουργία λειτουργεί μόνο για τους συμμετέχοντες στο παιχνίδι· εμφανίζει την κατάσταση του παιχνιδιού, τη λίστα και τον αριθμό των παικτών (ψευδώνυμα), τους ρόλους και την κατάστασή τους (μετακόμιση που έγινε ή όχι), καθώς και άλλες πληροφορίες. Όπως και με την προηγούμενη λειτουργία, όλα λειτουργούν μόνο για τους συμμετέχοντες στο παιχνίδι.

Λειτουργίες που εκκινούνται περιοδικά

Εάν το παιχνίδι δεν έχει ξεκινήσει για κάποιο χρονικό διάστημα που καθορίστηκε κατά τη δημιουργία του παιχνιδιού, θα αφαιρεθεί αυτόματα από τη λίστα των ενεργών παιχνιδιών χρησιμοποιώντας τη λειτουργία διαγραφής.

Μια άλλη περιοδική εργασία είναι η αναγκαστική εναλλαγή της λειτουργίας παιχνιδιού από τη νύχτα στην ημέρα και πίσω για παιχνίδια για τα οποία αυτό δεν συνέβη κατά τη διάρκεια του γύρου (για παράδειγμα, ένας παίκτης που πρέπει να αντιδράσει σε ένα γεγονός παιχνιδιού δεν έστειλε τη λύση του για κάποιο λόγο ).

ανακοίνωση

  • Εισαγωγή
  • Ρύθμιση του περιβάλλοντος ανάπτυξης, ανάλυση της εργασίας σε λειτουργίες
  • Εργασία backend
  • Εργασία στο frontend
  • Ρύθμιση CICD, οργάνωση δοκιμών
  • Ξεκινήστε μια δοκιμαστική περίοδο παιχνιδιού
  • Αποτελέσματα της

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο