«Bătrânele Legende». Mâncăm elefantul pe bucăți

«Bătrânele Legende». Mâncăm elefantul pe bucăți

În acest articol, voi configura un mediu de lucru pentru dezvoltarea jocului «Legende», precum și voi realiza divizarea jocului în părți utilizabile în OpenFaaS. Toate operațiunile vor fi efectuate pe Linux, iar Kubernetes va fi implementat în minikube folosind VirtualBox. În mașina mea de lucru am 2 nuclee de procesor și 12 GB de memorie RAM, iar ca disc sistemic utilizez un SSD. Ca sistem principal pentru dezvoltare, voi folosi Debian 8, cu pachetele emacs, sudo, git și virtualbox instalate, restul le voi instala prin descărcare din GitHub și alte surse. Aceste aplicații vor fi instalate în /usr/local/bin, cu excepția cazului în care este specificat altceva. Să începem!

Pregătirea mediu de lucru

Instalarea Go

Urmăm instrucțiunile de pe site-ul oficial:

$ 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

Verificăm funcționalitatea:

$ 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

Instalarea faas-cli

Urmăm instrucțiunile de pe site-ul oficial:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Descărcarea pachetului https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli ca /tmp/faas-cli
Descărcare completă.

Se rulează cu permisiuni suficiente pentru a încerca mutarea faas-cli în /usr/local/bin
Noua versiune a faas-cli a fost instalată în /usr/local/bin
Crearea aliasului 'faas' pentru 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _ / ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__ / ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 comit:  73004c23e5a4d3fdb7352f953247473477477a64
 versiune: 0.11.3

De asemenea, se poate activa completarea bash:

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

Instalarea și configurarea Kubernetes

Pentru dezvoltare, este suficient minikube, așa că îl vom instala pe acesta și kubelet în /usr/local/bin, pentru instalarea aplicațiilor vom instala de asemenea 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

Pornim minikube:

$ minikube start
  minikube v1.6.2 pe Debian 8.11
  Driverul 'virtualbox' a fost selectat automat (alternative: [])
  Descărcare imagine de boot VM ...
    > 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
  Crearea VM-ului virtualbox (CPUs=2, Memorie=8192MB, Disc=20000MB) ...
  Pregătirea Kubernetes v1.17.0 pe Docker '19.03.5' ...
  Descărcare kubeadm v1.17.0
  Descărcare kubelet v1.17.0
  Tragerea imaginilor ...
  Lansare Kubernetes ...  Așteptând ca clusterul să devină activ ...
  S-a finalizat! kubectl este acum configurat pentru a folosi "minikube"

Verificăm:

$ 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

Instalarea OpenFaaS

Dezvoltatorii recomandă crearea a 2 namespace-uri pentru funcționare:

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

Adăugăm repository pentru helm:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" a fost adăugat în repository-urile tale

În chart există opțiunea de a seta o parolă înainte de instalare, vom folosi această funcție și vom salva datele de acces sub formă de secret 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 creat

Executăm desfășurarea:

$ helm repo update
Așteptați puțin în timp ce obținem cele mai recente informații de la repository-urile voastre de chart...
...Actualizare reușită din repository-ul de chart "openfaas"
Actualizare completă.  Happy Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" nu există. Îl instalăm acum.
NAME: openfaas
ULTIMA DESFĂȘURARE: Vin Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: desfășurat
REVIZIE: 1
SUITE DE TESTARE: Niciuna
NOTĂ:
Pentru a verifica că openfaas a început, rulați:

  kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"

După un timp, rulăm comanda propusă:

$ 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

Verificăm funcționalitatea:

$ 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

Instalarea Mongodb

Instalăm totul folosind helm:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" a fost adăugat la repozitoarele tale
$ 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:
** Te rugăm să ai răbdare în timp ce graficul este desfășurat **

MongoDB poate fi accesat prin portul 27017 sub următorul nume DNS din clusterul tău:

    mongodb-1577466908.default.svc.cluster.local

Pentru a obține parola de root rulează:

    export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)

Pentru a te conecta la baza ta de date rulează următoarea comandă:

    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

Pentru a te conecta la baza ta de date din afara clusterului execută următoarele comenzi:

    kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
    mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD

Verificăm:

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)
Dacă nu vezi un prompt de comandă, încearcă să apeși enter.

> db.version();
4.0.14

Apasă ctrl+D pentru a ieși din container.

Configurarea emacs

În principiu, totul a fost deja configurat conform această articole, așa că nu o voi detalia.

Împărțirea jocului în funcții

Interacțiunea cu funcțiile se realizează prin protocolul http, autentificarea de-a lungul întregului proces între diferite funcții este asigurată de JWT. Pentru stocarea token-urilor, precum și a stării jocului, datelor jucătorilor, secvențelor de mișcări din toate jocurile și altor informații se folosește mongodb. Să analizăm în detaliu funcțiile cele mai interesante.

Înregistrare

La intrarea acestei funcții – JSON cu pseudonimul de joc și parola. La apelarea acestei funcții, se efectuează verificarea absenței acestui pseudonim în baza de date, iar după verificarea cu succes – inserarea pseudonimului și a hash-ului parolei în bază. Înregistrarea este necesară pentru a participa activ la joc.

Autentificare

La intrarea funcției se află un JSON cu un nume de utilizator și o parolă de joc. Dacă numele de utilizator există în bază de date și parola a fost verificată cu succes, se returnează un JWT care trebuie transmis altor funcții la apel. De asemenea, se face o inserție în bază de date a diferitelor înregistrări de serviciu, cum ar fi timpul ultimei intrări etc.

Vizualizarea listei de jocuri

Orice utilizator neautorizat poate solicita lista tuturor jocurilor, cu excepția celor active. Utilizatorul autorizat va vedea și lista jocurilor active. Rezultatul funcției este un JSON care conține listele jocurilor (identificatorul jocului, numele prietenos etc.).

Crearea unui joc

Funcția funcționează doar cu utilizatori autorizați, la intrare este acceptat numărul maxim de jucători, precum și parametrii jocului (de exemplu, ce personaje să fie activate în acest joc, numărul maxim de jucători etc.). Un parametru distinct al jocului este prezența unei parole pentru a se alătura, ceea ce permite crearea de jocuri nepublice. Implicit, se creează un joc public. Rezultatul execuției funcției este un JSON care conține un câmp de succes al creării, un identificator unic al jocului, precum și alți parametri.

Alăturarea la joc

Funcția funcționează doar cu utilizatori autorizați, la intrare – identificatorul jocului și parola sa, dacă este un joc nepublic. La ieșire – un JSON cu parametrii jocului. Utilizatorul autorizat care s-a alăturat jocului, precum și creatorul jocului, vor fi numiți participanți la joc.

Vizualizarea evenimentelor jocului

Orice utilizator neautorizat poate solicita lista evenimentelor jocurilor neinactive, iar utilizatorul autorizat poate obține lista evenimentelor oricărui joc activ. Un parametru suplimentar al funcției poate fi numărul evenimentului pe care utilizatorul deja îl are. În acest caz, vor returna doar acele evenimente care au avut loc ulterior. Rulând periodic această funcție, utilizatorul autorizat poate vedea ce se întâmplă în joc. Această funcție returnează, de asemenea, o cerere de acțiune la care utilizatorul poate reacționa prin funcția de trimitere a evenimentului jocului.

Trimiterea evenimentului jocului

Funcția funcționează doar pentru participanții la joc: este posibil să pornești jocul, să faci o mutare, să votezi, să scrii un mesaj text care se afișează în lista de evenimente ale jocului etc.
Utilizatorul autorizat care a creat jocul inițiază distribuirea rolurilor tuturor participanților la joc, inclusiv a sa. Aceștia trebuie să-și confirme rolul folosind aceeași funcție. Odată ce toate rolurile sunt confirmate, jocul trece automat în modul noapte.

Statistica jocului

Funcția funcționează doar pentru participanții la joc, afișând starea jocului, lista și numărul de jucători (nickname-uri), rolurile și statutul acestora (mutare efectuată sau nu), precum și alte informații. Așa cum se întâmplă și în cazul funcției anterioare, totul funcționează doar pentru participanții la joc.

Funcții declanșate periodic

Dacă jocul nu a fost inițiat pentru o anumită perioadă de timp, specificată la crearea jocului, acesta va fi eliminat automat din lista jocurilor active prin funcția de curățare.

O altă sarcină periodică este comutarea forțată a modului de joc de la noapte la zi și invers pentru jocuri care nu au făcut acest lucru în timpul mutării (de exemplu, un jucător care trebuie să reacționeze la un eveniment de joc nu a trimis soluția sa din diverse motive).

Anunț

  • Introducere
  • Configurarea mediului pentru dezvoltare, împărțirea sarcinii în funcții
  • Lucrări la backend
  • Lucrări la frontend
  • Configurarea CICD, organizarea testării
  • Lansarea unei sesiuni de probă a jocului
  • Concluzii

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster