“新史诗”。 我们把大象分成几部分吃

“新史诗”。 我们把大象分成几部分吃

在本文中,我将搭建一个开发游戏“Epics”的工作环境,并将游戏本身分解成适合在 OpenFaaS 中使用的部分。 我将在 Linux 上完成所有操作,我将使用 VirtualBox 在 minikube 中部署 Kubernetes。 我的工作机器有2个处理器核心和12GB RAM;我使用SSD作为系统盘。 我将使用 debian 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 的存储库:

$ 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 安装所有内容:

$ 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,在其他函数调用时必须将其传递给其他函数叫。 各种服务记录也被插入到数据库中,例如上次登录时间等。

查看游戏列表

任何未经授权的用户都可以请求除活动游戏之外的所有游戏的列表。 授权用户还可以看到活动游戏的列表。 该函数的结果是包含游戏列表(游戏 ID、人类可读名称等)的 JSON。

游戏创作

该功能仅适用于授权用户;输入时接受最大玩家数量以及游戏参数(例如,在该游戏中激活哪些角色、最大玩家数量等)。 游戏的一个单独参数是加入密码的存在,它允许您创建非公开游戏。 默认情况下,会创建一个公共游戏。 该函数的结果是JSON,其中包含创建成功字段、唯一游戏标识符和其他参数。

加入游戏

该函数仅适用于授权用户,输入是游戏ID和密码,如果这是非公开游戏,则输出是带有游戏参数的JSON。 加入游戏的授权用户以及游戏的创建者在下文中被称为游戏参与者。

查看游戏事件

任何未经授权的用户都可以请求不活动游戏的事件列表,而授权用户可以接收任何活动游戏的事件列表。 该函数的附加参数可以是用户已有的事件编号。 在这种情况下,列表中只会返回后来发生的事件。 通过定期启动此功能,授权用户可以观察游戏中发生的情况。 该函数还返回一个操作请求,用户可以使用游戏的事件调度函数来响应该请求。

发送游戏事件

该功能仅适用于游戏参与者:可以开始游戏、采取行动、投票、编写显示在游戏事件列表中的短信等。
创建游戏的授权用户开始将角色分配给游戏中的所有参与者,包括他们自己,他们必须使用相同的功能确认自己的角色。 一旦所有角色都被确认,游戏会自动切换到夜间模式。

游戏统计

该功能仅适用于游戏参与者;它显示游戏状态、玩家列表和数量(昵称)、角色及其状态(已进行或未进行)以及其他信息。 与之前的功能一样,一切仅适用于游戏参与者。

定期推出功能

如果游戏在创建游戏时指定的一段时间内没有启动,则会使用清除功能自动将其从活动游戏列表中删除。

另一个周期性任务是强制将游戏模式从夜间切换到白天,并在回合期间没有发生这种情况的游戏(例如,需要对游戏事件做出反应的玩家由于某种原因没有发送他的解决方案) )。

公告

  • 介绍
  • 设置开发环境,将任务分解为功能
  • 后端工作
  • 前端工作
  • 建立CICD,组织测试
  • 开始试玩游戏
  • 结果

来源: habr.com

添加评论