»Nove Bine«. Jejmo slona po delih

»Nove Bine«. Jejmo slona po delih

V tem članku bom nastavil delovno okolje za razvoj igre 'Bajke' ter razdelil samo igro na dele, primerne za uporabo v OpenFaaS. Vse manipulacije bom izvajal na Linuxu, Kubernetes bom razvil v minikube z uporabo VirtualBoxa. Na mojem delovnem računalniku sta 2 procesorski jedri in 12 GB RAM-a, kot sistemsko napravo uporabljam SSD. Kot glavni sistem za razvoj bom uporabljal debian 8, z nameščenimi paketi emacs, sudo, git in virtualbox, vse ostalo pa bom namestil z nalaganjem iz GitHub-a in drugih virov. Te aplikacije bomo namestili v /usr/local/bin, razen če ni navedeno drugače. Začnimo!

Priprava delovnega okolja

Namestitev Go

Sledite navodilom z uradne strani:

$ 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

Preverimo delovanje:

$ 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

Namestitev faas-cli

Sledite navodilom z uradne strani:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Prenos paketa https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli na /tmp/faas-cli
Prenos končan.

Izvaja se z dovolj dovoljenji, da poskusi premakniti faas-cli v /usr/local/bin
Nova različica faas-cli nameščena v /usr/local/bin
Ustvarjanje psevdonima 'faas' za 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 različica: 0.11.3

Dodatno lahko omogočite delo bash-completion:

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

Namestitev in nastavitev Kubernetes

Za razvoj je dovolj minikube, zato ga bomo namestili skupaj s kubelet v /usr/local/bin, za namestitev aplikacij bomo prav tako namestili 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

Zagnemo minikube:

$ minikube start
  minikube v1.6.2 na Debian 8.11
  Samodejno izbran 'virtualbox' gonilnik (alternativa: [])
  Prenos slike za zagon 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
  Ustvarjanje virtualbox VM (CPU=2, Pomnilnik=8192MB, Disk=20000MB) ...
  Priprava Kubernetes v1.17.0 na Docker '19.03.5' ...
  Prenos kubeadm v1.17.0
  Prenos kubelet v1.17.0
  Pridobivanje slik ...
  Zagon Kubernetes ...  Čakanje, da bo klaster na spletu ...
  Končano! kubectl je zdaj konfiguriran za uporabo "minikube"

Preverimo:

$ kubectl get pods --all-namespaces
IMENSKO PROSTOR     IME                                 PRIPRAVLEN    STATUS   ZNOVA        STAROST
kube-system   coredns-6955765f44-knlcb           1/1          Deluje   0           29m
kube-system   coredns-6955765f44-t9cpn           1/1          Deluje   0           29m
kube-system   etcd-minikube                      1/1          Deluje   0           28m
kube-system   kube-addon-manager-minikube        1/1          Deluje   0           28m
kube-system   kube-apiserver-minikube            1/1          Deluje   0           28m
kube-system   kube-controller-manager-minikube   1/1          Deluje   0           28m
kube-system   kube-proxy-hv2wc                   1/1          Deluje   0           29m
kube-system   kube-scheduler-minikube            1/1          Deluje   0           28m
kube-system   storage-provisioner                1/1          Deluje   1           29m

Namestitev OpenFaaS

Razvijalci priporočajo ustvariti 2 imenska prostora za delo:

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

Dodajamo repozitorij za helm:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" je bil dodan v vaše repozitorije

V chartu je mogoče nastaviti geslo pred namestitvijo, izkoristimo to in shranimo podatke za dostop v obliki skrivnosti 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 ustvarjen

Izvajamo namestitev:

$ helm repo update
Samo trenutek, medtem ko pridobivamo najnovejše iz vaših repozitorijev s charti...
...Uspešno smo dobili posodobitev iz repozitorija "openfaas"
Posodobitev zaključena.  Veselo Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Izdaja "openfaas" ne obstaja. Namestitev zdaj.
IME: openfaas
ZADNJA NAMESTITEV: Pet Dec 25 10:28:22 2019
IMENSKO PROSTOR: openfaas
STATUS: nameščen
REVIZIJA: 1
TESTNA ENOTA: Ni
OPOMBE:
Da preverite, da se je openfaas zagnal, zaženite:

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

Po nekaj trenutnem zagonu zaženite predlagano ukaz:

$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
IME                PRIPRAVLEN   DO-DATUM  NA VOLJO   STAROST
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

Preverimo delovanje:

$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" успешно развернут
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Перенаправление с 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Обращение к серверу OpenFaaS для проверки учетных данных...
Обработка соединения для 8080
ПРЕДУПРЕЖДЕНИЕ! Связь не защищена, пожалуйста, рассмотрите возможность использования HTTPS. Letsencrypt.org предлагает бесплатные SSL/TLS сертификаты.
учетные данные сохранены для admin http://127.0.0.1:8080
$ faas-cli list
Функция                        Вызовы     Реплики

Установка MongoDB

Устанавливаем всё с помощью helm:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" был добавлен в ваши репозитории
$ helm install stable/mongodb --generate-name
ИМЯ: mongodb-1577466908
ПОСЛЕДНЕЕ РАЗВЕРТЫВАНИЕ: Пт Дек 25 11:15:11 2019
ПРОСТРАНСТВО: default
СТАТУС: развернут
РЕВИЗИЯ: 1
ТЕСТОВЫЙ НАБОР: Нет
ПРИМЕЧАНИЯ:
** Пожалуйста, будьте терпеливы, пока осуществляется развертывание чарта **

MongoDB можно будет получить через порт 27017 по следующему DNS-имени изнутри вашего кластера:

    mongodb-1577466908.default.svc.cluster.local

Чтобы получить корневой пароль выполните:

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

Чтобы подключиться к вашей базе данных выполните следующую команду:

    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

Чтобы подключиться к вашей базе данных из-за пределов кластера выполните следующие команды:

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

Preverimo:

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)
Если вы не видите командную строку, попробуйте нажать Enter.

> db.version();
4.0.14

Нажимаем ctrl+D для выхода из контейнера.

Настройка emacs

В принципе, все уже было настроено по this article, так что не буду подробно расписывать.

Разбиение игры на функции

Взаимодействие с функциями осуществляется посредством протокола http, сквозная аутентификация между различными функциями обеспечивается JWT. Для хранения токенов, а также состояния игры, данных игроков, последовательностей ходов всех игр и другой информации используется MongoDB. Давайте подробнее рассмотрим наиболее интересные функции.

Registracija

На входе этой функции — JSON с игровым псевдонимом и паролем. При вызове этой функции выполняется проверка на отсутствие этого псевдонима в базе данных, при успешной проверке — вставка псевдонима и хэша пароля в базу. Регистрация необходима для активного участия в игре.

Vhod

Na vstupu funkce je JSON s herním pseudonymem a heslem, pokud je pseudonym v databázi a bylo úspěšně ověřeno heslo, vrátí se JWT, který je třeba předat jiným funkcím při jejich volání. Také se provádí vkládání různých systémových záznamů do databáze, například čas posledního přihlášení a podobně.

Prohlížení seznamu her

Každý neautorizovaný uživatel může požádat o seznam všech her kromě aktivních. Autorizovaný uživatel také vidí seznam aktivních her. Výsledek funkce je JSON, obsahující seznamy her (identifikátor hry, čitelné jméno atd.).

Ustvarjanje igre

Funkce funguje pouze s autorizovanými uživateli, na vstupu se přijímá maximální počet hráčů a parametry hry (například, jaké postavy aktivovat v této hře, maximální počet hráčů atd.). Samostatným parametrem hry je existence hesla pro připojení, což umožňuje vytvářet neveřejné hry. Ve výchozím nastavení se vytváří veřejná hra. Výsledkem provedení funkce je JSON, který obsahuje pole úspěšnosti vytvoření, unikátní identifikátor hry a další parametry.

Připojení k hře

Funkce funguje pouze s autorizovanými uživateli, na vstupu — identifikátor hry a její heslo, pokud se jedná o neveřejnou hru, na výstupu — JSON s parametry hry. Autorizovaný uživatel, který se připojil k hře, a také její tvůrce se nazývají účastníci hry.

Prohlížení událostí hry

Každý neautorizovaný uživatel může požádat o seznam událostí neaktivních her, zatímco autorizovaný — může získat seznam událostí jakékoli aktivní hry. Dalším parametrem funkce může být předán číslo události, kterou již má uživatel. V takovém případě se v seznamu vrátí pouze ty události, které se staly později. Periodicky spouštěním této funkce autorizovaný uživatel sleduje, co se děje ve hře. Tato funkce také vrací požadavek na akci, na kterou může uživatel reagovat pomocí funkce odeslání události hry.

Odeslat událost hry

Funkcija deluje samo za udeležence igre: omogoča možnost, da zaženete igro, naredite potezo, glasujete, napišete besjedilo, ki se prikaže na seznamu dogodkov igre itd.
Avtorizirani uporabnik, ki je ustvaril igro, dodeli vloge vsem udeležencem igre, vključno s seboj, ki morajo potrditi svojo vlogo s to isto funkcijo. Ko so vse vloge potrjene, igra samodejno preide v nočni način.

Statistika igre

Funkcija deluje samo za udeležence igre, prikazuje stanje igre, seznam in število igralcev (vzdevki), vloge in njihov status (ali je bila poteza narejena ali ne), ter druge informacije. Tako kot za prejšnjo funkcijo, vse deluje samo za udeležence igre.

Periodično zagnane funkcije

Če igra ni bila zagnana v določenem času, navedenem ob ustvarjanju igre — bo samodejno odstranjena s seznama aktivnih iger s funkcijo čiščenja.

Še ena periodična naloga — prisilno preklapljanje načina igre iz nočnega v dnevni in obratno za igre, ki tega niso storile med potezo (na primer, igralec, ki se mora odzvati na dogodek igre, ni poslal svoje rešitve iz kakršnega koli razloga).

Najava

  • Uvod
  • Namestitev okolja za razvoj, razdelitev naloge na funkcije
  • Delo na backendu
  • Delo na frontend
  • Nastavitev CICD, organizacija testiranja
  • Zagon preizkusne seje igre
  • Zaključki

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster