综合示例
介绍
示例内容包含
- 多服多进程的方式部署
- 多服单进程的方式部署(类似单体应用的方式部署与开发)
- SpringBoot 集成
- JSR380 验证
- 断言 + 异常机制 = 清晰简洁的代码
- 请求、无响应
- 请求、响应
- 广播指定玩家
- 广播全服玩家
- 单个逻辑服与单个逻辑服通信请求 - 有返回值(可跨进程)
- 单个逻辑服与单个逻辑服通信请求 - 无返回值(可跨进程)
- 单个逻辑服与同类型多个逻辑服通信请求(可跨进程)
- 业务参数自动装箱、拆箱基础类型(解决协议碎片问题)
- 游戏文档生成
- 业务协议文件 .proto 的生成
- 登录相关:包含禁止重复登录、顶号相关的业务
- 启动多个同类型的游戏逻辑服
- 将项目打成 jar 包
- 启动 jar 包
- docker 运行综合示例
- 纯原生 proto 数据的模拟客户端模块
- 元信息
- 模块的整理与建议(路由相关)
- k8s
还有更多,将在后续添加 ... ...
Example Source Code
see https://github.com/iohao/ioGameExamples
path : SpringBootExample
阅读当前文档时,建议配合示例源码。
多服多进程
- GameBrokerApplication,游戏网关服
- GameExternalApplication,游戏对外服
- GameLogicClassesApplication,游戏逻辑服
- GameLogicSchoolApplication,游戏逻辑服
启动后会有 4 个进程,这些项目可以分别部署在不同的机器上,也可以将项目启动多个进程部署在一个机器上。
多服单进程
其中 spring-z-one-game 项目是一种多服单进程的方式(类似单体应用), 包含了游戏网关服、游戏对外服、游戏逻辑服的整合。
- SpringGameOneApplication
游戏客户端模拟启动类
SpringClient 是游戏客户端模拟启动类,启动后可在控制台输入 “...” 来查看提供了哪些模拟请求。
.proto 生成,文本文档生成
运行 TestGenerate 可为示例项目生成文本文档和 .proto
- code 3~5,生成文本文档,see 代码生成(引擎、前端)。
- code 7~8,生成 .proto。
public class TestGenerate {
public static void main(String[] args) {
SpringGameOneApplication.listLogic().forEach(BrokerClientStartup::createBarSkeleton);
IoGameDocumentHelper.addErrorCodeClass(SpringGameCodeEnum.class);
IoGameDocumentHelper.generateDocument();
String packagePath = "com.iohao.game.spring.common";
GenerateFileKit.generate(packagePath);
}
}
运行 TestGenerate
- 会在当前项目 target/proto 目录下生成 .proto 文件。
- 会在源码的根目录生成一个 doc_game.txt 文件的文本文档,该文件中就是与前端同学联调的文档。
现在已经有 SDK + 代码生成了, 大多数情况下不需要文本文档,而是直接生成可联调的代码。
登录
综合示例中提供了一个登录相关的示例,业务包含禁止重复登录和顶号。
为了演示,这里的登录做了两种业务,实际当中我们只需要二选一。 登录业务的控制在模拟客户端中,通过设置 loginBizCode 就可以测试这两种业务情况了。
- loginBizCode : 值为 0 时,相当于号已经在线上了,不能重复登录。 如果游戏对外服已经有该玩家的连接就抛异常,并告诉请求端玩家已经在线,否则就正常登录成功。
- loginBizCode : 值为 1 时,相当于顶号。 强制断开之前的客户端连接,并让本次登录成功。
see LoginAction.loginVerify
打包、部署
打 jar 包,并启动
执行打包命令后,将会生成 spring-z-one-game/target/spring-z-one-game-1.0-SNAPSHOT.jar。
如果没安装 mvnd ,请使用
mvn package
。
mvnd package
在终端启动 jar
java -jar spring-z-one-game-1.0-SNAPSHOT.jar
docker 运行
确保机器上有 docker 相关环境,以下是在终端执行的,首次使用 docker 部署、运行需要的时间会长一些,因为会下载相关的镜像。
1、 打 jar 包,在示例目录的根目录执行如下命令
mvnd package
2、在示例目录的根目录执行如下命令
不要遗漏命令中的点 “.”;
docker build -t spring-z-one-game .
3、查看当前镜像
docker images spring-z-one-game
4、启动刚打包好的镜像
docker run --name spring-z-one-game -p 10100:10100 spring-z-one-game
启动好后,我们就可以与 docker 中的游戏服务器通信了。 简单测试的做法是在 idea 中运行 SpringClient 就能在 docker 控制台中看见数据了。
k8s 部署
网关集群部署在 k8s 上,直接在种子服务里填写 k8s 服务名加端口是无法部署成功的。 我们是借助 nacos 把网关服务拿到后,获取到网关服务ip列表再填到种子服务列表里,启动起来的。
关于 k8s 与 nacos 的示例目前在 nacos 分支中,暂时没有合并到 main 分支中,有兴趣的可以看该分支。
- example/example-cluster-broker-nacos
k8s部署这段由 OutMan/pch 双眼皮男孩 - Gitee.com 分享,让我们感谢他。
关于 k8s 的部署根据上述信息来做就可以了。
纯原生 proto 数据的模拟客户端模块
测试
- SpringGameOneApplication
- SpringWebsocketNativeProtoClient
SpringWebsocketNativeProtoClient 的请求是使用纯原生的 proto 代码发起请求数据的。
小结
综合示例演示了文档中的大部分功能,是框架部分功能的简单运用。