"Nije epos". Wy ite de oaljefant yn parten

"Nije epos". Wy ite de oaljefant yn parten

Yn dit artikel sil ik in wurkomjouwing ynstelle foar it ûntwikkeljen fan it spultsje "Epics", en sil it spultsje sels ek brekke yn dielen dy't geskikt binne foar gebrûk yn OpenFaaS. Ik sil alle manipulaasjes dwaan op Linux, ik sil Kubernetes yn minikube ynsette mei VirtualBox. Myn wurk masine hat 2 prosessor kearnen en 12GB RAM; Ik brûk in SSD as it systeem skiif. Ik sil debian 8 brûke as myn haadûntwikkelingssysteem, mei emacs, sudo, git en virtualbox-pakketten ynstalleare, al it oare sil ynstalleare wurde troch te downloaden fan GitHub en oare boarnen. Wy sille dizze applikaasjes yn /usr/local/bin ynstallearje, útsein as oars oanjûn. Litte wy begjinne!

It tarieden fan de wurkomjouwing

Ynstallaasje fan Go

Wy folgje de ynstruksjes fan 'e offisjele webside:

$ 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

Kontrolearje funksjonaliteit:

$ 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

Ynstallaasje fan faas-cli

Wy folgje de ynstruksjes fan 'e offisjele webside:

$ 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

Derneist kinne jo bash-foltôging ynskeakelje:

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

Ynstallaasje en konfiguraasje fan Kubernetes

Foar ûntwikkeling is minikube genôch, dus ynstallearje it en kubelet yn /usr/local/bin, en ynstallearje helm om applikaasjes te ynstallearjen:

$ 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 starte:

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

Wy kontrolearje:

$ 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

Ynstallaasje fan OpenFaaS

De ûntwikkelders advisearje it meitsjen fan 2 nammeromten om mei te wurkjen:

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

Foegje in repository ta foar helm:

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

De kaart hat de mooglikheid om in wachtwurd yn te stellen foar ynstallaasje, litte wy it brûke en de tagongsgegevens bewarje as in 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

Litte wy ynsette:

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

Nei in skoft rinne wy ​​it foarstelde kommando út:

$ 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

Kontrolearje funksjonaliteit:

$ 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

Ynstallaasje fan Mongodb

Wy ynstallearje alles mei help fan 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 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

Wy kontrolearje:

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 kontener út te gean.

Emacs ynstelle

Yn prinsipe, alles wie al konfigurearre neffens dit artikel, dus ik sil net yn detail gean.

It spul ôfbrekke yn funksjes

Ynteraksje mei funksjes wurdt útfierd fia it http-protokol, end-to-end autentikaasje tusken ferskate funksjes wurdt fersoarge troch JWT. Mongodb wurdt brûkt om tokens op te slaan, lykas spielstatus, spilergegevens, sekwinsjes fan bewegingen fan alle spultsjes en oare ynformaasje. Litte wy de meast nijsgjirrige funksjes fan tichterby besjen.

registraasje

De ynfier fan dizze funksje is JSON mei de spielnamme en wachtwurd. As dizze funksje oanroppen wurdt, wurdt kontrolearre dat dizze alias net yn 'e databank is as de kontrôle suksesfol is, wurde de alias en wachtwurdhash ynfoege. Registraasje is nedich om aktyf meidwaan oan it spul.

entry

De funksje-ynfier is JSON mei in spielnamme en wachtwurd as d'r in bynamme is yn 'e databank en it wachtwurd is mei súkses ferifiearre mei de earder bewarre yn' e databank, wurdt in JWT weromjûn, dy't moatte wurde trochjûn oan oare funksjes as se binne; neamd. Ferskate tsjinst records wurde ek ynfoege yn de databank, Bygelyks, lêste oanmeldtiid, etc.

Besjoch in list mei spultsjes

Elke net autorisearre brûker kin in list oanfreegje fan alle spultsjes útsein aktive. In autorisearre brûker sjocht ek in list mei aktive spultsjes. It resultaat fan 'e funksje is JSON mei listen mei spultsjes (spultsje-ID, minsklik lêsbere namme, ensfh.).

Game skepping

De funksje wurket allinnich mei autorisearre brûkers it maksimum oantal spilers wurdt akseptearre by de ynfier, likegoed as spultsje parameters (bygelyks, hokker karakters te aktivearjen yn dit spul, it maksimum oantal spilers, ensfh). In aparte parameter fan it spultsje is de oanwêzigens fan in wachtwurd foar meidwaan, wêrtroch jo net-iepenbiere spultsjes kinne meitsje. Standert wurdt in iepenbier spultsje makke. It resultaat fan 'e funksje is JSON, dy't in suksesfjild foar oanmeitsjen befettet, in unike spielidentifikator en oare parameters.

Joining in spultsje

De funksje wurket allinich mei autorisearre brûkers, de ynfier is de spiel-ID en har wachtwurd, as dit in net-iepenbier spultsje is, is de útfier JSON mei de spielparameters. De autorisearre brûker dy't meidien hat oan it spultsje, lykas de makker fan it spultsje, wurde hjirnei spultsje-dielnimmers neamd.

Besjoch spultsje eveneminten

Eltse net autorisearre brûker kin freegje in list mei eveneminten foar ynaktive spultsjes, en in autorisearre brûker kin ûntfange in list fan eveneminten foar eltse aktive spultsje. In ekstra parameter foar de funksje kin it barrennûmer wêze dat de brûker al hat. Yn dit gefal sille allinich de eveneminten dy't letter barde wurde weromjûn yn 'e list. Troch dizze funksje periodyk te starten, sjocht in autorisearre brûker wat der bart yn it spultsje. Dizze funksje jout ek in aksjefersyk werom, dêr't de brûker kin reagearje op mei help fan it spultsje syn evenemint dispatch funksje.

It ferstjoeren fan in spultsje evenemint

De funksje wurket allinich foar spielers: it is mooglik om it spultsje te begjinnen, in beweging te meitsjen, te stimmen, in tekstberjocht te skriuwen dat wurdt werjûn yn 'e list mei spultsje-eveneminten, ensfh.
De autorisearre brûker dy't it spultsje makke, begjint rollen te fersprieden oan alle dielnimmers yn it spul, ynklusyf harsels, se moatte har rol befestigje mei deselde funksje. Sadree't alle rollen binne befêstige, skeakelt it spultsje automatysk oer nei nachtmodus.

Game statistiken

De funksje wurket allinnich foar game dielnimmers it toant de steat fan it spul, de list en it oantal spilers (bynammen), rollen en harren status (ferhuzing makke of net), likegoed as oare ynformaasje. Lykas by de foarige funksje, alles wurket allinnich foar game dielnimmers.

Periodyk lansearre funksjes

As it spultsje in skoft net is lansearre opjûn by it meitsjen fan it spultsje, sil it automatysk fuortsmiten wurde fan 'e list mei aktive spultsjes mei de dúdlike funksje.

In oare periodike taak is it twongen wikseljen fan 'e spielmodus fan nacht nei dei en werom foar spultsjes wêrfoar dit net barde yn' e beurt (bygelyks in spiler dy't reagearje moat op in spultsje-evenemint hat om ien of oare reden syn oplossing net stjoerd ).

Meidieling

  • Ynlieding
  • It opsetten fan de ûntwikkelingsomjouwing, it opbrekken fan de taak yn funksjes
  • Backend wurk
  • Frontend wurk
  • CICD opsette, testen organisearje
  • Begjin in proefspultsje sesje
  • Resultaten

Boarne: www.habr.com

Add a comment