## 热更golang有状态服务 1. golang是有状态的 2. 数据+逻辑代码分离 3. 主要热更的是逻辑代码 ## 启用插件 1. 启用插件, 配置文件 conf.yaml, 填入插件.so文件的路径 ``` server_game: plugin_path: "./bin/plugin.so" mongo: <<: *default-mongo dbname: "game" ``` 2. 编译程序 & 插件. ```shell $ make plugin ``` * 程序和插件需要同一个golang的环境。 * golang对同一个插件只能加载一次。可以修改.so文件名字 + 软连接的方式来处理 ## 写插件代码 插件中的代码主要是对线上程序 `协议=>逻辑` 的热更. 比如我们要修改游戏服务协议号为`1`的逻辑。 则在`cmd/gameserver/plugin/plugin.go`文件中修改。 1. 在函数`GetActionMap`中增加一行 ``` am[uint32(1)] = HotRpc ``` 2. 增加函数`HotRpc` ``` func HotRpc(msg components.IMessage) (int32, interface{}) { return 0, nil } ``` 3. 编译插件 & 可以参考Makefile:plugin ```Makefile IMGTIME := $(shell date "+%G%m%d_%H%M%S") pname = plugin-$(IMGTIME).so plugin: cd bin && rm -rf ./plugin*.so && cd - go build -race --buildmode=plugin -o bin/$(pname) cmd/gameserver/plugin/*.go cd bin && ln -s $(pname) plugin.so && cd - ``` 4. 把插件放到指定位置, 并给游戏服发送热更指令。可以参考Makefile:regame ```Makefile regame:plugin lsof -i:8850 | grep "agent" | grep -v grep | awk '{print $$2}' | xargs -I {} kill -USR1 {} ```