当前位置: 首页 > wzjs >正文

国外做问卷网站中交路桥建设网站

国外做问卷网站,中交路桥建设网站,网站域名更改了怎么换,百姓网二手车个人背景 对于一个部署在生产环境的项目来说,我们希望当代码出现bug的时候,可以不用重启进程而达到动态修改代码的目的—— 这就是代码热部署! 使用java做游戏服务器,最大的好处是,当代码出现bug,可以直接热…

背景

对于一个部署在生产环境的项目来说,我们希望当代码出现bug的时候,可以不用重启进程而达到动态修改代码的目的——

这就是代码热部署!

使用java做游戏服务器,最大的好处是,当代码出现bug,可以直接热更新代码来解决,而无须重启服务器。

如果使用JVM的Instrumentation功能,可以实现方法体内部的代码热更新,具体原理及操作可参考

游戏服务端框架之代码热部署(一)

如果使用类单列替换,甚至可以实现在类内部添加新的属性或者方法,具体原理及操作可参考

游戏服务端框架之代码热部署(二)

Go热更新

基本演示

插件代码 plugin.go

package mainimport "fmt"func SayHello() {fmt.Println("11111")
}

编译插件

在 Windows 命令行中,使用以下命令编译插件:

go build -buildmode=plugin -o plugin.dll plugin.go

遗憾的是,截止到go 1.23.0,windows暂不支持plugin模式,直接报错:

go build -buildmode=plugin -o plugin.dll plugin.go
-buildmode=plugin not supported on windows/amd64

改成linux测试

 go build -o plugin.so -buildmode=plugin plugin.go

主程序代码 main.go 

package mainimport ("fmt""plugin""time"
)func loadPlugin() (func(), error) {p, err := plugin.Open("plugin.so") if err != nil {return nil, err}sayHello, err := p.Lookup("SayHello")if err != nil {return nil, err}return sayHello.(func()), nil
}func main() {sayHello, err := loadPlugin()if err != nil {fmt.Println("Error loading plugin:", err)return}sayHello()// 模拟文件监控,这里简单使用定时检查ticker := time.NewTicker(5 * time.Second)for range ticker.C {newSayHello, err := loadPlugin()if err == nil {sayHello = newSayHellofmt.Println("Plugin reloaded.")}sayHello()}
}

修改plugin.go代码

package mainimport "fmt"func SayHello() {fmt.Println("2222")
}

重新编译,发现重新加载了插件,但打印还是旧的。 百思不得其解,尝试添加输出文件的修改日期,或者输出函数指针地址,都找不到原因。最后,在网上偶然看到有文章说,plugin.Open()函数,对于同一个文件名称,只会加载一次。

由此想到一种思路,每次编译使用不同的名称,然后通过http的方式,通过main函数加载新的插件名称。代码如下:

func updatePluginName(c *gin.Context) {pluginName := c.Query("name")if pluginName == "" {c.JSON(http.StatusBadRequest, gin.H{"error": "Plugin name is required"})return}newSayHello, err := loadPlugin(pluginName)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Failed to load plugin: %v", err)})return}sayHello = newSayHelloc.JSON(http.StatusOK, gin.H{"message": "Plugin reloaded successfully"})
}func main() {r := gin.Default()// 定义更新插件文件名的接口r.GET("/update-plugin", updatePluginName)// 启动 Gin 服务器go func() {if err := r.Run(":8090"); err != nil {fmt.Printf("Failed to start server: %v\n", err)}}()// 每隔一段时间调用一次 SayHello 函数ticker := time.NewTicker(2 * time.Second)for {if sayHello != nil {sayHello()}<-ticker.C}
}

运行程序后,先执行

go build -buildmode=plugin -o plugin.so plugin.go
curl "http://localhost:8090/update-plugin?name=plugin.so"

输出1111

修改plugin.go代码,再执行

go build -buildmode=plugin -o plugin.so plugin2.go
curl "http://localhost:8090/update-plugin?name=plugin2.so"

输出2222

成功了!!

然而,Go 语言的 plugin 包在热更新方面存在诸多限制:

  • 一次性加载plugin.Open 对于同一个插件文件只能加载一次,若要更新插件,就必须更换文件名。
  • 状态丢失:每次加载新的插件都会创建一个新的实例,旧插件的状态无法保留。
  • 功能受限plugin 包主要用于加载外部插件,无法像 Java Instrumentation 那样对已加载的类的方法体进行细粒度的修改。
  • windows平台暂不支持

结论是:

Go的plugin机制在生产环境实现热更新,还有很长一段路要走。目前的功能完全是鸡肋!!


文章转载自:

http://fQ1Zs2y7.rwzmz.cn
http://55gBbmAA.rwzmz.cn
http://MfsFsjhz.rwzmz.cn
http://Qv5HpeE3.rwzmz.cn
http://v2VcR33W.rwzmz.cn
http://x1ppLRpr.rwzmz.cn
http://AYNLRHnX.rwzmz.cn
http://41gNNzoe.rwzmz.cn
http://6q49yvqp.rwzmz.cn
http://Tl62qgfL.rwzmz.cn
http://6iCZPgaJ.rwzmz.cn
http://CtIcGueZ.rwzmz.cn
http://88p9nMCx.rwzmz.cn
http://wblXC0tM.rwzmz.cn
http://S76DW63z.rwzmz.cn
http://jhSVcL9H.rwzmz.cn
http://ajhjmFU0.rwzmz.cn
http://vn6tCApH.rwzmz.cn
http://yb2cIT8e.rwzmz.cn
http://ShOUjxxa.rwzmz.cn
http://3f3HhrQb.rwzmz.cn
http://Q9lcphlB.rwzmz.cn
http://mKx9YbRl.rwzmz.cn
http://x4hR0X8W.rwzmz.cn
http://Ov7BLnRz.rwzmz.cn
http://Nm4xm55P.rwzmz.cn
http://CK2fQMuK.rwzmz.cn
http://GC1gm62S.rwzmz.cn
http://hb0qlPKB.rwzmz.cn
http://5pa5V5HG.rwzmz.cn
http://www.dtcms.com/wzjs/753338.html

相关文章:

  • 网站模板兼容手机端seo的工作内容
  • 网站建设app杭州公司官网制作教程
  • 山西省住房和城乡建设厅网站首页建立网站第一步怎么做
  • 自助建站seo长沙百度百科
  • 济宁苍南网站建设做网站需准备些什么
  • 网站流量用完wordpress 附件下载
  • 营销网站的功能网站制作培训费用
  • 电商网站的相同点中国农业科技推广网
  • 网站301重定向 注意事项ideo设计公司官网
  • 做版面的网站wordpress 开发插件
  • 网站开发实战教程wordpress 优惠插件
  • 温州网站建设服务中心南宁网站开发外包性价比
  • 个人网站需要多大的网速中国最新军事新闻报道
  • 中国建设银行嵊州市支行网站网站设计的时间计划
  • 微网站 .net微信数据统计小程序
  • 网站的视频历史权重查询
  • 廊坊酒店网站建设win7 添加asp网站
  • 如何做幸运28网站代理明星网页设计模板图片
  • 要建一个网站该怎么做上海跨境电商公司
  • 古镇建网站公司东营企业网站建设
  • 做甜品网站电子商务开发公司
  • 不写代码门户网站建设有没有免费注册的网站
  • 企业邮箱什么格式太原网站seo顾问
  • 长春网站建设SEO优化营销海外网络推广公司
  • 衡阳网站建设石家庄关键词排名首页
  • 51ape是谁做的网站网页项目描述怎么写
  • 服务器网站后台登陆密码黄框显示济南市新增风险点信息公布
  • 知道内容怎样让别人做网站阿里云建公司网站
  • 中国大良网站建设米问外贸论坛
  • html家乡网站设计模板开发一个网站平台多少钱