"Nieuwe heldendichten". We eten de olifant in delen op

"Nieuwe heldendichten". We eten de olifant in delen op

In dit artikel zal ik een werkomgeving opzetten voor het ontwikkelen van het spel "Epics", en zal ik het spel zelf ook opdelen in delen die geschikt zijn voor gebruik in OpenFaaS. Ik zal alle manipulaties op Linux uitvoeren, ik zal Kubernetes in minikube implementeren met behulp van VirtualBox. Mijn werkmachine heeft 2 processorkernen en 12 GB RAM; ik gebruik een SSD als systeemschijf. Ik zal debian 8 gebruiken als mijn belangrijkste ontwikkelingssysteem, met emacs, sudo, git en virtualbox-pakketten geïnstalleerd, al het andere zal worden geïnstalleerd door te downloaden van GitHub en andere bronnen. We zullen deze applicaties installeren in /usr/local/bin tenzij anders aangegeven. Laten we beginnen!

Het voorbereiden van de werkomgeving

Go installeren

We volgen de instructies van 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

Functionaliteit controleren:

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

We volgen de instructies van de officiële 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

Bovendien kunt u bash-voltooiing inschakelen:

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

Kubernetes installeren en configureren

Voor ontwikkeling is minikube voldoende, dus installeer het en kubelet in /usr/local/bin, en installeer helm om applicaties te installeren:

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

controleren:

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

De ontwikkelaars raden aan om twee naamruimten te maken om mee te werken:

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

Voeg een opslagplaats voor roer toe:

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

De grafiek heeft de mogelijkheid om vóór de installatie een wachtwoord in te stellen, laten we het gebruiken en de toegangsgegevens opslaan als een k8s-geheim:

$ 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

Laten we inzetten:

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

Na enige tijd voeren we het voorgestelde commando uit:

$ 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

Functionaliteit controleren:

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

Wij installeren alles met behulp van roer:

$ 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

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)
If you don't see a command prompt, try pressing enter.

> db.version();
4.0.14

Druk op ctrl+D om de container te verlaten.

Emac's instellen

In principe was alles al geconfigureerd volgens dit artikel, dus ik zal niet in detail treden.

Het spel opsplitsen in functies

Interactie met functies wordt uitgevoerd via het http-protocol, end-to-end authenticatie tussen verschillende functies wordt verzorgd door JWT. Mongodb wordt gebruikt om tokens op te slaan, evenals de spelstatus, spelergegevens, reeksen zetten van alle spellen en andere informatie. Laten we de meest interessante functies eens nader bekijken.

registratie

De invoer van deze functie is JSON met de bijnaam en het wachtwoord van het spel. Wanneer deze functie wordt aangeroepen, wordt gecontroleerd of deze alias niet in de database staat; als de controle succesvol is, worden de alias en de wachtwoord-hash in de database ingevoegd. Registratie is vereist om actief deel te nemen aan het spel.

entree

De functie-invoer is JSON met een bijnaam en wachtwoord voor het spel; als er een bijnaam in de database staat en het wachtwoord met succes is geverifieerd met het wachtwoord dat eerder in de database is opgeslagen, wordt een JWT geretourneerd, die moet worden doorgegeven aan andere functies wanneer deze zijn genaamd. Ook worden er diverse servicerecords in de database ingevoegd, bijvoorbeeld de laatste inlogtijd etc.

Bekijk een lijst met spellen

Elke ongeautoriseerde gebruiker kan een lijst opvragen van alle spellen, behalve actieve spellen. Een geautoriseerde gebruiker ziet ook een lijst met actieve games. Het resultaat van de functie is JSON met lijsten met games (game-ID, voor mensen leesbare naam, enz.).

Spelcreatie

De functie werkt alleen met geautoriseerde gebruikers; bij de invoer wordt het maximale aantal spelers geaccepteerd, evenals spelparameters (bijvoorbeeld welke karakters in dit spel moeten worden geactiveerd, het maximale aantal spelers, enz.). Een aparte parameter van het spel is de aanwezigheid van een wachtwoord om mee te doen, waarmee je niet-openbare spellen kunt maken. Standaard wordt er een openbaar spel gemaakt. Het resultaat van de functie is JSON, dat een veld voor het maken van een succes, een unieke game-ID en andere parameters bevat.

Meedoen aan een spel

De functie werkt alleen met geautoriseerde gebruikers, de invoer is de game-ID en het bijbehorende wachtwoord. Als dit een niet-openbaar spel is, is de uitvoer JSON met de spelparameters. De geautoriseerde gebruiker die zich bij het spel heeft aangesloten, evenals de maker van het spel, worden hierna speldeelnemers genoemd.

Game-evenementen bekijken

Elke ongeautoriseerde gebruiker kan een lijst met gebeurtenissen opvragen voor inactieve games, en een geautoriseerde gebruiker kan een lijst met gebeurtenissen ontvangen voor elke actieve game. Een extra parameter voor de functie kan het gebeurtenisnummer zijn dat de gebruiker al heeft. In dit geval worden alleen de gebeurtenissen die later hebben plaatsgevonden in de lijst geretourneerd. Door deze functie periodiek te starten, kijkt een geautoriseerde gebruiker wat er in het spel gebeurt. Deze functie retourneert ook een actieverzoek, waarop de gebruiker kan reageren met behulp van de gebeurtenisverzendingsfunctie van het spel.

Een gamegebeurtenis verzenden

De functie werkt alleen voor speldeelnemers: het is mogelijk om het spel te starten, een zet te doen, te stemmen, een sms-bericht te schrijven dat wordt weergegeven in de lijst met spelevenementen, enz.
De geautoriseerde gebruiker die het spel heeft gemaakt, begint rollen te verdelen onder alle deelnemers aan het spel, inclusief zichzelf. Zij moeten hun rol bevestigen met dezelfde functie. Zodra alle rollen zijn bevestigd, schakelt het spel automatisch over naar de nachtmodus.

Spelstatistieken

De functie werkt alleen voor speldeelnemers; het toont de staat van het spel, de lijst en het aantal spelers (bijnamen), rollen en hun status (gezette zet of niet), evenals andere informatie. Net als bij de vorige functie werkt alles alleen voor gamedeelnemers.

Periodiek gelanceerde functies

Als het spel gedurende een bepaalde tijd die is opgegeven bij het maken van het spel, niet is gestart, wordt het automatisch verwijderd uit de lijst met actieve spellen met behulp van de wisfunctie.

Een andere periodieke taak is het gedwongen overschakelen van de spelmodus van nacht naar dag en weer terug voor spellen waarvoor dit niet tijdens de beurt is gebeurd (een speler die moet reageren op een spelgebeurtenis heeft bijvoorbeeld om de een of andere reden zijn oplossing niet verzonden ).

aankondiging

  • Introductie
  • Het opzetten van de ontwikkelomgeving, het opsplitsen van de taak in functies
  • Back-end werk
  • Frontend werk
  • Opzetten van CICD, organiseren van testen
  • Start een proefspelsessie
  • Resultaten van

Bron: www.habr.com

Voeg een reactie