„Nieuwe Byline“. We eten de olifant in stukjes

„Nieuwe Byline“. We eten de olifant in stukjes

In dit artikel ga ik de werkomgeving instellen voor de ontwikkeling van het spel 'Byliny' en zal ik het spel opdelen in delen die geschikt zijn voor gebruik in OpenFaaS. Alle handelingen worden uitgevoerd op Linux, Kubernetes zal worden opgezet in minikube met behulp van VirtualBox. Mijn werkstation heeft 2 CPU-kernen en 12 GB RAM, en ik maak gebruik van een SSD als systeemschijf. Als primaire ontwikkelingsomgeving zal ik Debian 8 gebruiken, met de geïnstalleerde pakketten emacs, sudo, git en virtualbox; alles andere installeer ik door te downloaden van GitHub en andere bronnen. Deze applicaties worden geïnstalleerd in /usr/local/bin, tenzij anders aangegeven. Laten we beginnen!

Voorbereiding van de werkomgeving

Installatie van Go

Volg de instructies op de officiële 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

Controleer of het werkt:

$ 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

Installatie van faas-cli

Volg de instructies op de officiële website:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Downloaden van pakket https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli als /tmp/faas-cli
Download compleet.

Uitvoeren met voldoende machtigingen om te proberen faas-cli te verplaatsen naar /usr/local/bin
Nieuwe versie van faas-cli geïnstalleerd in /usr/local/bin
Alias 'faas' gemaakt voor 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/_ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 versie: 0.11.3

Daarnaast kan het bash-completion ingeschakeld worden:

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

Installatie en configuratie van Kubernetes

Voor ontwikkeling is minikube genoeg, dus laten we dat en kubelet installeren in /usr/local/bin, daarnaast installeren we helm voor het installeren van applicaties:

$ 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

Laten we minikube starten:

$ minikube starten
  minikube v1.6.2 op Debian 8.11
  Automatisch de 'virtualbox' driver geselecteerd (alternatieven: [])
  VM opstartimage downloaden ...
    > 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
  Virtualbox VM aanmaken (CPU's=2, Geheugen=8192MB, Schijf=20000MB) ...
  Kubernetes v1.17.0 voorbereiden op Docker '19.03.5' ...
  kubeadm v1.17.0 downloaden
  kubelet v1.17.0 downloaden
  Beelden ophalen ...
  Kubernetes starten ...  Wachten tot cluster online komt ...
  Klaar! kubectl is nu geconfigureerd om "minikube" te gebruiken

We controleren:

$ kubectl get pods --all-namespaces
NAMESPACE     NAAM                             KLAAR   STATUS    HERSTARTS   LEEFTIJD
kube-system   coredns-6955765f44-knlcb         1/1     Draait    0          29m
kube-system   coredns-6955765f44-t9cpn         1/1     Draait    0          29m
kube-system   etcd-minikube                    1/1     Draait    0          28m
kube-system   kube-addon-manager-minikube      1/1     Draait    0          28m
kube-system   kube-apiserver-minikube          1/1     Draait    0          28m
kube-system   kube-controller-manager-minikube 1/1     Draait    0          28m
kube-system   kube-proxy-hv2wc                 1/1     Draait    0          29m
kube-system   kube-scheduler-minikube          1/1     Draait    0          28m
kube-system   storage-provisioner              1/1     Draait    1          29m

Installatie van OpenFaaS

De ontwikkelaars raden aan om 2 namespaces te creëren voor gebruik:

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

Een repository voor helm toevoegen:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" is toegevoegd aan je repositories

In de chart is er een mogelijkheid om een wachtwoord in te stellen voor installatie, laten we deze gebruiken en de toegangsgegevens opslaan als een k8s-secret:

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

Uitvoering van de implementatie:

$ helm repo update
Hang vast terwijl we de laatste updates van je chart repositories ophalen...
...Sucessvol een update gekregen van de "openfaas" chart repository
Update compleet. Veel plezier met Helmen!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" bestaat niet. Het wordt nu geïnstalleerd.
NAAM: openfaas
LAATSTE UITGEVOERD: Vrij Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: geïmplementeerd
HERZIENING: 1
TESTSUITE: Geen
NOTITIES:
Om te verifiëren dat openfaas is opgestart, voer uit:

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

Na enige tijd voeren we de voorgestelde opdracht uit:

$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAAM                KLAAR   UP-TO-DATE   BESCHIKBAAR   LEEFTIJD
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

Controleer of het werkt:

$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" succesvol uitgerold
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Doorsturen vanaf 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
De OpenFaaS-server wordt aangeroepen om de inloggegevens te valideren...
Verbinding wordt verzorgd voor 8080
WAARSCHUWING! Communicatie is niet veilig, overweeg HTTPS te gebruiken. Letsencrypt.org biedt gratis SSL/TLS-certificaten aan.
inloggegevens opgeslagen voor admin http://127.0.0.1:8080
$ faas-cli list
Functie                        Aantal oproepen     Replica's

Installatie van Mongodb

We installeren alles met behulp van helm:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" is toegevoegd aan uw repositories
$ helm install stable/mongodb --generate-name
NAAM: mongodb-1577466908
LAATSTE UITROL: Vri Dec 25 11:15:11 2019
NAMESPACE: default
STATUS: gedeployed
REVISION: 1
TESTSUITE: Geen
NOTITIE:
** Wees geduldig terwijl de chart wordt uitgerold **

MongoDB kan worden benaderd via poort 27017 op de volgende DNS-naam binnen uw cluster:

    mongodb-1577466908.default.svc.cluster.local

Om het rootwachtwoord te krijgen, voer uit:

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

Om verbinding te maken met uw database, voert u de volgende opdracht uit:

    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

Om verbinding te maken met uw database van buiten de cluster, voert u de volgende opdrachten uit:

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

We controleren:

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)
Als je geen opdrachtprompt ziet, probeer dan op enter te drukken.

> db.version();
4.0.14

Druk op ctrl+D om de container te verlaten.

Instelling van emacs

Over het algemeen was alles al ingesteld volgens dit artikel, dus ik zal het niet in detail beschrijven.

Het splitsen van het spel in functies

Interacties met de functies verlopen via het http-protocol, en doorlopende authenticatie tussen verschillende functies wordt gegarandeerd door JWT. Voor het opslaan van tokens, evenals de status van het spel, spelersgegevens, volgordes van zetten van alle spellen en andere informatie, wordt mongodb gebruikt. Laten we dieper kijken naar de interessantste functies.

Registratie

De invoer van deze functie is een JSON met de speelnaam en het wachtwoord. Bij het aanroepen van deze functie wordt gecontroleerd of deze speelnaam niet in de database staat, en bij een succesvolle controle wordt de speelnaam en de wachtwoordhash in de database ingevoegd. Registratie is vereist voor actieve deelname aan het spel.

Ingang

De functie ontvangt JSON met een gamer-alias en wachtwoord. Bij het bestaan van de alias in de database en een succesvolle wachtwoordverificatie wordt er een JWT geretourneerd, die moet worden doorgegeven aan andere functies bij hun aanroep. Ook wordt er een invoeging in de database gedaan van verschillende systeerelementen, zoals het tijdstip van de laatste inlog, enzovoorts.

Bekijk de lijst met spellen

Elke niet-geautoriseerde gebruiker kan een verzoek indienen voor de lijst van alle spellen, met uitzondering van actieve spellen. Geautoriseerde gebruikers zien ook de lijst met actieve spellen. Het resultaat van de functie is JSON, met lijsten van spellen (spelidentificatie, leesbare naam, enzovoorts).

Een spel maken

De functie werkt alleen met geautoriseerde gebruikers. De invoer is het maximumaantal spelers, evenals spelparameters (bijvoorbeeld welke personages geactiveerd moeten worden in dit spel, het maximale aantal spelers, enzovoorts). Een apart spelparameter is de aanwezigheid van een wachtwoord om toe te treden, wat het mogelijk maakt om niet-publieke spellen te maken. Standaard wordt er een publiek spel aangemaakt. Het resultaat van de functie is JSON, waarin een veld voor het succes van de creatie, een unieke identificatie van het spel, alsook andere parameters aanwezig zijn.

Deelnemen aan een spel

De functie werkt alleen met geautoriseerde gebruikers. De invoer is de identificatie van het spel en een wachtwoord indien het een niet-publiek spel is. De uitvoer is JSON met parameters van het spel. Geautoriseerde gebruikers die zich bij het spel voegen, evenals de maker van het spel, worden verder deelnemers aan het spel genoemd.

Bekijk de gebeurtenissen van het spel

Elke niet-geautoriseerde gebruiker kan een verzoek indienen voor de lijst met gebeurtenissen van niet-actieve spellen, terwijl geautoriseerde gebruikers een lijst met gebeurtenissen van elk actief spel kunnen ontvangen. Een extra parameter van de functie kan het nummer van een gebeurtenis zijn die de gebruiker al heeft. In dat geval wordt alleen de lijst met gebeurtenissen geretourneerd die later hebben plaatsgevonden. Door deze functie periodiek aan te roepen, kan de geautoriseerde gebruiker volgen wat er in het spel gebeurt. Deze functie retourneert ook een actieaanroep waarop de gebruiker kan reageren met behulp van de functie om een spelgebeurtenis te verzenden.

Verstuur een spelgebeurtenis

De functie werkt alleen voor deelnemers aan het spel: het is mogelijk om het spel te starten, een zet te doen, te stemmen, een tekstbericht te schrijven dat in de evenementlijst van het spel wordt weergegeven, enzovoort.
De geautoriseerde gebruiker die het spel heeft aangemaakt, begint met het toewijzen van rollen aan alle deelnemers aan het spel, inclusief zichzelf; zij moeten hun rol bevestigen via deze functie. Zodra alle rollen zijn bevestigd, gaat het spel automatisch over naar de nachtmodus.

Spelstatistieken

De functie werkt alleen voor deelnemers aan het spel, toont de status van het spel, de lijst en het aantal spelers (aliasen), rollen en hun status (of er een zet is gedaan of niet), evenals andere informatie. Net als bij de vorige functie werkt alles alleen voor deelnemers aan het spel.

Periodiek uitgevoerde functies

Als het spel gedurende een bepaalde tijd, zoals opgegeven bij het creëren van het spel, niet is gestart, wordt het automatisch verwijderd uit de lijst met actieve spellen via de opruimfunctie.

Een andere periodieke taak is het handmatig schakelen van de spelmodus van nacht naar dag en vice versa voor spellen waarbij dit niet is gebeurd tijdens een zet (bijvoorbeeld als een speler die moet reageren op een spelgebeurtenis om de een of andere reden zijn beslissing niet heeft gestuurd).

Aankondiging

  • Inleiding
  • Het instellen van de ontwikkelomgeving, het opdelen van de taak in functies
  • Werkzaamheden aan de backend
  • Werkzaamheden aan de frontend
  • Instellen van CICD, organisatie van testen
  • Start van een proefspel
  • Conclusies

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster