“Nya Byelines”. Vi Ă€ter elefanten del för del.

“Nya Byelines”. Vi Ă€ter elefanten del för del.

I den hÀr artikeln kommer jag att stÀlla in en utvecklingsmiljö för spelet "Byliny" och ocksÄ bryta ner sjÀlva spelet i delar som kan anvÀndas i OpenFaaS. Jag kommer att göra alla manipulationer pÄ Linux, och Kubernetes kommer att köras i minikube med hjÀlp av VirtualBox. Min arbetsmaskin har 2 processorkÀrnor och 12 GB RAM, och jag anvÀnder SSD som systemdisk. Som huvudsakligt utvecklingssystem kommer jag att anvÀnda Debian 8 med installerade paketen emacs, sudo, git och virtualbox, och allt annat kommer jag att installera genom att ladda ner frÄn GitHub och andra kÀllor. Dessa applikationer kommer att installeras i /usr/local/bin, om inget annat anges. LÄt oss börja!

Förberedelse av arbetsmiljö

Installation av Go

Följ instruktionerna pÄ 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 funktionaliteten:

$ 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

Installation av faas-cli

Följ instruktionerna pÄ den officiella webbplatsen:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Laddar ner paket https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli som /tmp/faas-cli
Nedladdning klar.

Körs med tillrÀckliga behörigheter för att försöka flytta faas-cli till /usr/local/bin
Ny version av faas-cli installerad till /usr/local/bin
Skapar alias 'faas' för 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/_ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 version: 0.11.3

Dessutom kan bash-completion kopplas in:

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

Installation och konfiguration av Kubernetes

För utveckling rÀcker minikube, sÄ vi installerar det och kubelet i /usr/local/bin, och för installation av program installerar vi ocksÄ 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

Starta minikube:

$ minikube start
  minikube v1.6.2 pÄ Debian 8.11
  Valde automatiskt drivrutinen 'virtualbox' (alternativ: [])
  Laddar ner 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
  Skapar virtualbox VM (CPUs=2, Minne=8192MB, Disk=20000MB) ...
  Förbereder Kubernetes v1.17.0 pÄ Docker '19.03.5' ...
  Laddar ner kubeadm v1.17.0
  Laddar ner kubelet v1.17.0
  HĂ€mtar bilder ...
  Startar Kubernetes ... VÀntar pÄ att klustret ska komma online ...
  Klart! kubectl Àr nu konfigurerat för att anvÀnda "minikube"

Kontrollerar:

$ kubectl get pods --all-namespaces
NAMNRYMD       NAMN                                KLAR   STATUS    OMSTARTNINGAR   ÅLDER
kube-system     coredns-6955765f44-knlcb           1/1     Körande   0               29m
kube-system     coredns-6955765f44-t9cpn           1/1     Körande   0               29m
kube-system     etcd-minikube                       1/1     Körande   0               28m
kube-system     kube-addon-manager-minikube         1/1     Körande   0               28m
kube-system     kube-apiserver-minikube             1/1     Körande   0               28m
kube-system     kube-controller-manager-minikube    1/1     Körande   0               28m
kube-system     kube-proxy-hv2wc                    1/1     Körande   0               29m
kube-system     kube-scheduler-minikube             1/1     Körande   0               28m
kube-system     storage-provisioner                 1/1     Körande   1               29m

Installation av OpenFaaS

Utvecklarna rekommenderar att skapa 2 namespaces för arbete:

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

Vi lÀgger till förvaret för helm:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" har lagts till i dina förrÄd

I diagrammet finns möjlighet att ange ett lösenord före installationen, lÄt oss anvÀnda det och spara inloggningsuppgifterna 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 skapat

Vi genomför distributionen:

$ helm repo update
HÄll dig kvar medan vi hÀmtar det senaste frÄn dina diagramförrÄd...
...Lyckades fÄ en uppdatering frÄn "openfaas" diagramförrÄd
Uppdatering klar. Glad helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" finns inte. Installerar det nu.
NAMN: openfaas
SIST DISTRIBUERAD: Fre Dec 25 10:28:22 2019
NAMNRYMD: openfaas
STATUS: distribuerad
REVISION: 1
TESTSUITE: Ingen
NOTER:
För att verifiera att openfaas har startat, kör:

  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"
NAMN                KLAR   UP-TODATE   TILLGÄNGLIG   ÅLDER
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 funktionaliteten:

$ 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

Installation av Mongodb

Installerar allt med hjÀlp av helm:

$ 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 kan nÄs via port 27017 med följande DNS-namn frÄn inom din kluster:

    mongodb-1577466908.default.svc.cluster.local

För att fÄ root-lösenordet kör:

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

För att ansluta till din databas kör följande 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

För att ansluta till din databas utanför klustret kör följande kommandon:

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

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)
Om du inte ser en kommandoprompt, försök att trycka pÄ enter.

> db.version();
4.0.14

Tryck ctrl+D för att lÀmna containern.

InstÀllning av emacs

I princip var allt redan instÀllt enligt denna artikel, sÄ jag kommer inte att gÄ in pÄ detaljer.

Delning av spelet i funktioner

Interaktionen med funktionerna sker via http-protokollet, och genomgÄende autentisering mellan olika funktioner sÀkerstÀlls av JWT. För lagring av tokens, samt spelets tillstÄnd, spelardata, sekvenser av drag i alla spel och annan information anvÀnds mongodb. LÄt oss titta nÀrmare pÄ de mest intressanta funktionerna.

Registrering

IngÄngen till denna funktion Àr JSON med spelalias och lösenord. Vid anrop av denna funktion görs en kontroll av att detta alias inte finns i databasen, och vid en lyckad kontroll - infogning av aliaset och hash av lösenordet i databasen. Registrering Àr nödvÀndig för aktiv delaktighet i spelet.

IngÄng

Vid funktionen tas JSON emot med spelarnamn och lösenord, om spelarnamnet finns i databasen och lösenordet kontrolleras framgÄngsrikt mot det som tidigare sparats i databasen, returneras en JWT, som ska ges till andra funktioner vid deras anrop. Det görs ocksÄ insÀttningar i databasen av olika systemkonton, till exempel tid för senaste inloggning osv.

Visa spel lista

Alla icke-autentiserade anvÀndare kan begÀra en lista över alla spel, förutom aktiva spel. Autentiserade anvÀndare ser ocksÄ listan över aktiva spel. Resultatet av funktionen Àr JSON, innehÄllande listorna med spel (spelidentifierare, lÀttlÀst namn osv.).

Skapande av spel

Funktionen fungerar endast för autentiserade anvÀndare, ingÄngen tar emot det maximala antalet spelare samt spelets parametrar (till exempel vilka karaktÀrer som ska aktiveras i detta spel, maximalt antal spelare osv.). En specifik parameter för spelet Àr nÀrvaron av ett lösenord för att delta, vilket gör det möjligt att skapa privata spel. Som standard skapas ett offentligt spel. Resultatet av funktionen Àr en JSON som innehÄller ett fÀltsuccé för skapandet, ett unikt spelidentifierare, samt andra parametrar.

GĂ„ med i spelet

Funktionen fungerar endast för autentiserade anvÀndare, ingÄngen - spelidentifieraren och dess lösenord, om det Àr ett privat spel, och utgÄngen - JSON med spelparametrar. Den autentiserade anvÀndaren som gÄr med i spelet samt skaparen av spelet kallas sedan deltagare i spelet.

Visa spelets hÀndelser

Alla icke-autentiserade anvÀndare kan begÀra en lista över hÀndelser i inaktiva spel, medan en autentiserad anvÀndare kan fÄ lista över hÀndelser för vilket aktivt spel som helst. En ytterligare parameter för funktionen kan vara hÀndelsenummret, som redan finns för anvÀndaren. I det hÀr fallet Äterkommer endast de hÀndelser som intrÀffade senare i listan. Genom att regelbundet köra denna funktion kan den autentiserade anvÀndaren se vad som hÀnder i spelet. Funktionen returnerar ocksÄ en begÀran om en ÄtgÀrd som anvÀndaren kan reagera pÄ med hjÀlp av funktionen för att skicka hÀndelsen i spelet.

Skicka spelhÀndelse

Funktionen fungerar endast för spelare: det Àr möjligt att starta spelet, göra ett drag, rösta, skriva ett textmeddelande som visas i hÀndelselistan för spelet, etc.
Den autentiserade anvÀndare som skapat spelet tilldelar roller till alla spelare, inklusive sig sjÀlv; de mÄste bekrÀfta sina roller genom denna funktion. NÀr alla roller har bekrÀftats, övergÄr spelet automatiskt till nattscenariet.

Spelstatistik

Funktionen fungerar endast för spelare, visar spelets status, lista och antal spelare (alias), roller och deras status (drag gjort eller ej), samt annan information. Precis som för den föregÄende funktionen fungerar allt endast för spelare.

Periodiskt körda funktioner

Om spelet inte har startat inom en viss tid, som angivits vid spelets skapande, kommer det automatiskt att raderas frÄn listan över aktiva spel med hjÀlp av rensningsfunktionen.

En annan periodisk uppgift Àr att tvinga ett skifte av spelmodus frÄn natt till dag och tillbaka för spel dÀr det inte har skett under draget (till exempel om en spelare som behöver reagera pÄ ett spelhÀndelse inte har skickat sin lösning av olika skÀl).

TillkÀnnagivande

  • Introduktion
  • Installation av utvecklingsmiljö, uppdelning av uppgift i funktioner
  • Arbete med backend
  • Arbete med frontend
  • InstĂ€llning av CICD, organisering av testning
  • Start av provspel
  • Sammanfattning

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster