"Yeni dastanlar". Biz fili hissə-hissə yeyirik

"Yeni dastanlar". Biz fili hissə-hissə yeyirik

Bu yazıda mən "Epics" oyununu inkişaf etdirmək üçün iş mühiti quracağam və eyni zamanda oyunun özünü OpenFaaS-də istifadə üçün uyğun hissələrə ayıracağam. Linux-da bütün manipulyasiyaları edəcəyəm, VirtualBox istifadə edərək minikube-də Kubernetes yerləşdirəcəyəm. İş maşınımda 2 prosessor nüvəsi və 12 GB RAM var; mən sistem diski kimi SSD istifadə edirəm. Əsas inkişaf sistemim kimi debian 8-dən istifadə edəcəyəm, emacs, sudo, git və virtualbox paketləri quraşdırılıb, qalan hər şey GitHub və digər mənbələrdən endirməklə quraşdırılacaq. Başqa cür göstərilmədiyi təqdirdə bu proqramları /usr/local/bin-də quraşdıracağıq. Gəlin başlayaq!

İş mühitinin hazırlanması

Go quraşdırılır

Rəsmi veb saytından təlimatlara əməl edirik:

$ 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

Funksionallığın yoxlanılması:

$ 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

Faas-cli quraşdırılması

Rəsmi veb saytından təlimatlara əməl edirik:

$ 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

Əlavə olaraq, bash tamamlamasını aktivləşdirə bilərsiniz:

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

Kubernetes-in quraşdırılması və konfiqurasiyası

İnkişaf üçün minikube kifayətdir, ona görə də onu və kubelet-i /usr/local/bin-ə quraşdırın və proqramları quraşdırmaq üçün sükanı quraşdırın:

$ 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-ni işə salın:

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

Yoxlayırıq:

$ 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

OpenFaaS quraşdırılması

Tərtibatçılar işləmək üçün 2 ad sahəsi yaratmağı tövsiyə edirlər:

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

Sükan üçün depo əlavə edin:

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

Diaqram quraşdırmadan əvvəl parol təyin etmək imkanına malikdir, gəlin ondan istifadə edək və giriş məlumatlarını k8s sirri kimi saxlayaq:

$ 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

Yerləşdirək:

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

Bir müddət sonra təklif olunan əmri yerinə yetiririk:

$ 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

Funksionallığın yoxlanılması:

$ 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

Mongodb quraşdırılması

Sükandan istifadə edərək hər şeyi quraşdırırıq:

$ 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

Yoxlayırıq:

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

Konteynerdən çıxmaq üçün ctrl+D düymələrini basın.

emacs qurulması

Prinsipcə, hər şey artıq uyğun olaraq konfiqurasiya edilmişdir Bu məqalə, ona görə də təfərrüata varmayacağam.

Oyunu funksiyalara bölmək

Funksiyalarla qarşılıqlı əlaqə http protokolu vasitəsilə həyata keçirilir, müxtəlif funksiyalar arasında başdan sona autentifikasiya JWT tərəfindən təmin edilir. Mongodb tokenləri, həmçinin oyun vəziyyətini, oyunçu məlumatlarını, bütün oyunların hərəkət ardıcıllığını və digər məlumatları saxlamaq üçün istifadə olunur. Ən maraqlı xüsusiyyətlərə daha yaxından nəzər salaq.

qeyd

Bu funksiyanın girişi oyun ləqəbi və şifrəsi olan JSON-dur. Bu funksiya çağırıldıqda, bu ləqəbin verilənlər bazasında olmadığı yoxlanılır, yoxlama uğurlu olarsa, ləqəb və parol hash verilənlər bazasına daxil edilir. Oyunda aktiv iştirak etmək üçün qeydiyyatdan keçmək lazımdır.

giriş qapısı

Funksiya girişi oyun ləqəbi və parolu olan JSON-dur; əgər verilənlər bazasında ləqəb varsa və parol verilənlər bazasında əvvəllər saxlanmış parolla uğurla yoxlanılırsa, JWT qaytarılır, onlar işlədikdə digər funksiyalara ötürülməlidir. çağırdı. Verilənlər bazasına müxtəlif xidmət qeydləri də daxil edilir, məsələn, son giriş vaxtı və s.

Oyunların siyahısına baxın

İstənilən icazəsiz istifadəçi aktiv oyunlardan başqa bütün oyunların siyahısını tələb edə bilər. Səlahiyyətli istifadəçi aktiv oyunların siyahısını da görür. Funksiyanın nəticəsi oyunların siyahılarını (oyun identifikatoru, insan tərəfindən oxuna bilən ad və s.) ehtiva edən JSON-dur.

Oyun yaradılması

Funksiya yalnız səlahiyyətli istifadəçilərlə işləyir, girişdə maksimum oyunçu sayı, həmçinin oyun parametrləri (məsələn, bu oyunda hansı simvolların aktivləşdirilməsi, oyunçuların maksimum sayı və s.) qəbul edilir. Oyunun ayrı bir parametri, ictimai olmayan oyunlar yaratmağa imkan verən qoşulmaq üçün parolun olmasıdır. Varsayılan olaraq, ictimai oyun yaradılır. Funksiyanın nəticəsi yaradılış uğuru sahəsini, unikal oyun identifikatorunu və digər parametrləri ehtiva edən JSON-dur.

Oyuna qoşulmaq

Funksiya yalnız səlahiyyətli istifadəçilərlə işləyir, giriş oyun identifikatoru və onun paroludur, əgər bu ictimai olmayan oyundursa, çıxış oyun parametrləri ilə JSON-dur. Oyuna qoşulmuş səlahiyyətli istifadəçi, həmçinin oyunun yaradıcısı bundan sonra oyunun iştirakçıları adlanır.

Oyun hadisələrinə baxılır

İstənilən icazəsiz istifadəçi qeyri-aktiv oyunlar üçün hadisələrin siyahısını tələb edə bilər və səlahiyyətli istifadəçi istənilən aktiv oyun üçün hadisələrin siyahısını ala bilər. Funksiyaya əlavə parametr istifadəçinin artıq sahib olduğu hadisə nömrəsi ola bilər. Bu halda, siyahıda yalnız sonradan baş vermiş hadisələr geri qaytarılacaq. Bu funksiyanı vaxtaşırı işə salmaqla səlahiyyətli istifadəçi oyunda baş verənləri izləyir. Bu funksiya həmçinin istifadəçinin oyunun hadisə göndərmə funksiyasından istifadə edərək cavab verə biləcəyi fəaliyyət sorğusunu qaytarır.

Oyun hadisəsi göndərilir

Funksiya yalnız oyun iştirakçıları üçün işləyir: oyuna başlamaq, hərəkət etmək, səs vermək, oyun hadisələri siyahısında göstərilən mətn mesajı yazmaq və s.
Oyunu yaradan səlahiyyətli istifadəçi, özlərinə daxil olmaqla, oyunun bütün iştirakçılarına rol paylamağa başlayır, onlar eyni funksiyadan istifadə edərək öz rollarını təsdiqləməlidirlər. Bütün rollar təsdiqləndikdən sonra oyun avtomatik olaraq gecə rejiminə keçir.

Oyun statistikası

Funksiya yalnız oyun iştirakçıları üçün işləyir, o, oyunun vəziyyətini, oyunçuların siyahısını və sayını (ləqəblər), rolları və onların statusunu (hərəkətin edilib-edilməməsi), eləcə də digər məlumatları göstərir. Əvvəlki funksiyada olduğu kimi, hər şey yalnız oyun iştirakçıları üçün işləyir.

Dövri olaraq işə salınan funksiyalar

Oyunu yaratarkən müəyyən edilmiş bir müddət ərzində oyun işə salınmayıbsa, aydın funksiyasından istifadə edərək avtomatik olaraq aktiv oyunlar siyahısından silinəcək.

Başqa bir dövri vəzifə, növbə zamanı baş vermədiyi oyunlar üçün oyun rejiminin gecədən gündüzə və geriyə məcburi dəyişdirilməsidir (məsələn, oyun hadisəsinə reaksiya verməli olan oyunçu nədənsə həllini göndərmədi. ).

Duyurular

  • Giriş
  • İnkişaf mühitinin qurulması, tapşırığın funksiyalara bölünməsi
  • Backend işi
  • Frontend işi
  • CICD-nin qurulması, sınaqların təşkili
  • Sınaq oyun sessiyasına başlayın
  • Nəticələri

Mənbə: www.habr.com

Добавить комментарий