Pada artikel ini, saya akan menyiapkan lingkungan kerja untuk mengembangkan game "Epics", dan juga akan membagi game itu sendiri menjadi beberapa bagian yang sesuai untuk digunakan di OpenFaaS. Saya akan melakukan semua manipulasi di Linux, saya akan menyebarkan Kubernetes di minikube menggunakan VirtualBox. Mesin kerja saya memiliki 2 inti prosesor dan RAM 12 GB; Saya menggunakan SSD sebagai disk sistem. Saya akan menggunakan debian 8 sebagai sistem pengembangan utama saya, dengan paket emacs, sudo, git dan virtualbox terinstal, semuanya akan diinstal dengan mengunduh dari GitHub dan sumber lainnya. Kami akan menginstal aplikasi ini di /usr/local/bin kecuali ditentukan lain. Mari kita mulai!
Pengembang merekomendasikan untuk membuat 2 namespace untuk digunakan:
$ 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.github.io/faas-netes/
"openfaas" has been added to your repositories
Bagan memiliki kemampuan untuk mengatur kata sandi sebelum instalasi, mari gunakan dan simpan data akses sebagai rahasia k8s:
$ 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, kami menjalankan perintah yang diusulkan:
$ 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
Menginstal Mongodb
Kami menginstal 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.
Menyiapkan emacs
Pada prinsipnya, semuanya sudah dikonfigurasi sesuai Artikel ini, jadi saya tidak akan menjelaskannya secara detail.
Memecah permainan menjadi beberapa fungsi
Interaksi dengan fungsi dilakukan melalui protokol http, otentikasi ujung ke ujung antara berbagai fungsi disediakan oleh JWT. Mongodb digunakan untuk menyimpan token, serta status permainan, data pemain, urutan pergerakan semua permainan, dan informasi lainnya. Mari kita lihat lebih dekat fitur-fitur paling menarik.
Pendaftaran
Input dari fungsi ini adalah JSON dengan nama panggilan dan kata sandi game. Ketika fungsi ini dipanggil, maka diperiksa bahwa alias ini tidak ada dalam database; jika pemeriksaan berhasil, alias dan hash kata sandi dimasukkan ke dalam database. Pendaftaran diperlukan untuk berpartisipasi aktif dalam permainan.
Masukan
Input fungsi adalah JSON dengan nama panggilan permainan dan kata sandi; jika ada nama panggilan di database dan kata sandi berhasil diverifikasi dengan yang disimpan sebelumnya di database, maka JWT dikembalikan, yang harus diteruskan ke fungsi lain ketika sudah ada. ditelepon. Berbagai catatan layanan juga dimasukkan ke dalam database, misalnya waktu login terakhir, dll.
Lihat daftar permainan
Setiap pengguna yang tidak sah dapat meminta daftar semua game kecuali yang aktif. Pengguna yang berwenang juga melihat daftar permainan yang aktif. Hasil dari fungsinya adalah JSON yang berisi daftar game (ID game, nama yang dapat dibaca manusia, dll.).
Pembuatan permainan
Fungsi ini hanya berfungsi dengan pengguna yang berwenang; jumlah maksimum pemain yang diterima pada input, serta parameter permainan (misalnya, karakter mana yang akan diaktifkan dalam permainan ini, jumlah maksimum pemain, dll.). Parameter terpisah dari game ini adalah adanya kata sandi untuk bergabung, yang memungkinkan Anda membuat game non-publik. Secara default, game publik dibuat. Hasil dari fungsinya adalah JSON, yang berisi bidang keberhasilan pembuatan, pengidentifikasi game unik, dan parameter lainnya.
Bergabung dengan permainan
Fungsi ini hanya berfungsi dengan pengguna yang berwenang, inputnya adalah ID game dan kata sandinya, jika ini adalah game non-publik, outputnya adalah JSON dengan parameter game. Pengguna resmi yang bergabung dalam permainan, serta pencipta permainan, selanjutnya disebut peserta permainan.
Melihat acara permainan
Setiap pengguna yang tidak sah dapat meminta daftar acara untuk game yang tidak aktif, dan pengguna yang berwenang dapat menerima daftar acara untuk setiap game yang aktif. Parameter tambahan pada fungsi tersebut dapat berupa nomor peristiwa 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 melihat apa yang terjadi di dalam game. Fungsi ini juga mengembalikan permintaan tindakan, yang dapat ditanggapi oleh pengguna menggunakan fungsi pengiriman acara game.
Mengirim acara permainan
Fungsi ini hanya berfungsi untuk peserta permainan: dimungkinkan untuk memulai permainan, bergerak, memilih, menulis pesan teks yang ditampilkan dalam daftar acara permainan, dll.
Pengguna resmi yang membuat game mulai membagikan peran kepada semua peserta dalam game, termasuk dirinya sendiri, mereka harus mengonfirmasi peran mereka menggunakan fungsi yang sama. Setelah semua peran dikonfirmasi, game secara otomatis beralih ke mode malam.
Statistik permainan
Fungsi ini hanya berfungsi untuk peserta permainan; ini menunjukkan keadaan permainan, daftar dan jumlah pemain (nama panggilan), peran dan status mereka (bergerak atau tidak), serta informasi lainnya. Seperti fungsi sebelumnya, semuanya hanya berfungsi untuk peserta permainan.
Fungsi yang diluncurkan secara berkala
Jika game belum diluncurkan selama beberapa waktu yang ditentukan saat pembuatan game, game tersebut akan secara otomatis dihapus dari daftar game aktif menggunakan fungsi hapus.
Tugas berkala lainnya adalah peralihan paksa mode permainan dari malam ke siang dan kembali untuk permainan yang tidak terjadi selama giliran (misalnya, pemain yang perlu bereaksi terhadap peristiwa permainan tidak mengirimkan solusinya karena alasan tertentu ).