«Bajloja e re». E marrim elefantin pjesë-pjesë

«Bajloja e re». E marrim elefantin pjesë-pjesë

Në këtë artikull do të konfiguroj ambientin e punës për zhvillimin e lojës „Byliny“, si dhe do të ndaje lojën në pjesë të përshtatshme për përdorim në OpenFaaS. Të gjitha manipulimet do t'i bëj në Linux, ndërsa Kubernetes do ta nis në minikube duke përdorur VirtualBox. Në makinën time të punës kam 2 bërthama procesori dhe 12GB RAM, duke përdorur SSD si diskun sistemor. Si sistemin kryesor për zhvillim do të përdor Debian 8, me paketat e instaluara emacs, sudo, git dhe virtualbox, dhe të gjitha aplikacionet e tjera do t'i instaloj duke i shkarkuar nga GitHub dhe burime të tjera. Këto aplikacione do t'i instaloj në /usr/local/bin, përveç nëse tregohet ndryshe. Le të fillojmë!

Përgatitja e ambientit të punës

Instalimi i Go

Të ndjekim udhëzimet nga faqja zyrtare:

$ 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

Kontrollojmë funksionalitetin:

$ 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

Instalimi i faas-cli

Të ndjekim udhëzimet nga faqja zyrtare:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Duke shkarkuar paketën https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli si /tmp/faas-cli
Shkarkimi përfundoi.

Duke funksionuar me lejet e mjaftueshme për të tentuar të lëvizë faas-cli në /usr/local/bin
Versioni i ri i faas-cli u instalua në /usr/local/bin
Krijimi i aliasit 'faas' për 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__ / ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 version: 0.11.3

Shtesë mund të aktivizoni funksionalitetin e bash-completion:

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

Instalimi dhe konfigurimi i Kubernetes

Për zhvillim mjafton minikube, kështu që do ta instalojmë atë dhe kubelet në /usr/local/bin, gjithashtu do të instalojmë helm për instalimin e aplikacioneve:

$ 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

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

Po kontrollojmë:

$ 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

Instalimi i OpenFaaS

Zhvilluesit rekomandojnë krijimin e 2 namespace për punë:

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

Shtojmë depotin për helm:

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

Në chart ka mundësi të vendosim një fjalëkalim përpara instalimit, do ta shfrytëzojmë dhe do të ruajmë të dhënat e qasjes si një sekret k8s:

$ 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

Kryejmë zhvillimin:

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

Pas një kohe të shkurtër, ekzekuton komandën e propozuar:

$ 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

Kontrollojmë funksionalitetin:

$ 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

Instalimi i Mongodb

Të gjithë instalimi me 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:
** Ju lutem, tregoni durim gjatë instalimit të grafikut **

MongoDB mund të aksesohet përmes portit 27017 me emrin DNS si më poshtë nga brenda klustrit tuaj:

    mongodb-1577466908.default.svc.cluster.local

Për të marrë fjalëkalimin e administratorit ekzekutoni:

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

Për të lidhur me bazën tuaj të të dhënave ekzekutoni komandën e mëposhtme:

    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

Për të lidhur me bazën tuaj të të dhënave nga jashtë klustrit ekzekutoni komandat e mëposhtme:

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

Po kontrollojmë:

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)
Nëse nuk shihni një nxitje komandash, provoni të shtypni enter.

> db.version();
4.0.14

Shtypni ctrl+D për të dalë nga kontejneri.

Konfigurimi i emacs

Në princip, gjithçka ishte tashmë e konfiguruar sipas këto artikuj, kështu që nuk do të bëj një përshkrim të detajuar.

Ndërprerja e lojës në funksione

Interaksioni me funksionet bëhet përmes protokollit http, autentifikimi i vazhdueshëm ndërmjet funksioneve të ndryshme sigurohet nga JWT. Për ruajtjen e tokeneve, si dhe gjendjes së lojës, të dhënave të lojtarëve, sekuencave të lëvizjeve të të gjitha lojërave dhe informacionit tjetër përdoret mongodb. Le të shikojmë më në detaje funksionet më interesante.

Regjistrim

Në hyrje të këtij funksioni — JSON me nofkën e lojës dhe fjalëkalimin. Në thirrjen e këtij funksioni bëhet kontrolli i mungesës së kësaj nofke në bazën e të dhënave, dhe pas verifikimit të suksesshëm — futja e nofkës dhe hash-it të fjalëkalimit në bazë. Regjistrimi është i nevojshëm për të marrë pjesë aktive në lojë.

Hyrja

Në hyrje të funksionit është një JSON me pseudonimin e lojtarit dhe fjalëkalimin, dhe nëse pseudonimi gjendet në bazë dhe verifikimi i fjalëkalimit me atë të ruajtur më parë brenda bazës është i suksesshëm, kthehet një JWT, i cili duhet të kalojë në funksione të tjera gjatë thirrjes së tyre. Po ashtu, realizohet futja në bazë e regjistrimeve të ndryshme shërbimi, si p.sh. koha e fundit të hyrjes, etj.

Shikimi i listës së lojërave

Cdo përdorues i paautorizuar mund të kërkojë një listë të të gjitha lojërave, përveç atyre aktive. Përdoruesit e autorizuar gjithashtu shohin edhe listën e lojërave aktive. Rezultati i funksionit është një JSON, që përmban lista të lojërave (identifikuesin e lojës, emrin e lexueshëm dhe etj.).

Krijimi i lojës

Funksioni funksionon vetëm me përdorues të autorizuar, në hyrje pranon numrin maksimal të lojtarëve, si dhe parametrat e lojës (p.sh. cilët personazhe të aktivizohen në këtë lojë, numri maksimal i lojtarëve, etj.). Një parametër i veçantë i lojës është prania e një fjalëkalimi për t'u bashkuar, që lejon krijimin e lojërave jo-publik. Për default krijohet një lojë publike. Rezultati i ekzekutimit të funksionit është një JSON, në të cilin ka një fushë suksesi të krijimit, një identifikues unik të lojës, si dhe parametra të tjerë.

Bashkimi në lojë

Funksioni funksionon vetëm me përdorues të autorizuar, në hyrje është identifikuesi i lojës dhe fjalëkalimi i saj, nëse është një lojë jo-publik, në dalje është një JSON me parametrat e lojës. Përdoruesi i autorizuar, i cili i bashkohet lojës, si dhe krijuesi i lojës do të quhen pjesëmarrës të lojës.

Shikimi i ngjarjeve të lojës

Cdo përdorues i paautorizuar mund të kërkojë një listë ngjarjesh të lojërave joaktive, ndërsa përdoruesi i autorizuar mund të marrë listën e ngjarjeve të cilësdo lojë aktive. Një parametër shtesë i funksionit mund të jetë numri i ngjarjes, e cila tashmë e ka përdoruesi. Në këtë rast, në listë do të kthehen vetëm ato ngjarje që ndodhën më vonë. Duke aktivizuar rregullisht këtë funksion, përdoruesi i autorizuar sheh se çfarë ndodh në lojë. Gjithashtu, ky funksion kthen një kërkesë për veprim, në të cilën përdoruesi mund të reagojë me anë të funksionit të dërgimit të ngjarjes së lojës.

Dërgimi i ngjarjes së lojës

Funksioni punon vetëm për pjesëmarrësit e lojës: ofrohet mundësia për të nisur lojën, për të bërë një lëvizje, për të votuar, për të shkruar një mesazh, i cili shfaqet në listën e ngjarjeve të lojës etj.
Përdoruesi i autorizuar, i cili ka krijuar lojën, nis shpërndarjen e roleve për të gjithë pjesëmarrësit e lojës, duke përfshirë veten e tij; ata duhet të konfirmojnë rolin e tyre përmes kësaj funksioni. Sapo të konfirmohen të gjitha rolet, loja kalon automatikisht në modin natë.

Statistika e lojës

Funksioni punon vetëm për pjesëmarrësit e lojës, tregon gjendjen e lojës, listën dhe numrin e lojtarëve (pseudonime), rolet dhe statusin e tyre (në lëvizje, ose jo), si dhe informacion të tjera. Si për funksionin e mëparshëm, gjithçka funksionon vetëm për pjesëmarrësit e lojës.

Funksionet e filluara periodikisht

Nëse loja nuk është nisur brenda një periudhe të caktuar, e cila është caktuar gjatë krijimit të lojës, ajo do të fshihet automatikisht nga lista e lojërave aktive përmes funksionit të pastrimit.

Një detyrë tjetër periodike është kalimi i detyrueshëm i modit të lojës nga natë në ditë dhe anasjelltas për lojërat, të cilat nuk e kanë bërë këtë gjatë lëvizjes (për shembull, një lojtar, i cili duhet të reagojë ndaj një ngjarjeje të lojës, nuk e ka dërguar zgjidhjen e tij për arsye të ndryshme).

Njoftim

  • Hyrje
  • Instalimi i mjedisit për zhvillim, ndarja e detyrës në funksione
  • Punët mbi backend
  • Punët mbi frontend
  • Konfigurimi i CICD, organizimi i testimit
  • Hapja e një seance provuese të lojës
  • Përfundime

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster