golang中怎么利用plugin实现热更新-创新互联

本篇文章为大家展示了golang中怎么利用 plugin实现热更新,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

成都创新互联公司于2013年创立,先为南召等服务建站,南召等地企业,进行企业商务咨询服务。为南召企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

一个程序包含两部分:数据和算法,那么既然是有状态服务,数据部分肯定不能动,那么热更就只能动算法部分了。这时我们需要一个容器,将这两部分隔离开,一方面是存储数据,另一方面要动态加载so。隔离了数据和算法,只要数据存在,我们就可以随意更新算法了。在开始编码之前,要先解决几个问题:

1、同一个so文件只会被打开一次

2、每个so有一个pluginpath用来标识是否重复,如果两个so文件不一样,但pluginpath一样还是会报错

3、不同so文件定义的结构体不能使用类型断言进行转换

对于上面的问题,有如下解决方案:

1、每次生成的so带一个版本号比如game.1001.so

2、编译的时候新增--ldflags="-pluginpath=xxx"参数

3、使用unsafe进行转换(下面还会有注意事项)

 代码地址:https://github.com/scgywx/myplugin

1、编译engine,这就是我们上面说的容器,他负责数据存储和so的加载与执行。

sh build.sh

2、编译第1个版本so(注意后面有个参数)

sh build_so.sh 1

3、将src/logic/main.go里面的modelVersion和modelName分别改成1002和game2(这里主要是测试两个版本的内容区别)

4、编译第2个版本so

sh build_so.sh 2

5、运行容器

./engine

6、浏览器输入127.0.0.1:12345/hello,会看到如下显示(这是使用的第一个版本so)

复制代码 代码如下:

hello test, this is golang plugin test!, version=1001, name=game1, oldversion=0, oldName=

7、浏览器输入127.0.0.1:12345/load?name=plugin2.so(这里输出done,就说明加载so成功了)

8、再次输入127.0.0.1:12345/hello,会看到如下显示。

复制代码 代码如下:

hello test, this is golang plugin test!, version=1002, name=game2, oldversion=1001, oldName=game1

到这里,我们的热更新效果已经达成,但是还是有一些限制

1、每个so不能单独保存数据,因为当另一个so加载后,前面so的数据是没办法访问到,并且由于so不能被关闭,可能会出现多个so引用同一个变量,gc没办法释放,所以需要透过容器来共享数据,那么我们就不能在模块内使用全局变量来保存数据。

2、go里面两个类型即使一样,也不能直接转换,所以两个so内定义的结构体也不能直接转换,要使用unsafe.Pointer来进行强转(见src/logic/main.go),既然是强转,那么两个版本的so使用的结构体定义就不能有区别,否则转换后数据可能会出现异常,也就是说热更新不能修改结构体。

上述内容就是golang中怎么利用 plugin实现热更新,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联成都网站设计公司行业资讯频道。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站题目:golang中怎么利用plugin实现热更新-创新互联
分享链接:http://myzitong.com/article/cdgoig.html