Այս հոդվածում ես կստեղծեմ աշխատանքային միջավայր «Epics» խաղի մշակման համար, ինչպես նաև կբաժանեմ խաղն ինքնին մասերի, որոնք հարմար են OpenFaaS-ում օգտագործելու համար: Ես կանեմ բոլոր մանիպուլյացիաները Linux-ում, կտեղակայեմ Kubernetes-ը minikube-ում՝ օգտագործելով VirtualBox-ը։ Իմ աշխատանքային մեքենան ունի 2 պրոցեսորային միջուկ և 12 ԳԲ օպերատիվ հիշողություն, ես որպես համակարգի սկավառակ օգտագործում եմ SSD: Ես կօգտագործեմ debian 8-ը որպես իմ զարգացման հիմնական համակարգ, որտեղ տեղադրված են emacs, sudo, git և virtualbox փաթեթներ, մնացած ամեն ինչը կտեղադրվի GitHub-ից և այլ աղբյուրներից ներբեռնելով: Մենք կտեղադրենք այս հավելվածները /usr/local/bin-ում, եթե այլ բան նշված չէ: Եկեք սկսենք!
Մշակողները խորհուրդ են տալիս ստեղծել 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 գաղտնիք.
$ 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 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 է, որը պարունակում է խաղերի ցուցակներ (խաղի ID, մարդու կողմից ընթեռնելի անուն և այլն):
Խաղի ստեղծում
Ֆունկցիան աշխատում է միայն լիազորված օգտատերերի հետ, մուտքում ընդունվում է խաղացողների առավելագույն քանակը, ինչպես նաև խաղի պարամետրերը (օրինակ՝ այս խաղում որ նիշերը ակտիվացնել, խաղացողների առավելագույն քանակը և այլն): Խաղի առանձին պարամետր է միանալու համար գաղտնաբառի առկայությունը, որը թույլ է տալիս ստեղծել ոչ հրապարակային խաղեր։ Լռելյայնորեն ստեղծվում է հանրային խաղ: Գործառույթի արդյունքը JSON է, որը պարունակում է ստեղծման հաջողության դաշտ, խաղի եզակի նույնացուցիչ և այլ պարամետրեր:
Խաղին միանալը
Ֆունկցիան աշխատում է միայն լիազորված օգտատերերի հետ, մուտքագրում է խաղի ID-ն և դրա գաղտնաբառը, եթե սա ոչ հրապարակային խաղ է, ելքը JSON է՝ խաղի պարամետրերով: Խաղին միացած լիազորված օգտատերը, ինչպես նաև խաղը ստեղծողն այսուհետ կոչվում են խաղի մասնակիցներ:
Խաղի իրադարձությունների դիտում
Ցանկացած չարտոնված օգտատեր կարող է պահանջել անգործուն խաղերի իրադարձությունների ցանկ, իսկ լիազորված օգտատերը կարող է ստանալ իրադարձությունների ցանկ ցանկացած ակտիվ խաղի համար: Ֆունկցիայի լրացուցիչ պարամետր կարող է լինել օգտատերի կողմից արդեն իսկ ունեցած իրադարձության համարը: Այս դեպքում ցուցակում կվերադարձվեն միայն այն իրադարձությունները, որոնք տեղի են ունեցել ավելի ուշ: Պարբերաբար գործարկելով այս գործառույթը՝ լիազորված օգտատերը հետևում է, թե ինչ է կատարվում խաղում: Այս ֆունկցիան նաև վերադարձնում է գործողության հարցում, որին օգտատերը կարող է պատասխանել՝ օգտագործելով խաղի իրադարձությունների ուղարկման գործառույթը:
Խաղի իրադարձություն ուղարկելը
Ֆունկցիան գործում է միայն խաղի մասնակիցների համար՝ հնարավոր է սկսել խաղը, քայլ անել, քվեարկել, գրել տեքստային հաղորդագրություն, որը ցուցադրվում է խաղի իրադարձությունների ցանկում և այլն։
Լիազորված օգտատերը, ով ստեղծել է խաղը, սկսում է դերեր բաշխել խաղի բոլոր մասնակիցներին, ներառյալ իրենց, նրանք պետք է հաստատեն իրենց դերը՝ օգտագործելով նույն գործառույթը: Երբ բոլոր դերերը հաստատվեն, խաղն ավտոմատ կերպով անցնում է գիշերային ռեժիմի:
Խաղի վիճակագրություն
Ֆունկցիան գործում է միայն խաղի մասնակիցների համար, այն ցույց է տալիս խաղի վիճակը, խաղացողների ցուցակը և քանակը (մականունները), դերերը և նրանց կարգավիճակը (տեղաշարժվել է, թե ոչ), ինչպես նաև այլ տեղեկություններ: Ինչպես նախորդ գործառույթի դեպքում, ամեն ինչ աշխատում է միայն խաղի մասնակիցների համար:
Պարբերաբար գործարկվող գործառույթներ
Եթե խաղը ստեղծելիս որոշ ժամանակ չի գործարկվել, ապա այն ավտոմատ կերպով կհեռացվի ակտիվ խաղերի ցանկից՝ օգտագործելով clear ֆունկցիան:
Մեկ այլ պարբերական խնդիր է խաղի ռեժիմի հարկադիր անցումը գիշերից ցերեկ և հետ այն խաղերի համար, որոնց համար դա տեղի չի ունեցել շրջադարձի ժամանակ (օրինակ, խաղացողը, ով պետք է արձագանքի խաղի իրադարձությանը, ինչ-ինչ պատճառներով չի ուղարկել իր լուծումը. ).