«Nye Byer». Vi spiser elefanten stykke for stykke

«Nye Byer». Vi spiser elefanten stykke for stykke

I denne artikel vil jeg sætte et udviklingsmiljø op til spillet «Byer», samt opdele selve spillet i dele, der kan bruges i OpenFaaS. Alt arbejde vil blive udført på Linux, hvor Kubernetes vil blive oprettet i minikube med brug af VirtualBox. Min arbejdscomputer har 2 CPU-kerner og 12 GB RAM, og jeg bruger en SSD som systemdisk. Som hovedsystem til udvikling vil jeg bruge Debian 8, med installerede pakker som emacs, sudo, git og virtualbox, alt andet vil jeg installere ved at downloade fra GitHub og andre kilder. Disse applikationer skal installeres i /usr/local/bin, medmindre andet er angivet. Lad os komme i gang!

Forberedelse af udviklingsmiljø

Installation af Go

Følg instruktionerne fra det officielle websted:

$ 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

Kontrollerer funktionalitet:

$ 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

Installation af faas-cli

Følg instruktionerne fra det officielle websted:

$ 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

Derudover kan bash-completion tilføjes:

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

Installation og opsætning af Kubernetes

Til udvikling er minikube tilstrækkeligt, så lad os installere det og kubelet i /usr/local/bin, og til installationsapplikationer installerer vi også 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

Starter minikube:

$ minikube start
  minikube v1.6.2 på Debian 8.11
  Automatisk valgt 'virtualbox' driver (alternativer: [])
  Henter VM boot billede ...
    > 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
  Opretter virtualbox VM (CPU'er=2, Hukommelse=8192MB, Disk=20000MB) ...
  Forbereder Kubernetes v1.17.0 på Docker '19.03.5' ...
  Henter kubeadm v1.17.0
  Henter kubelet v1.17.0
  Henter billeder ...
  Starter Kubernetes ...  Venter på at klyngen er online ...
  Færdig! kubectl er nu konfigureret til at bruge "minikube"

Vi tjekker:

$ kubectl get pods --all-namespaces
NAVNSPACE     NAVN                               KLAR   STATUS    GENSTARTS   ALDER
kube-system   coredns-6955765f44-knlcb           1/1     Kørende   0          29m
kube-system   coredns-6955765f44-t9cpn           1/1     Kørende   0          29m
kube-system   etcd-minikube                      1/1     Kørende   0          28m
kube-system   kube-addon-manager-minikube        1/1     Kørende   0          28m
kube-system   kube-apiserver-minikube            1/1     Kørende   0          28m
kube-system   kube-controller-manager-minikube   1/1     Kørende   0          28m
kube-system   kube-proxy-hv2wc                   1/1     Kørende   0          29m
kube-system   kube-scheduler-minikube            1/1     Kørende   0          28m
kube-system   storage-provisioner                1/1     Kørende   1          29m

Installation af OpenFaaS

Udviklere anbefaler at oprette 2 namespaces til brug:

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

Tilføjer repository til helm:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" er blevet tilføjet til dine repositories

I chartet er der mulighed for at angive adgangskode inden installation, lad os bruge den og gemme adgangsoplysningerne som en k8s hemmelighed:

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

Udfører deployment:

$ helm repo update
Vent venligst mens vi henter det nyeste fra dine chart repositories...
...Succesfuldt fået en opdatering fra "openfaas" chart repository
Opdatering komplet. God fornøjelse med Helm!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Udgivelsen "openfaas" eksisterer ikke. Installerer den nu.
NAVN: openfaas
SIDSTE UDRULNING: Fre Dec 25 10:28:22 2019
NAVNSPACE: openfaas
STATUS: udrullet
REVISION: 1
TESTSUITE: Ingen
NOTER:
For at verificere, at openfaas er startet, skal du køre:

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

Efter lidt tid kører vi den foreslåede kommando:

$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAVN                KLAR   OP-TO-DATE   TILGÆNGELIG   ALDER
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

Kontrollerer funktionalitet:

$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" rullet korrekt
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Videregivelse fra 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Kalder OpenFaaS-serveren for at validere legitimationsoplysningerne...
Håndterer forbindelse for 8080
ADVARSEL! Kommunikation er ikke sikker, overvej at bruge HTTPS. Letsencrypt.org tilbyder gratis SSL/TLS-certifikater.
legitimationsoplysninger gemt for admin http://127.0.0.1:8080
$ faas-cli list
Funktion                        Kald     Replikater

Installation af Mongodb

Installerer alt ved hjælp af helm:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" er blevet tilføjet til dine repositories
$ helm install stable/mongodb --generate-name
NAVN: mongodb-1577466908
SIDST UDSENDT: Fri Dec 25 11:15:11 2019
NAVNERUM: default
STATUS: udsendt
REVISION: 1
TESTSUITE: Ingen
NOTER:
** Vær venlig at være tålmodig, mens diagrammet udsendes **

MongoDB kan tilgås via port 27017 på følgende DNS-navn fra indeni din klynge:

    mongodb-1577466908.default.svc.cluster.local

For at få rodadgangskoden, kør:

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

For at forbinde til din database, kør følgende kommando:

    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

For at forbinde til din database fra uden klyngen, udfør følgende kommandoer:

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

Vi tjekker:

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)
Hvis du ikke ser en kommandoprompt, prøv at trykke enter.

> db.version();
4.0.14

Tryk ctrl+D for at forlade containeren.

Opsætning af emacs

I princippet var alt allerede indstillet i henhold til denne artikel, så jeg vil ikke gå i dybden med det.

Opdeling af spillet i funktioner

Interaktionen med funktionerne sker via http-protokollen, og gennemgående autentifikation mellem forskellige funktioner sikres med JWT. Til opbevaring af tokens samt spillets tilstand, spillerdata, rækkefølge af træk i alle spil og anden information anvendes mongodb. Lad os se nærmere på de mest interessante funktioner.

Registrering

Indgangen til denne funktion er et JSON-objekt med et spillernavn og en adgangskode. Ved kald af denne funktion kontrolleres det, om dette spillernavn ikke findes i databasen; efter en vellykket kontrol indsættes spillernavnet og hash-koden for adgangskoden i databasen. Registrering er nødvendig for aktiv deltagelse i spillet.

Log ind

Indgangen til funktionen er JSON med et spillernavn og en adgangskode; hvis navnet findes i databasen, og adgangskoden verificeres som korrekt, returneres en JWT, som skal videregives til andre funktioner ved deres kald. Desuden indsættes forskellige systemoptegnelser i databasen, som for eksempel tidspunktet for den seneste login og lignende.

Vis liste over spil

Enhver ikke-autoriseret bruger kan anmode om at se listen over alle spil, undtagen aktive. En autoriseret bruger kan også se listen over aktive spil. Resultatet af funktionen er JSON, der indeholder spillister (spilidentifikator, brugervenligt navn osv.).

Oprettelse af spil

Funktionen arbejder kun med autoriserede brugere; indgangen accepterer det maksimale antal spillere samt spilparametre (f.eks. hvilke karakterer der skal aktiveres i dette spil, det maksimale antal spillere osv.). En særskilt parameter for spillet er, om der er en adgangskode til deltagelse, hvilket muliggør oprettelse af ikke-offentlige spil. Som standard oprettes et offentligt spil. Resultatet af funktionen er JSON, der indeholder et felt for succesfuld oprettelse, en unik identificator for spillet samt andre parametre.

Deltagelse i spil

Funktionen fungerer kun med autoriserede brugere; indgangen inkluderer spilidentifikatoren og dens adgangskode, hvis det er et ikke-offentligt spil. Udgangen er JSON med spilparametre. Den autoriserede bruger, der deltager i spillet, samt spillets skaber kaldes nu deltagere.

Vis spilbegivenheder

Enhver ikke-autoriseret bruger kan anmode om en liste over begivenheder i ikke-aktive spil, mens autoriserede brugere kan få en liste over begivenheder i alle aktive spil. Et yderligere parameter for funktionen kan være begivenhedsnummeret, som brugeren allerede har. I så fald vil kun de begivenheder, der er sket senere, blive returneret i listen. Ved periodisk at kalde denne funktion kan den autoriserede bruger se, hvad der sker i spillet. Denne funktion returnerer også en anmodning om handling, som brugeren kan reagere på ved hjælp af funktionen til at sende spilbegivenheder.

Send spilbegivenhed

Funktionen fungerer kun for deltagerne i spillet: der er mulighed for at starte spillet, foretage et træk, stemme, skrive en tekstbesked, som vises i listen over spilevents osv.
Den autoriserede bruger, der oprettede spillet, tildeler roller til alle deltagerne i spillet, inklusive sig selv, og de skal bekræfte deres roller ved hjælp af den samme funktion. Så snart alle roller er bekræftet, skifter spillet automatisk til nattilstand.

Spilstatistik

Funktionen fungerer kun for deltagerne i spillet, viser spillets tilstand, listen og antallet af spillere (aliaser), roller og deres status (er der foretaget et træk eller ej), samt anden information. Som med den foregående funktion fungerer alt kun for deltagerne i spillet.

Periodisk kørte funktioner

Hvis spillet ikke er blevet startet inden for en vis periode angivet ved oprettelsen af spillet, vil det automatisk blive fjernet fra listen over aktive spil ved hjælp af en rydningsfunktion.

En anden periodisk opgave er at tvinge skiftet af spiltilstand fra nat til dag og omvendt for spil, hvor dette ikke skete under et træk (for eksempel hvis en spiller, der skulle reagere på en spilevent, ikke har sendt sin beslutning af forskellige årsager).

Annonce

  • Introduktion
  • Opsætning af udviklingsmiljø, opdeling af opgaven i funktioner
  • Arbejdet med backend
  • Arbejdet med frontend
  • Opsætning af CICD, organisering af test
  • Start af en prøve-session af spillet
  • Resumé

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster