Go游戏服务器热更新
Go游戏服务器热更新
1.为什么需要做代码热更新?
什么是代码热更新
所谓代码热更一般是指服务程序在不停止服务运行的情况下动态替换其中部分代码对原有逻辑进行修正或者新增功能代码。
为什么需要代码热更新
服务程序一般需要为应用程序提供长时间724小时不间断的服务。
不停止服务程序的运行的情况下动态修改程序的行为逻辑。
游戏服务器频繁停服维护非常不友好。*
2.游戏服务器热更主流解决方案?
代码热更的基本原理
我们可以用一个公式来简单概括服务程序。服务程序=数据结构(数据管理)+算法(这里说的算法指代程序中对于数据的计算处理相关的部分)。大部分时候代码热更新只能热更算法的部分,数据部分是非常难热更的或者说不建议热更的。举个例子:
[crayon-6745dfc56bd1b042255183/]
上述代码可以进行热更的部分是ChangeGameData方法。试想一下如果修改了GameData数据结构,删除了D字段新增了E字段,那么此时数据结构与程序内存中的GameData对象的内存结构是不匹配的,那么对于字段的操作也不能达到预想的效果。到这里我们热更的目标很明确了,就是如何能够动态的替换掉ChangeGameData这类的对于数据的计算的函数?
代码热更方案:
基本原理
动态库替换
编译型语言+(运行时编译器(luajit/cpython)+动态解析内嵌脚本)
实践方案
c/c++动态库(.so或者.dll)替换
c/c++内嵌lua
c/c++内嵌python
node.js
golang+plugin
3.Go游戏服务器如何做热更新
前面实践方案中已经剧透了Go语言中实现代码热更新的方式是采用plugin包加载动态库的方式。go编译器支持将一个go程序编译成一个插件(plugin)。plugin的基本原理类似于c/c++加载动态库的方式。
插件程序构建
程序目录结构
[crayon-6745dfc56bd20845239001/]
代码解析-插件代码(plugintest/plugin/main.go)
[crayon-6745dfc56bd23080871209/]
代码解析-宿主程序代码(plugintest/main.go)
[crayon-6745dfc56bd24275145546/]
编译-plugin编译 ...