«Жаңа дастандар». Біз пілді бөліктерге бөліп жейміз

«Жаңа дастандар». Біз пілді бөліктерге бөліп жейміз

Бұл мақалада мен «Дастандар» ойынын әзірлеу үшін жұмыс ортасын орнатамын, сонымен қатар ойынды OpenFaaS-те қолдануға жарамды бөліктерге бөлемін. Мен Linux жүйесінде барлық манипуляцияларды жасаймын, VirtualBox көмегімен Kubernetes-ті minikube-де орналастырамын. Менің жұмыс машинамда 2 процессор өзегі және 12 ГБ жедел жады бар; мен жүйелік диск ретінде SSD пайдаланамын. Мен debian 8-ді негізгі әзірлеу жүйесі ретінде пайдаланамын, emacs, sudo, git және virtualbox пакеттері орнатылған, қалғанының барлығы GitHub және басқа көздерден жүктеп алу арқылы орнатылады. Басқаша көрсетілмесе, біз бұл қолданбаларды /usr/local/bin ішіне орнатамыз. Бастайық!

Жұмыс ортасын дайындау

Go орнату

Біз ресми сайттағы нұсқауларды орындаймыз:

$ 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

Функционалдылықты тексеру:

$ 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 орнату

Біз ресми сайттағы нұсқауларды орындаймыз:

$ 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

Сонымен қатар, сіз bash аяқтауды қоса аласыз:

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

Kubernetes орнату және конфигурациялау

Әзірлеу үшін minikube жеткілікті, сондықтан оны және kubelet-ті /usr/local/bin ішіне орнатыңыз және қолданбаларды орнату үшін рульді орнатыңыз:

$ 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 іске қосыңыз:

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

Тексеру:

$ 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 орнату

Әзірлеушілер жұмыс істеу үшін 2 атау кеңістігін құруды ұсынады:

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

Рульге репозиторий қосыңыз:

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

Диаграммада орнату алдында құпия сөз орнату мүмкіндігі бар, оны қолданайық және кіру деректерін 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 created

Орналастыруға рұқсат етіңіз:

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

Біраз уақыттан кейін біз ұсынылған пәрменді іске қосамыз:

$ 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

Функционалдылықты тексеру:

$ 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 орнатылуда

Біз бәрін руль арқылы орнатамыз:

$ 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

Тексеру:

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

Контейнерден шығу үшін ctrl+D пернелер тіркесімін басыңыз.

emacs орнату

Негізінде, бәрі қазірдің өзінде сәйкес конфигурацияланған Бұл мақала, сондықтан мен егжей-тегжейге тоқталмаймын.

Ойынды функцияларға бөлу

Функциялармен өзара әрекеттесу http протоколы арқылы жүзеге асырылады, әртүрлі функциялар арасындағы түпкілікті аутентификацияны JWT қамтамасыз етеді. Mongodb токендерді, сондай-ақ ойын күйін, ойыншы деректерін, барлық ойындардың қозғалыс ретін және басқа ақпаратты сақтау үшін қолданылады. Ең қызықты мүмкіндіктерді толығырақ қарастырайық.

Тіркелу

Бұл функцияның кірісі ойын лақап аты мен құпия сөзі бар JSON болып табылады. Бұл функция шақырылғанда, бұл бүркеншік аттың дерекқорда жоқтығы тексеріледі, егер тексеру сәтті болса, бүркеншік ат пен құпия сөз хэші дерекқорға енгізіледі. Ойынға белсенді қатысу үшін тіркелу қажет.

енгізу

Функция кірісі ойын лақап аты мен құпия сөзі бар JSON; егер дерекқорда лақап ат болса және құпия сөз дерекқорда бұрын сақталғанмен сәтті тексерілсе, JWT қайтарылады, олар орнатылған кезде басқа функцияларға берілуі керек. шақырды. Дерекқорға әртүрлі қызмет жазбалары да енгізіледі, мысалы, соңғы кіру уақыты және т.б.

Ойындар тізімін қараңыз

Кез келген рұқсат етілмеген пайдаланушы белсенді ойындардан басқа барлық ойындардың тізімін сұрай алады. Рұқсат етілген пайдаланушы белсенді ойындардың тізімін де көреді. Функцияның нәтижесі ойындар тізімдерін қамтитын JSON болып табылады (ойын идентификаторы, адам оқи алатын атау және т.б.).

Ойын құру

Функция тек рұқсаты бар пайдаланушылармен жұмыс істейді; енгізу кезінде ойыншылардың максималды саны, сондай-ақ ойын параметрлері қабылданады (мысалы, осы ойында қандай кейіпкерлерді белсендіру керек, ойыншылардың максималды саны және т.б.). Ойынның жеке параметрі - жалпыға қолжетімді емес ойындарды жасауға мүмкіндік беретін қосылуға арналған құпия сөздің болуы. Әдепкі бойынша, жалпыға ортақ ойын жасалады. Функция нәтижесі JSON болып табылады, ол жасау сәтті өрісін, бірегей ойын идентификаторын және басқа параметрлерді қамтиды.

Ойынға қосылу

Функция тек рұқсат етілген пайдаланушылармен жұмыс істейді, кіріс ойын идентификаторы және оның құпия сөзі, егер бұл жалпыға қолжетімді емес ойын болса, ойын параметрлері бар JSON шығысы. Ойынға қосылған уәкілетті пайдаланушы, сондай-ақ ойынды жасаушы бұдан әрі ойынға қатысушылар деп аталады.

Ойын оқиғаларын көру

Кез келген рұқсат етілмеген пайдаланушы белсенді емес ойындарға арналған оқиғалар тізімін сұрай алады, ал уәкілетті пайдаланушы кез келген белсенді ойынға арналған оқиғалар тізімін ала алады. Функцияның қосымша параметрі пайдаланушыда бұрыннан бар оқиға нөмірі болуы мүмкін. Бұл жағдайда тізімде кейінірек болған оқиғалар ғана қайтарылады. Бұл функцияны кезеңді түрде іске қосу арқылы авторизацияланған пайдаланушы ойында не болып жатқанын бақылайды. Бұл функция сонымен қатар пайдаланушы ойынның оқиғаны жіберу функциясы арқылы жауап бере алатын әрекет сұрауын қайтарады.

Ойын оқиғасын жіберу

Функция тек ойынға қатысушылар үшін жұмыс істейді: ойынды бастауға, қозғалыс жасауға, дауыс беруге, ойын оқиғаларының тізімінде көрсетілетін мәтіндік хабарлама жазуға және т.б.
Ойынды жасаған уәкілетті пайдаланушы рөлдерді ойынның барлық қатысушыларына, соның ішінде өздеріне де тарата бастайды, олар сол функцияны пайдаланып өз рөлін растауы керек. Барлық рөлдер расталғаннан кейін ойын автоматты түрде түнгі режимге ауысады.

Ойын статистикасы

Функция тек ойынға қатысушылар үшін жұмыс істейді, ол ойынның күйін, ойыншылардың тізімі мен санын (лақап аттар), рөлдер мен олардың күйін (қозғалыс жасалған немесе жасалмаған), сондай-ақ басқа ақпаратты көрсетеді. Алдыңғы функция сияқты, барлығы ойынға қатысушылар үшін ғана жұмыс істейді.

Мерзімді түрде іске қосылатын функциялар

Ойынды жасау кезінде белгілі бір уақыт ішінде ойын іске қосылмаса, ол тазалау функциясын пайдаланып белсенді ойындар тізімінен автоматты түрде жойылады.

Тағы бір мерзімді міндет - ойын режимін түннен күндізге және кері айналдыру кезінде бұл орын алмаған ойындар үшін мәжбүрлеп ауыстыру (мысалы, ойын оқиғасына әрекет ету керек ойыншы қандай да бір себептермен өз шешімін жібермеді. ).

Хабарландыру

  • Кіріспе
  • Әзірлеу ортасын орнату, тапсырманы функцияларға бөлу
  • Backend жұмысы
  • Фронтпен жұмыс
  • CICD орнату, тестілеуді ұйымдастыру
  • Сынақ ойын сеансын бастаңыз
  • Нәтижелері

Ақпарат көзі: www.habr.com

пікір қалдыру