最近在帮朋友做毕设的一部分,主要需求是:可拔插的程序进行服务器的重启部署等等
最初思路是:一个服务器用作配置进行编译.so 文件
其他子服务器调用此服务器上的配置好的.so 服务
编译部分:
_, err := exec.Command("go", "build", "-buildmode=plugin", "-o", "plugin/"+serviceName+".so",
"plugin/"+serviceName+".go").Output()
编译完成后:写入消息进入消息队列
调用阶段:
type Common interface {
Service([]byte) []byte
}
open, err := plugin.Open($addr+ $serviceName + ".so")
if err != nil {
fmt.Println("打开插件错误:", err)
return nil
}
symbol, err := open.Lookup(serviceName)
if err != nil {
fmt.Println("服务未发现:", err)
return nil
}
if srv, ok := symbol.(Common); ok {
return srv.Service(data)
}
return nil
是的,调用的时候报错了 not implement 不能远程通过网络链接调用,换了一种方式下载到了本地,然后再调用,可以使用,但是本地服务器和远端服务器系统环境必须一样,否则不能执行。 后来摒弃了动态链接拔插的这种方式了。接触不多且打开方式不正确,就放弃了
源码中的例子
// A Symbol is a pointer to a variable or function.
//
// For example, a plugin defined as
//
// package main
//
// import "fmt"
//
// var V int
//
// func F() { fmt.Printf("Hello, number %d\n", V) }
//
// may be loaded with the Open function and then the exported package
// symbols V and F can be accessed
//
// p, err := plugin.Open("plugin_name.so")
// if err != nil {
// panic(err)
// }
// v, err := p.Lookup("V")
// if err != nil {
// panic(err)
// }
// f, err := p.Lookup("F")
// if err != nil {
// panic(err)
// }
// *v.(*int) = 7
// f.(func())() // prints "Hello, number 7"
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于