
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' >> ~/.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
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.3Shtesë mund të aktivizoni funksionalitetin e bash-completion:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstalimi 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/binNis 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 29mInstalimi 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 createdShtojmë depotin për helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositoriesNë 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 createdKryejmë 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 114sKontrollojmë 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 ReplicasInstalimi 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_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 shihni një nxitje komandash, provoni të shtypni enter.
> db.version();
4.0.14Shtypni ctrl+D për të dalë nga kontejneri.
Konfigurimi i emacs
Në princip, gjithçka ishte tashmë e konfiguruar sipas , 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
- 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
