"Nya epos". Vi äter elefanten i delar

"Nya epos". Vi äter elefanten i delar

I den här artikeln kommer jag att sätta upp en arbetsmiljö för att utveckla spelet "Epics", och kommer även att dela upp själva spelet i delar som lämpar sig för användning i OpenFaaS. Jag kommer att göra alla manipulationer på Linux, jag kommer att distribuera Kubernetes i minikube med VirtualBox. Min arbetsmaskin har 2 processorkärnor och 12 GB RAM; jag använder en SSD som systemdisk. Jag kommer att använda debian 8 som mitt huvudsakliga utvecklingssystem, med emacs, sudo, git och virtualbox-paket installerade, allt annat kommer att installeras genom nedladdning från GitHub och andra källor. Vi kommer att installera dessa applikationer i /usr/local/bin om inget annat anges. Låt oss börja!

Att förbereda arbetsmiljön

Installerar Go

Vi följer instruktionerna från den officiella webbplatsen:

$ 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

Kontrollera funktionalitet:

$ 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

Installerar faas-cli

Vi följer instruktionerna från den officiella webbplatsen:

$ 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

Dessutom kan du aktivera bash-komplettering:

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

Installera och konfigurera Kubernetes

För utveckling räcker minikube, så installera det och kubelet i /usr/local/bin, och installera rodret för att installera applikationer:

$ 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

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

Vi kontrollerar:

$ 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

Installerar OpenFaaS

Utvecklarna rekommenderar att du skapar två namnområden att arbeta med:

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

Lägg till ett förråd för rodret:

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

Diagrammet har möjlighet att ställa in ett lösenord före installation, låt oss använda det och spara åtkomstdata som en k8s-hemlighet:

$ 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

Låt oss distribuera:

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

Efter en tid kör vi det föreslagna kommandot:

$ 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

Kontrollera funktionalitet:

$ 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

Installerar Mongodb

Vi installerar allt med hjälp av rodret:

$ 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

Vi kontrollerar:

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

Tryck på ctrl+D för att lämna behållaren.

Konfigurera emacs

I princip var allt redan konfigurerat enligt den här artikeln, så jag går inte in på detaljer.

Dela upp spelet i funktioner

Interaktion med funktioner utförs via http-protokollet, end-to-end-autentisering mellan olika funktioner tillhandahålls av JWT. Mongodb används för att lagra tokens, såväl som spelstatus, spelardata, sekvenser av drag för alla spel och annan information. Låt oss ta en närmare titt på de mest intressanta funktionerna.

Bli medlem

Ingången för denna funktion är JSON med spelets smeknamn och lösenord. När den här funktionen anropas kontrolleras det att detta alias inte finns i databasen, om kontrollen lyckas infogas alias- och lösenordshashen i databasen. Registrering krävs för att aktivt delta i spelet.

ingång

Funktionsinmatningen är JSON med ett smeknamn och lösenord för spelet; om det finns ett smeknamn i databasen och lösenordet har verifierats med det som tidigare sparats i databasen, returneras en JWT, som måste skickas till andra funktioner när de är kallad. Olika serviceposter infogas också i databasen, till exempel senaste inloggningstid osv.

Visa en lista över spel

Alla obehöriga användare kan begära en lista över alla spel utom aktiva. En auktoriserad användare ser också en lista över aktiva spel. Resultatet av funktionen är JSON som innehåller listor över spel (spel-ID, mänskligt läsbart namn, etc.).

Spelskapande

Funktionen fungerar endast med auktoriserade användare; det maximala antalet spelare accepteras vid ingången, såväl som spelparametrar (till exempel vilka tecken som ska aktiveras i detta spel, det maximala antalet spelare, etc.). En separat parameter för spelet är närvaron av ett lösenord för att gå med, vilket gör att du kan skapa icke-offentliga spel. Som standard skapas ett offentligt spel. Resultatet av funktionen är JSON, som innehåller ett framgångsfält för skapande, en unik spelidentifierare och andra parametrar.

Gå med i ett spel

Funktionen fungerar endast med auktoriserade användare, ingången är spel-ID och dess lösenord, om detta är ett icke-offentligt spel är utgången JSON med spelparametrarna. Den auktoriserade användaren som gick med i spelet, såväl som skaparen av spelet, kallas hädanefter speldeltagare.

Visa spelhändelser

Alla obehöriga användare kan begära en lista över händelser för inaktiva spel, och en auktoriserad användare kan få en lista över händelser för alla aktiva spel. En ytterligare parameter till funktionen kan vara händelsenumret som användaren redan har. I det här fallet kommer endast de händelser som inträffade senare att returneras i listan. Genom att regelbundet starta den här funktionen ser en auktoriserad användare vad som händer i spelet. Denna funktion returnerar också en åtgärdsbegäran som användaren kan svara på med hjälp av spelets händelseutskickningsfunktion.

Skickar en spelhändelse

Funktionen fungerar endast för speldeltagare: det är möjligt att starta spelet, göra ett drag, rösta, skriva ett textmeddelande som visas i listan över spelhändelser, etc.
Den auktoriserade användaren som skapade spelet börjar distribuera roller till alla deltagare i spelet, inklusive sig själva, de måste bekräfta sin roll med samma funktion. När alla roller är bekräftade växlar spelet automatiskt till nattläge.

Spelstatistik

Funktionen fungerar endast för speldeltagare, den visar spelets tillstånd, listan och antalet spelare (smeknamn), roller och deras status (flyttning gjort eller inte), samt annan information. Precis som med den tidigare funktionen fungerar allt bara för speldeltagare.

Periodiskt lanserade funktioner

Om spelet inte har startat under en viss tid som angavs när spelet skapades, kommer det automatiskt att tas bort från listan över aktiva spel med hjälp av clear-funktionen.

En annan periodisk uppgift är att tvingas byta spelläge från natt till dag och tillbaka för spel där detta inte hände under tur (till exempel, en spelare som behöver reagera på en spelhändelse skickade inte sin lösning av någon anledning ).

Meddelande

  • Inledning
  • Sätta upp utvecklingsmiljön, bryta ner uppgiften i funktioner
  • Backend arbete
  • Frontend arbete
  • Ställer in CICD, organiserar tester
  • Starta en provspelssession
  • Resultat av

Källa: will.com

Lägg en kommentar