"حماسه های جدید". فیل را تکه تکه می خوریم

"حماسه های جدید". فیل را تکه تکه می خوریم

در این مقاله، من یک محیط کاری برای توسعه بازی "Epics" راه اندازی می کنم و همچنین خود بازی را به قسمت های مناسب برای استفاده در OpenFaaS تقسیم می کنم. من تمام دستکاری ها را روی لینوکس انجام خواهم داد، Kubernetes را در minikube با استفاده از VirtualBox مستقر خواهم کرد. ماشین کاری من 2 هسته پردازنده و 12 گیگابایت رم دارد؛ من از SSD به عنوان دیسک سیستم استفاده می کنم. من از دبیان 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-completion را فعال کنید:

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

نصب و پیکربندی Kubernetes

برای توسعه، minikube کافی است، بنابراین آن را نصب کنید و kubelet را در /usr/local/bin و نصب 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

راه اندازی 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 با پارامترهای بازی است. کاربر مجاز که به بازی ملحق شده و همچنین سازنده بازی، از این پس شرکت کنندگان بازی نامیده می شوند.

مشاهده رویدادهای بازی

هر کاربر غیرمجاز می‌تواند فهرستی از رویدادها را برای بازی‌های غیرفعال درخواست کند و کاربر مجاز می‌تواند فهرستی از رویدادها را برای هر بازی فعال دریافت کند. یک پارامتر اضافی برای تابع می تواند شماره رویدادی باشد که کاربر از قبل دارد. در این صورت، فقط رویدادهایی که بعداً رخ داده اند به لیست بازگردانده می شوند. با راه اندازی دوره ای این عملکرد، یک کاربر مجاز آنچه را که در بازی اتفاق می افتد تماشا می کند. این تابع همچنین یک درخواست اقدام را برمی‌گرداند که کاربر می‌تواند با استفاده از تابع اعزام رویداد بازی به آن پاسخ دهد.

ارسال رویداد بازی

این تابع فقط برای شرکت کنندگان در بازی کار می کند: امکان شروع بازی، انجام حرکت، رای دادن، نوشتن یک پیام متنی که در لیست رویدادهای بازی نمایش داده می شود و غیره وجود دارد.
کاربر مجاز که بازی را ایجاد کرده است شروع به توزیع نقش برای همه شرکت کنندگان در بازی از جمله خودشان می کند، آنها باید نقش خود را با استفاده از همان عملکرد تأیید کنند. پس از تایید همه نقش ها، بازی به طور خودکار به حالت شب تغییر می کند.

آمار بازی

این تابع فقط برای شرکت کنندگان در بازی کار می کند؛ وضعیت بازی، لیست و تعداد بازیکنان (نام مستعار)، نقش ها و وضعیت آنها (حرکت انجام شده یا نشده)، و همچنین اطلاعات دیگر را نشان می دهد. مانند عملکرد قبلی، همه چیز فقط برای شرکت کنندگان در بازی کار می کند.

توابع به صورت دوره ای راه اندازی می شود

اگر بازی برای مدتی که هنگام ایجاد بازی مشخص شده است راه اندازی نشده باشد، با استفاده از عملکرد پاک به طور خودکار از لیست بازی های فعال حذف می شود.

یکی دیگر از کارهای دوره ای تغییر اجباری حالت بازی از شب به روز و بازگشت برای بازی هایی است که این اتفاق در طول چرخش رخ نداده است (به عنوان مثال، بازیکنی که باید به یک رویداد بازی واکنش نشان دهد به دلایلی راه حل خود را ارسال نکرده است. ).

اطلاعیه

  • معرفی
  • راه اندازی محیط توسعه، تقسیم کار به توابع
  • کار پشتیبان
  • کار جلویی
  • راه اندازی CICD، سازماندهی تست
  • یک جلسه بازی آزمایشی را شروع کنید
  • نمایش نتایج: از

منبع: www.habr.com

اضافه کردن نظر