"Mga Bagong Epiko". Kinakain namin ang elepante sa mga bahagi

"Mga Bagong Epiko". Kinakain namin ang elepante sa mga bahagi

Sa artikulong ito, magse-set up ako ng working environment para sa pagbuo ng larong "Epics", at hahatiin din ang laro mismo sa mga bahaging angkop para gamitin sa OpenFaaS. Gagawin ko lahat ng manipulations sa Linux, I will deploy Kubernetes in minikube using VirtualBox. Ang aking work machine ay may 2 processor core at 12GB ng RAM; Gumagamit ako ng SSD bilang system disk. Gagamitin ko ang debian 8 bilang aking pangunahing sistema ng pag-unlad, na may mga emac, sudo, git at virtualbox na mga pakete na naka-install, lahat ng iba pa ay mai-install sa pamamagitan ng pag-download mula sa GitHub at iba pang mga mapagkukunan. I-install namin ang mga application na ito sa /usr/local/bin maliban kung tinukoy. Magsimula na tayo!

Paghahanda ng kapaligiran sa pagtatrabaho

Ini-install ang Go

Sinusunod namin ang mga tagubilin mula sa opisyal na website:

$ 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

Pagsusuri ng functionality:

$ 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

Pag-install ng faas-cli

Sinusunod namin ang mga tagubilin mula sa opisyal na website:

$ 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

Bilang karagdagan, maaari mong paganahin ang bash-completion:

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

Pag-install at Pag-configure ng Kubernetes

Para sa pag-unlad, sapat na ang minikube, kaya i-install ito at kubelet sa /usr/local/bin, at i-install ang timon para mag-install ng mga application:

$ 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

Ilunsad ang 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"

Namin suriin:

$ 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

Pag-install ng OpenFaaS

Inirerekomenda ng mga developer ang paglikha ng 2 namespaces upang magamit:

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

Magdagdag ng repository para sa timon:

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

Ang tsart ay may kakayahang magtakda ng password bago ang pag-install, gamitin natin ito at i-save ang data ng pag-access bilang lihim ng 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

I-deploy natin:

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

Pagkaraan ng ilang oras, pinapatakbo namin ang iminungkahing utos:

$ 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

Pagsusuri ng functionality:

$ 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

Pag-install ng Mongodb

Ini-install namin ang lahat gamit ang timon:

$ 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

Namin suriin:

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

Pindutin ang ctrl+D upang lumabas sa lalagyan.

Pagse-set up ng mga emac

Sa prinsipyo, ang lahat ay na-configure na ayon sa artikulong ito, kaya hindi ko na idedetalye.

Paghiwa-hiwalayin ang laro sa mga function

Ang pakikipag-ugnayan sa mga function ay isinasagawa sa pamamagitan ng http protocol, ang end-to-end na pagpapatunay sa pagitan ng iba't ibang mga function ay ibinibigay ng JWT. Ginagamit ang Mongodb upang mag-imbak ng mga token, gayundin ang estado ng laro, data ng manlalaro, mga pagkakasunud-sunod ng mga galaw ng lahat ng laro at iba pang impormasyon. Tingnan natin ang pinakakawili-wiling mga tampok.

rehistrasyon

Ang input ng function na ito ay JSON na may palayaw at password ng laro. Kapag tinawag ang function na ito, sinusuri na wala sa database ang alyas na ito; kung matagumpay ang pagsusuri, ang hash ng alias at password ay ipinapasok sa database. Kinakailangan ang pagpaparehistro upang aktibong lumahok sa laro.

pasukan

Ang input ng function ay JSON na may palayaw at password ng laro; kung mayroong isang palayaw sa database at matagumpay na na-verify ang password kasama ng isang naunang na-save sa database, isang JWT ang ibabalik, na dapat ipasa sa iba pang mga function kapag sila ay tinawag. Ang iba't ibang mga tala ng serbisyo ay ipinasok din sa database, halimbawa, huling oras ng pag-login, atbp.

Tingnan ang isang listahan ng mga laro

Ang sinumang hindi awtorisadong gumagamit ay maaaring humiling ng isang listahan ng lahat ng mga laro maliban sa mga aktibo. Nakikita rin ng isang awtorisadong user ang isang listahan ng mga aktibong laro. Ang resulta ng function ay JSON na naglalaman ng mga listahan ng mga laro (game ID, pangalan na nababasa ng tao, atbp.).

Paglikha ng laro

Ang function ay gumagana lamang sa mga awtorisadong gumagamit; ang maximum na bilang ng mga manlalaro ay tinatanggap sa input, pati na rin ang mga parameter ng laro (halimbawa, kung aling mga character ang isaaktibo sa larong ito, ang maximum na bilang ng mga manlalaro, atbp.). Ang isang hiwalay na parameter ng laro ay ang pagkakaroon ng isang password para sa pagsali, na nagpapahintulot sa iyo na lumikha ng mga hindi pampublikong laro. Bilang default, isang pampublikong laro ang nilikha. Ang resulta ng function ay JSON, na naglalaman ng field ng tagumpay ng paglikha, isang natatanging identifier ng laro, at iba pang mga parameter.

Sumasali sa isang laro

Gumagana lang ang function sa mga awtorisadong user, ang input ay ang game ID at ang password nito, kung ito ay isang hindi pampublikong laro, ang output ay JSON na may mga parameter ng laro. Ang awtorisadong user na sumali sa laro, pati na rin ang lumikha ng laro, ay tinatawag na mga kalahok sa laro.

Pagtingin sa mga kaganapan sa laro

Ang sinumang hindi awtorisadong user ay maaaring humiling ng isang listahan ng mga kaganapan para sa mga hindi aktibong laro, at ang isang awtorisadong user ay maaaring makatanggap ng isang listahan ng mga kaganapan para sa anumang aktibong laro. Ang isang karagdagang parameter sa function ay maaaring ang numero ng kaganapan na mayroon na ang user. Sa kasong ito, ang mga kaganapang naganap sa ibang pagkakataon lamang ang ibabalik sa listahan. Sa pana-panahong paglulunsad ng function na ito, pinapanood ng isang awtorisadong user kung ano ang nangyayari sa laro. Ang function na ito ay nagbabalik din ng isang kahilingan sa pagkilos, kung saan ang user ay maaaring tumugon sa paggamit ng event na function ng pagpapadala ng laro.

Nagpapadala ng kaganapan sa laro

Ang function ay gumagana lamang para sa mga kalahok ng laro: posible na simulan ang laro, gumawa ng isang hakbang, bumoto, magsulat ng isang text message na ipinapakita sa listahan ng mga kaganapan sa laro, atbp.
Ang awtorisadong user na lumikha ng laro ay magsisimulang magbahagi ng mga tungkulin sa lahat ng kalahok sa laro, kasama ang kanilang mga sarili, dapat nilang kumpirmahin ang kanilang tungkulin gamit ang parehong function. Kapag nakumpirma na ang lahat ng tungkulin, awtomatikong lilipat sa night mode ang laro.

Mga istatistika ng laro

Gumagana lamang ang function para sa mga kalahok sa laro; ipinapakita nito ang estado ng laro, ang listahan at bilang ng mga manlalaro (palayaw), mga tungkulin at kanilang katayuan (ginawa o hindi), pati na rin ang iba pang impormasyon. Tulad ng sa nakaraang function, ang lahat ay gumagana lamang para sa mga kalahok ng laro.

Pana-panahong inilunsad ang mga function

Kung ang laro ay hindi nailunsad sa loob ng ilang oras na tinukoy kapag lumilikha ng laro, awtomatiko itong aalisin sa listahan ng mga aktibong laro gamit ang malinaw na function.

Ang isa pang pana-panahong gawain ay ang sapilitang paglipat ng mode ng laro mula gabi hanggang araw at pabalik para sa mga laro kung saan hindi ito nangyari sa oras ng pagliko (halimbawa, ang isang manlalaro na kailangang tumugon sa isang kaganapan sa laro ay hindi nagpadala ng kanyang solusyon sa ilang kadahilanan. ).

Anunsyo

  • Pagpapakilala
  • Pagse-set up ng development environment, paghati-hati sa gawain sa mga function
  • Trabaho sa backend
  • Trabaho sa harapan
  • Pag-set up ng CICD, pag-aayos ng pagsubok
  • Magsimula ng trial na session ng laro
  • Mga resulta ng

Pinagmulan: www.habr.com

Magdagdag ng komento