基于 monkey-patch + plugin 机制实现的热修复方案,用于实现不停服修复 bug!!
仓库地址: https://github.com/go-hotfix/hotfix
感兴趣可以玩一下 example/webapp 这个例子,注意仅支持 Linux ( ps: Windows 可以在 wsl2 里面玩)
hotfix is a golang function hot-fix solution
警告: 目前尚未经过严格测试,请勿用于生产环境
Warning: This has not been rigorously tested, do not use in production environment
注意: 不支持 Windows
Note: Windows is not supported
注意: 为了确保函数都能被修补,需要关闭函数内联,会因此损失一些性能
Note: To ensure that all functions can be patched, function inlining needs to be disabled, which will result in a loss of some performance
stw
确保所有协程都进入安全点从而实现线程安全的补丁stw
to ensure that all coroutines enter safe points to hot patching-gcflags=all=-l
-gcflags=all=-l
invalid reference to xxxx
是因为 go1.23
开始限制了go:linkname
功能,必须添加编译参数关闭限制-ldflags=-checklinkname=0
invalid reference to xxxx
is because go1.23
began to limit the go:linkname
function, and the compilation parameter must be added to turn off the restriction -ldflags=-checklinkname=0
main
包下面的init
会首先调用一次,请注意不要重复初始化main
包必须产生变化,否则可能出现 plugin already loaded
错误,推荐使用 -ldflags="-X main.HotfixVersion=v1.0.1"
指定版本号, 确保每次编译补丁包都会有变化main
package must be changed when applying the patch package, otherwise the plugin already loaded
error may occur. It is recommended to use -ldflags="-X main.HotfixVersion=v1.0.1"
to specify the version number to ensure that the patch package is compiled every time There will be changes这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.