目录
1.RPC概念
1.需求分析
靠谱的商用项目不是只有一个可执行程序就够了的。好的商用项目应该遵守的原则:
-
客户端(方便使用):启动器,安装包等
-
服务器(方便部署和扩展):依赖库,启动脚本等
**需求原型:**
-
用户注册,登陆
-
建房
-
跟房

-
登陆服务器:管理当前的游戏服务器
-
登陆客户端:提供登陆注册和建房跟房界面(简单的qt编程)
-
游戏服务器:内容不用动,但要部署多份。
1.1方案1(多主机或虚拟机)
-
登陆服务器
-
记录当前启动游戏服务器的服务器IP或主机名
-
向登陆客户端返回IP或主机名
-
管理这些主机的状态(启动,停止。,更新)
-
登陆客户端:通过房号查找游戏服务所在的计算机IP
-
游戏服务器:每个主机或虚拟机启动一个。
**优点:** 游戏服务器部署简单,测试简单,跟单个服务器的操作完全相同。
**缺点:** 登陆服务器的业务复杂,不好维护游戏服务器所在的诸多主机。
2.RPC实现计算举例
1.2方案2(多进程)
-
登陆服务器
-
记录当前启动的游戏服务器的端口号
-
向登陆客户端返回端口号
-
管理启动的游戏服务器进程
-
登陆客户端:向登陆服务器获取游戏服务器端口号
-
游戏服务器:
-
支持端口可配
-
增加多份除进程之外的资源(数据库,日志文件等)
-
保护对公共资源的访问
**优点:** 登陆服务器实现简单,只需要要简单的进程管理即可
**缺点:** 游戏服务器的职责变的复杂(增加信号量集等进程间通信),而且不好管理(相同的文件或数据库存在多份)
1.3方案3(容器化)
-
登陆服务器
-
记录当前启动的游戏服务器的端口号
-
向登陆客户端返回端口号
-
管理启动的游戏服务器所在容器
-
登陆客户端:向登陆服务器获取游戏服务器端口号
-
游戏服务器:每个容器启动一个游戏服务,启动多个容器映射不同端口
**特点:** 无需修改游戏服务器软件,登陆服务器通过管理容器实现管理游戏服务器。
3.python进行rpc调用
1.4结论
使用方案3效果最优。
> 那么问题来了,什么是容器?
**容器:** 是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。
**解释**: 在操作系统和应用程序之间添加的一层:容器层。容器层对于操作系统来说,就是一个应用程序。容器层对于应用程序来说,好像一个操作系统。
-
一个主机可以有多个相似或相同的容器
-
应用程序不知道自己运行在容器中。
-
docker是当前最主流的容器工具
1.5计划
-
将游戏服务器放到docker容器中运行
-
登陆服务器管理多个容器并提供创建容器和查询容器的功能
-
登陆客户端发送用户命密码请求和房间创建或跟随请求,根据用户选择,启动游戏连接对应游戏服务器
2 docker
docker是一个实现容器技术的软件,用到了linux内核的命名空间原理。
4.thrift实现分布式容器创建
2.1 初识docker
**安装**
```bash
执行脚本简易安装
$ sudo apt-get install curl
$ curl -sSL https://get.daocloud.io/docker | sh
修改添加当前用户到docker用户组,修改socket权限
$ sudo usermod -aG docker dev
$ sudo chmod 777 /var/run/docker.sock
退出终端后再次进入测试命令
$ docker --hep
```
**第一次运行**
```bash
$ docker run hello-world
```
**运行详解:**
-
The Docker client contacted the Docker daemon.
-
The Docker daemon pulled the "hello-world" image from the Docker Hub \(amd64\)
-
The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
-
The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
5.阶段总结
-
命令行连接到守护进程
-
守护进程发现当前没有hello-world镜像,于是去dockerhub下载了一个镜像
-
守护进程基于hello-world镜像创建了一个容器,容器内有一个可执行程序,现在的内容都是由该程序输出的。
-
守护进程将容器的输出发送给命令行,也就是当前终端。
2.2 docker详解
**程序架构**
docker是CS架构的软件,命令行敲的命令会发送到一个守护进程docker Daemon执行。一般地,命令行和守护进程在同一个计算机运行。容器,镜像的管理由docker Daemon执行,命令行无需关心。
6.cmake简介
**核心概念**
docker有三个核心概念,镜像,容器和仓库。
仓库
类似github,docker官方设定了一个docker镜像的仓库:dockerhub([https://hub.docker.com/)\](https://hub.docker.com/))
* 本地计算机可以拉去dockerhub上的镜像
```bash
完整的docker镜像名称是 作者/镜像名:标签
$ docker pull ubuntu/ubuntu:latest
```
7.cmake使用的一般步骤
* 本地计算机的镜像可以推送到dockerhub的账户内
```bash
登陆,按照提示输入github的用户名密码
$ docker login
将本地镜像重命名成规范名称
$ docker tag ubuntu marklion/ubuntu:myfirsttag
推送自己的镜像
$ docker push marklion/ubuntu:myfirsttag
```
* 镜像的修改,提交等操作很类似git和github的操作。
8.cmake编译多层次文件
镜像
* **概念:** 一组环境的静态集合,类似操作系统镜像。
* **特点:** docker镜像有分层依赖的关系。创建镜像的过程就好像写代码,从简单到复杂的过程。

* **运行:** 镜像运行后会产生容器。基于一个镜像可以运行多个容器。
```bash
查看当前所有的镜像
$ docker images
运行ubuntu镜像:在ubuntu容器中执行一条ls的命令,不写命令则运行bash
$ docker run --rm -ti ubuntu ls
--rm -ti参数:运行结束后删除容器,提供虚拟终端和交互式界面
```
9.cmake编译多种交付件
* **创建:** 类似基于原始系统搭环境
* 手动创建
-
下载并运行基础镜像
-
进入基础镜像的容器内安装所需环境
-
将容器提交为镜像
```bash
直接执行ifconfig,报错,因为基础镜像没有安装ifconfig包
$ docker run --rm ubuntu ifconfig
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"ifconfig\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
进入基础镜像,安装工具包后退出
$ docker run -ti ubuntu
apt-get update
apt-get install -y net-tools
exit
找到刚才的容器,基于其创建镜像
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
034abada670c ubuntu "/bin/bash" 31 minutes ago Exited (0) 20 seconds ago zealous_swirles
commit命令用于容器---》镜像
容器ID可以用简写
$ docker commit 034a my_unbuntu:add_net
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_unbuntu add_net 6ca02b1d0483 5 seconds ago 114MB
用新镜像运行ifconfig
$ docker run --rm my_unbuntu:add_net ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 2 bytes 200 (200.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
```