
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' >> ~/.profileKontrollojmë 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, worldInstalimi 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.3Për më shumë mund të aktivizoni funksionimin bash-completion:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstalimi 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/binPo 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 29mInstalimi 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 krijuarShtojmë repositorin për helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" është shtuar në repo tuajNë 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 krijuaPo 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 114sKontrollojmë 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 ReplikatInstalimi 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_PASSWORDPo 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.14Shtypni ctrl+D për të dalë nga kontejneri.
Konfigurimi i emacs
Në principe, gjithçka ishte tashmë e konfiguruar sipas , 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
- 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
