当前位置: 首页 > news >正文

C++ RPC以及cmake

目录

 

1.RPC概念

2.RPC实现计算举例

3.python进行rpc调用

4.thrift实现分布式容器创建

5.阶段总结

6.cmake简介

7.cmake使用的一般步骤

8.cmake编译多层次文件

9.cmake编译多种交付件


 

1.RPC概念

# 1.需求分析

靠谱的商用项目不是只有一个可执行程序就够了的。好的商用项目应该遵守的原则:

- 客户端(方便使用):启动器,安装包等
- 服务器(方便部署和扩展):依赖库,启动脚本等

**需求原型:**

- 用户注册,登陆
- 建房
- 跟房

![1560849263612](商业化部署.assets/1560849263612.png)

- 登陆服务器:管理当前的游戏服务器
- 登陆客户端:提供登陆注册和建房跟房界面(简单的qt编程)
- 游戏服务器:内容不用动,但要部署多份。

## 1.1方案1(多主机或虚拟机)

- 登陆服务器
  - 记录当前启动游戏服务器的服务器IP或主机名
  - 向登陆客户端返回IP或主机名
  - 管理这些主机的状态(启动,停止。,更新)
- 登陆客户端:通过房号查找游戏服务所在的计算机IP
- 游戏服务器:每个主机或虚拟机启动一个。

 **优点:** 游戏服务器部署简单,测试简单,跟单个服务器的操作完全相同。

**缺点:** 登陆服务器的业务复杂,不好维护游戏服务器所在的诸多主机。

2.RPC实现计算举例

## 1.2方案2(多进程)

+ 登陆服务器
  + 记录当前启动的游戏服务器的端口号
  + 向登陆客户端返回端口号
  + 管理启动的游戏服务器进程
+ 登陆客户端:向登陆服务器获取游戏服务器端口号
+ 游戏服务器:
  + 支持端口可配
  + 增加多份除进程之外的资源(数据库,日志文件等)
  + 保护对公共资源的访问

**优点:** 登陆服务器实现简单,只需要要简单的进程管理即可

**缺点:** 游戏服务器的职责变的复杂(增加信号量集等进程间通信),而且不好管理(相同的文件或数据库存在多份)

## 1.3方案3(容器化)

- 登陆服务器
  - 记录当前启动的游戏服务器的端口号
  - 向登陆客户端返回端口号
  - 管理启动的游戏服务器所在容器
- 登陆客户端:向登陆服务器获取游戏服务器端口号
- 游戏服务器:每个容器启动一个游戏服务,启动多个容器映射不同端口

**特点:** 无需修改游戏服务器软件,登陆服务器通过管理容器实现管理游戏服务器。 

3.python进行rpc调用

## 1.4结论

使用方案3效果最优。

> 那么问题来了,什么是容器?

**容器:** 是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。

**解释**: 在操作系统和应用程序之间添加的一层:容器层。容器层对于操作系统来说,就是一个应用程序。容器层对于应用程序来说,好像一个操作系统。![容器运行时](商业化部署.assets/容器运行时.png)

- 一个主机可以有多个相似或相同的容器
- 应用程序不知道自己运行在容器中。
- docker是当前最主流的容器工具

## 1.5计划

1. 将游戏服务器放到docker容器中运行
2. 登陆服务器管理多个容器并提供创建容器和查询容器的功能
3. 登陆客户端发送用户命密码请求和房间创建或跟随请求,根据用户选择,启动游戏连接对应游戏服务器

# 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
```

**运行详解:**

1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub \(amd64\)
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

5.阶段总结

5. 命令行连接到守护进程

6. 守护进程发现当前没有hello-world镜像,于是去dockerhub下载了一个镜像
7. 守护进程基于hello-world镜像创建了一个容器,容器内有一个可执行程序,现在的内容都是由该程序输出的。
8. 守护进程将容器的输出发送给命令行,也就是当前终端。

## 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镜像有分层依赖的关系。创建镜像的过程就好像写代码,从简单到复杂的过程。

![镜像分层](商业化部署.assets/镜像分层.png)

* **运行:** 镜像运行后会产生容器。基于一个镜像可以运行多个容器。

```bash
# 查看当前所有的镜像
$ docker images
# 运行ubuntu镜像:在ubuntu容器中执行一条ls的命令,不写命令则运行bash
$ docker run --rm -ti ubuntu ls
# --rm -ti参数:运行结束后删除容器,提供虚拟终端和交互式界面
```

9.cmake编译多种交付件

* **创建:** 类似基于原始系统搭环境

  * 手动创建

    1. 下载并运行基础镜像
    2. 进入基础镜像的容器内安装所需环境
    3. 将容器提交为镜像

    ```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
    ```

 

http://www.xdnf.cn/news/112267.html

相关文章:

  • VBA技术资料MF300:利用Mid进行文本查找
  • 专家系统的一般结构解析——基于《人工智能原理与方法》的深度拓展
  • JBoltAI 赋能金融文档:基于 RAG 的基金招募说明书视觉增强方案
  • 分布式微服务架构,数据库连接池设计策略
  • 【框架学习】Spring AI-功能学习与实战(一)
  • node.js 实战——(Http 知识点学习)
  • 使用PyTorch如何配置一个简单的GTP
  • Framework.jar里的类无法通过Class.forName反射某个类的问题排查
  • FPGA上实现YOLOv5的一般过程
  • 机器学习特征工程中的数值分箱技术:原理、方法与实例解析
  • 看一看 中间件Middleware
  • mapbox高阶,高程影像、行政区边界阴影效果实现
  • 开源项目实战学习之YOLO11:ultralytics-cfg-datasets-lvis.yaml文件(五)
  • 长城杯铁人三项初赛-REVERSE复现
  • Linux常见指令介绍下(入门级)
  • 手搓雷达图(MATLAB)
  • Java24新增特性
  • C语言数据结构之顺序表
  • 从代码学习深度学习 - 图像增广 PyTorch 版
  • 解决VSCode每次SSH连接服务器时,都需要下载vscode-server
  • Rust 2025:内存安全革命与异步编程新纪元
  • 大模型技术全景解析:从基础架构到Prompt工程
  • 无感字符编码原址转换术——系统内存(Mermaid文本图表版/DeepSeek)
  • 7.9 Python+Click实战:5步打造高效的GitHub监控CLI工具
  • #define STEUER_A_H {PWM_A_ON}
  • CSS3 基础(背景-文本效果)
  • 04-stm32的标准外设库
  • TI MSP430搭配 SD NAND(贴片式T卡):长续航心电监测的可靠保障
  • 关于按键映射软件的探索(其一)
  • STM32F407使用ESP8266实现阿里云OTA(下)