"Epik Baru". Kami makan gajah di beberapa bagian


Pada artikel ini saya akan membuat lingkungan kerja untuk pengembangan game "Epics", dan juga saya akan membagi game itu sendiri menjadi bagian-bagian yang cocok untuk digunakan di OpenFaaS. Saya akan melakukan semua manipulasi di Linux, Kubernetes akan digunakan di minikube menggunakan VirtualBox. Di mesin saya yang bekerja ada 2 core prosesor dan 12GB RAM, saya menggunakan SSD sebagai disk sistem. Saya akan menggunakan debian 8 sebagai sistem utama untuk pengembangan, dengan paket emacs, sudo, git dan virtualbox diinstal, saya akan menginstal sisanya dengan mengunduh dari GitHub dan sumber lainnya. Kami akan menginstal aplikasi ini di / usr / local / bin, kecuali ditentukan lain. Ayo mulai!


Persiapan lingkungan kerja


Pergi instalasi


Ikuti instruksi dari situs web resmi:


$ 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 

Periksa kinerja:


 $ mkdir -p ~/go/src/hello && cd ~/go/src/hello $ echo 'package main import "fmt" func main() { fmt.Printf("hello, world\n") }' > hello.go $ go build $ ./hello hello, world 

Instal faas-cli


Ikuti instruksi dari situs web resmi:


 $ 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 

Selain itu, Anda dapat mengaktifkan bash-completion:


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

Instal dan konfigurasikan Kubernetes


Minikube sudah cukup untuk pengembangan, jadi kami akan menginstalnya dan kubelet di / usr / local / bin, kami juga akan menginstal helm untuk menginstal aplikasi:


 $ 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 

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

Kami memeriksa:


 $ 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 

Instal OpenFaaS


Pengembang merekomendasikan membuat 2 namespace untuk pekerjaan:


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

Tambahkan repositori untuk helm:


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

Bagan memiliki kemampuan untuk mengatur kata sandi sebelum instalasi, menggunakannya dan menyimpan data akses dalam bentuk rahasia 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 

Menyebarkan:


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

Setelah beberapa waktu, jalankan perintah yang diusulkan:


 $ 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 

Periksa kinerja:


 $ 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 

Instal Mongodb


Kami menempatkan semuanya menggunakan 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: ** 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 

Kami memeriksa:


 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 

Tekan ctrl + D untuk keluar dari wadah.


Pengaturan Emacs


Pada prinsipnya, semuanya sudah dikonfigurasi untuk artikel ini , jadi saya tidak akan melukis secara detail.


Memecah game menjadi beberapa fungsi


Interaksi dengan fungsi dilakukan melalui protokol http, otentikasi end-to-end antara fungsi yang berbeda disediakan oleh JWT. Untuk menyimpan token, serta keadaan permainan, data pemain, urutan gerakan semua game dan informasi lainnya, mongodb digunakan. Mari kita lihat lebih dekat fitur-fitur yang paling menarik.


Pendaftaran


Pada input fungsi ini adalah JSON dengan alias permainan dan kata sandi. Ketika fungsi ini dipanggil, ia memeriksa tidak adanya alias ini di basis data; pada verifikasi yang berhasil, ia memasukkan hash alias dan kata sandi ke dalam basis data. Registrasi diperlukan untuk partisipasi aktif dalam permainan.


Login


Pada input fungsi adalah JSON dengan alias permainan dan kata sandi, jika ada alias dalam database dan kata sandi berhasil diverifikasi dengan kata sandi yang disimpan sebelumnya dalam database, JWT dikembalikan, yang harus diteruskan ke fungsi lain saat dipanggil. Berbagai catatan layanan juga dimasukkan ke dalam basis data, misalnya, waktu login terakhir, dll.


Lihat Daftar Game


Setiap pengguna yang tidak sah dapat meminta daftar semua game kecuali yang aktif. Pengguna yang berwenang juga melihat daftar game yang aktif. Hasil dari fungsinya adalah JSON yang berisi daftar game (pengidentifikasi game, nama yang bisa dibaca manusia, dll.).


Pembuatan game


Fungsi ini hanya berfungsi dengan pengguna yang diizinkan, jumlah maksimum pemain, serta parameter gim (misalnya, karakter mana yang harus diaktifkan dalam gim ini, jumlah pemain maksimum, dll.) Yang diterima pada input. Parameter permainan yang terpisah adalah adanya kata sandi untuk bergabung, yang memungkinkan Anda membuat game non-publik. Secara default, game publik dibuat. Hasil dari eksekusi fungsi adalah JSON, di mana ada bidang keberhasilan pembuatan, pengidentifikasi unik untuk permainan, serta parameter lainnya.


Bergabung dengan game


Fungsi ini hanya bekerja dengan pengguna yang sah, di pintu masuk - pengidentifikasi permainan dan kata sandinya, jika itu adalah game non-publik, pada output - JSON dengan parameter permainan. Pengguna yang sah yang telah bergabung dengan game, serta pencipta game, kemudian disebut sebagai peserta dalam game.


Lihat acara permainan


Setiap pengguna yang tidak sah dapat meminta daftar acara dari game yang tidak aktif, dan pengguna yang berwenang bisa mendapatkan daftar acara dan game yang aktif. Parameter tambahan untuk fungsi dapat berupa nomor acara yang sudah dimiliki pengguna. Dalam hal ini, hanya peristiwa yang terjadi kemudian yang akan dikembalikan dalam daftar. Dengan meluncurkan fungsi ini secara berkala, pengguna yang berwenang mengawasi apa yang terjadi dalam game. Fungsi ini juga mengembalikan permintaan untuk tindakan yang dapat ditanggapi pengguna dengan menggunakan fungsi mengirim acara permainan.


Pengiriman acara game


Fungsi ini hanya berfungsi untuk peserta game: kemampuan untuk meluncurkan game, bergerak, memberikan suara, menulis pesan teks yang muncul dalam daftar acara permainan, dll. Diterapkan.
Pengguna yang berwenang yang membuat game memulai distribusi peran ke semua peserta dalam game, termasuk mereka sendiri, mereka harus mengkonfirmasi peran mereka menggunakan fungsi yang sama. Setelah semua peran dikonfirmasi, game secara otomatis beralih ke mode malam.


Statistik game


Fungsi ini hanya berfungsi untuk peserta dalam permainan, menunjukkan keadaan permainan, daftar dan jumlah pemain (alias), peran dan status mereka (bergerak atau tidak), serta informasi lainnya. Sedangkan untuk fungsi sebelumnya, semuanya bekerja hanya untuk peserta game.


Menjalankan Fungsi secara berkala


Jika gim belum diluncurkan untuk beberapa waktu yang ditentukan selama pembuatan gim, gim ini akan dihapus secara otomatis dari daftar gim yang aktif menggunakan fungsi sapuan.


Tugas periodik lainnya adalah pemindahan paksa dari mode permainan dari malam ke hari dan kembali untuk permainan di mana ini tidak terjadi selama belokan (misalnya, seorang pemain yang perlu merespons acara pertandingan tidak mengirim keputusannya dengan alasan apa pun).


Pengumuman


  • Pendahuluan
  • Mengatur lingkungan pengembangan, membagi tugas menjadi beberapa fungsi
  • Bekerja di backend
  • Pekerjaan frontend
  • Pengaturan CI \ CD, organisasi penguji
  • Memulai sesi uji coba permainan
  • Ringkasan

Source: https://habr.com/ru/post/id482752/


All Articles