«Bajtarët e rinj». Hamë elefantin pjesë-pjesë

«Bajtarët e rinj». Hamë elefantin pjesë-pjesë

Në këtë artikull do të konfiguroni mjedisin e punës për zhvillimin e lojës 'Byliny', si dhe do të ndaj lojën në pjesë të përshtatshme për përdorim në OpenFaaS. Të gjitha manovrat do të bëhen në Linux, Kubernetes do të vendoset në minikube duke përdorur VirtualBox. Në makinën time të punës kam 2 bërthama procesori dhe 12 GB RAM, dhe si disk sistemik përdor një SSD. Si sistemin kryesor për zhvillim do të përdor debian 8, me paketat e instaluara emacs, sudo, git dhe virtualbox, gjithçka tjetër do ta instaloj duke e shkarkuar nga GitHub dhe burime të tjera. Këto aplikacione do t'i instalojmë në /usr/local/bin, nëse nuk përcaktohet ndryshe. Le të fillojmë!

Përgatitja e mjedisit të punës

Instalimi i Go

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

Ndjekim udhëzimet nga faqja zyrtare:

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

Duke funksionuar me leje të mjaftueshme për të provuar të lëvizni faas-cli në /usr/local/bin
Versioni i ri i faas-cli u instalua në /usr/local/bin
Po krijojmë aliasin 'faas' për 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 version: 0.11.3

Për më shumë mund të aktivizoni funksionimin 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, të cilin do ta instalojmë së bashku me kubelet në /usr/local/bin, për instalimin e aplikacioneve gjithashtu do të instalojmë 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

Po nisemi minikube:

$ minikube start
  minikube v1.6.2 në Debian 8.11
  Automatikisht u zgjodh drejtuesi 'virtualbox' (alternativa: [])
  Po shkarkohet imazhi i boot-it VM ...
    > 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
  Kreu VM të virtualbox (CPUs=2, Memorie=8192MB, Disk=20000MB) ...
  Po përgatitet Kubernetes v1.17.0 në Docker '19.03.5' ...
  Po shkarkohet kubeadm v1.17.0
  Po shkarkohet kubelet v1.17.0
  Po shpullohen imazhe ...
  Po nis Kubernetes ...  Po presim që klasteri të kalojë online ...
  E përfunduar! kubectl tani është konfiguruar për të përdorur "minikube"

Po kontrollojmë:

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-knlcb           1/1     Po funksionon   0          29m
kube-system   coredns-6955765f44-t9cpn           1/1     Po funksionon   0          29m
kube-system   etcd-minikube                      1/1     Po funksionon   0          28m
kube-system   kube-addon-manager-minikube        1/1     Po funksionon   0          28m
kube-system   kube-apiserver-minikube            1/1     Po funksionon   0          28m
kube-system   kube-controller-manager-minikube   1/1     Po funksionon   0          28m
kube-system   kube-proxy-hv2wc                   1/1     Po funksionon   0          29m
kube-system   kube-scheduler-minikube            1/1     Po funksionon   0          28m
kube-system   storage-provisioner                1/1     Po funksionon   1          29m

Instalimi i OpenFaaS

Zhvilluesit rekomandojnë të krijoni 2 namespace për punë:

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

Shtojmë repositorin për helm:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" është shtuar në repo tuaj

Në chart ka mundësinë për të vendosur një fjalëkalim përpara instalimit, le të e shfrytëzojmë dhe ta ruajmë informacionin 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"
sekreti/basic-auth u krijua

Po kryejmë dislokimin:

$ helm repo update
Fiksohuni derisa ne të marrim të fundit nga depozitë tuaja të chart...
...Përditësimi nga depozitë e chart "openfaas" u suksesshëm
Përditësimi i plotë. Gëzuar Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Lëshimi "openfaas" nuk ekziston. Po e instalojmë tani.
EMRI: openfaas
DISLOKUAR KOHË: E Premte, 25 Dhjetor 2019, 10:28:22
NAMESPACE: openfaas
STATUSI: i deployuar
REVIZIONI: 1
TEST SUITE: Asnjë
SHENIMET:
Për të verifikuar që openfaas ka filluar, ekzekutoni:

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

Pas një kohe, ekzekutojmë komandën e propozuar:

$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
EMRI                GATI   UP-TO-DATE   TË DISPONUESHME   MOSHA
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" u implementua me sukses
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Dërgimi nga 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Po thërras serverin OpenFaaS për të verifikuar kredencialet...
Duke trajtuar lidhjen për 8080
KËSHILLË! Komunikimi nuk është i sigurt, ju lutemi shqyrtoni përdorimin e HTTPS. Letsencrypt.org ofron certifikata falas SSL/TLS.
kredencialet janë ruajtur për admin http://127.0.0.1:8080
$ faas-cli list
Funksioni                        Thirrjet     Replikat

Instalimi i Mongodb

Po instalojmë gjithçka duke përdorur helm:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" është shtuar në depozitë tuaja
$ helm install stable/mongodb --generate-name
EMRI: mongodb-1577466908
INSTALUAR SË FRESH: Premte, 25 Dhjetor 2019, 11:15:11
KUPA: default
STATUSI: instaluar
REVIZIONI: 1
SHEKULLI I TESTIT: Asnjë
SHENIMET:
** Ju lutemi tregoni durim ndërsa diagrami po instalohet **

MongoDB mund të aksesohet përmes portit 27017 në emrin e DNS sa vijon nga brenda klustrit tuaj:

    mongodb-1577466908.default.svc.cluster.local

Për të marrë fjalëkalimin root, 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ë dhënash, 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ë dhënash 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 e shihni një komandë, provoni të shtypni enter.

> db.version();
4.0.14

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

Konfigurimi i emacs

Në principe, gjithçka ishte tashmë e konfiguruar sipas këtë artikull, kështu që nuk do e shpjegoj shpërsisht.

Pjesëtimi i lojës në funksione

Interaksioni me funksionet realizohet përmes protokollit http, autentifikimi nëpërmjet të gjitha funksioneve sigurohet nga JWT. Për ruajtjen e tokeneve, si dhe gjendjen e lojës, të dhënat e lojtarëve, sekuencat e lëvizjeve të të gjitha lojërave dhe informacion të tjera përdoret mongodb. Le të shqyrtojmë më në detaje funksionet më interesante.

Regjistrimi

Inputi i kësaj funksioni është një JSON me pseudonimin dhe fjalëkalimin e lojës. Kur thirret ky funksion, bëhet një kontroll për të parë nëse ky pseudonim nuk ekziston në bazën e të dhënave, dhe pas verifikimit të suksesshëm — futet pseudonimi dhe hash-i i fjalëkalimit në bazë. Regjistrimi është i nevojshëm për pjesëmarrje aktive në lojë.

Hyrje

Funksioni pranon një JSON me emrin e lojtarit dhe fjalëkalimin. Nëse emri është në bazë dhe fjalëkalimi është verifikuar me sukses, kthehet një JWT, i cili duhet të përcillet në funksione të tjera gjatë thirrjes. Po ashtu, kryhet vendosja në bazë e regjistrimeve shërbimi të ndryshëm, si për shembull koha e fundit e hyrjes etj.

Shikoni listën e lojërave

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

Krijimi i një loje

Funksioni punon vetëm me përdorues të autorizuar, ku pranohen numri maksimal i lojtarëve, si dhe parametra të lojës (p.sh., cilët karaktere të aktivizohen në këtë lojë, numri maksimal i lojtarëve, etj.). Një parameter i veçantë i lojës është prania e një fjalëkalimi për t'u bashkuar, gjë që lejon krijimin e lojërave jo-publik. Në mënyrë të paracaktuar, krijohet një lojë publike. Rezultati i ekzekutimit të funksionit është një JSON, i cili përmban një fushë suksesi të krijimit, një identifikues unik të lojës, si dhe parametra të tjerë.

Bashkimi në lojë

Funksioni punon vetëm me përdorues të autorizuar, ku në hyrje pranohet identifikuesi i lojës dhe fjalëkalimi i saj, nëse është një lojë jo-publik, ndërsa në dalje kemi një JSON me parametrat e lojës. Përdoruesi i autorizuar, i cili është bashkuar me lojën, si dhe krijuesi i lojës, quhen pjesëmarrës të lojës.

Shikimi i ngjarjeve të lojës

Çdo përdorues i paautorizuar mund të kërkojë një listë ngjarjesh të lojërave joaktive, ndërsa një i autorizuar mund të marrë një listë ngjarjesh për çdo lojë aktive. Si një parametër shtesë, funksioni mund të pranojë numrin e ngjarjes që përdoruesi tashmë ka. Në këtë rast, lista do të kthejë vetëm ato ngjarje që ndodhen më vonë. Duke e ekzekutuar këtë funksion herë pas here, 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ë duke dërguar një ngjarje loje.

Dërgimi i ngjarjes së lojës

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

Statistikat e lojës

Funksioni punon vetëm për anëtarët e lojës, tregon gjendjen e lojës, listën dhe numrin e lojtarëve (pseudonimet), rolet dhe statusin e tyre (shtë kulmuar, apo jo), si dhe informacion tjetër. Siç është rasti edhe për funksionin e mëparshëm, gjithçka punon vetëm për anëtarët e lojës.

Funksionat e nisura periodicisht

Nëse loja nuk është nisur për një periudhë të caktuar kohe, e cila është caktuar gjatë krijimit të lojës — ajo do të fshihet automatikisht nga lista e lojërave aktive me anë të funksionit të pastrimit.

Një detyrë tjetër periodike — kalimi i detyruar të mënyrës së lojës nga nata në ditë dhe anasjelltas për lojërat që nuk e kanë bërë këtë gjatë lëvizjes (për shembull, një lojtar që duhet të reagojë ndaj një ngjarjeje të lojës, nuk e ka dërguar zgjidhjen e tij për ndonjë arsye).

Ankandi

  • Hyrje
  • Vendosja e ambientit për zhvillim, ndarja e detyrës në funksione
  • Puna mbi backend
  • Puna mbi frontend
  • Konfigurimi i CICD, organizimi i testimit
  • Nisja e një seance provuese të lojës
  • Përfundimet

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster