Erlang
热更步骤
1.创建热更模块接口
2.替换编译文件.beam
3.执行热更
主要实现方法是使用code代码服务函数
code:purge(Mod),
清除模块的代码,清除并标记为旧版本代码
code:load_file(Mod).
加载一个模块
由于模块加载之后存在虚拟机 可直接替换bin文件夹中的Mod.beam文件 执行跟新
当旧的Mod:A-old()执行结束 会切到Mod:A-new() 所以不用担心冲突
接口
运维后台通过TCP请求热更和参数
由于使用TCP/IP 后台传参(即热更模块名称已转为二进制,需进行转换为原子,且后台执行热更需要返回结果 如果热更文件过多 直接调用fun()可能后台需要等待很长时间 所以需要用到Spawn)
实现
//入口
Ref2 = lib_gm_command:process_binary(Socket, Binary),
lib_send:send_one(Socket, Ref2);
//处理二进制获取参数(根绝自己和后台的规则处理 此处忽略)
spawn(lib_update,update_file,[Filename]),//Filename热更文件list
<<>>; //即Ref2
//热更操作
UpdateFileList = lists:map(fun(E)->
binary_to_atom(E,latin1)
end,re:split(FileList,"\\,")),//二进制转原子 分割
load(UpdateFileList);//执行热更
//递归循环
load([]) -> ok;
load([FileName | T]) ->
code:purge(FileName ),
code:load_file(FileName ).
info("loaded: ~w", [FileName]),
load(T).