plugin.md 1.39 KB

热更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
  3. 程序和插件需要同一个golang的环境。
  4. golang对同一个插件只能加载一次。可以修改.so文件名字 + 软连接的方式来处理

写插件代码

插件中的代码主要是对线上程序 协议=>逻辑 的热更.

比如我们要修改游戏服务协议号为1的逻辑。 则在cmd/gameserver/plugin/plugin.go文件中修改。

  1. 在函数GetActionMap中增加一行 am[uint32(1)] = HotRpc
  2. 增加函数HotRpc

    func HotRpc(msg components.IMessage) (int32, interface{}) {
    }
    
  3. 编译插件 & 可以参考Makefile:plugin

    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

    regame:plugin
    lsof -i:8850 | grep "agent" | grep -v grep | awk '{print $$2}'  | xargs -I {} kill -USR1 {}