66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package instance
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/hashicorp/go-plugin"
|
|
"os/exec"
|
|
"plugins/sdk/shared"
|
|
)
|
|
|
|
type PkgConf struct {
|
|
Cmd string // 插件的执行路径
|
|
Tag string // 插件的tag,对应插件
|
|
}
|
|
|
|
var ManageMap manage
|
|
|
|
// Get 获取服务
|
|
func Get(tag string) shared.PluginService {
|
|
if _, ok := ManageMap[tag]; ok {
|
|
return ManageMap[tag].service
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func Load(load []*PkgConf) error {
|
|
ManageMap = make(manage)
|
|
for _, v := range load {
|
|
srv, err := service(v.Cmd, v.Tag)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = ManageMap.add(server{
|
|
tag: v.Tag,
|
|
service: srv,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func service(cmd, tag string) (shared.PluginService, error) {
|
|
pluginClientConfig := &plugin.ClientConfig{
|
|
HandshakeConfig: shared.Handshake,
|
|
Cmd: exec.Command(cmd),
|
|
Plugins: map[string]plugin.Plugin{tag: &shared.GRPCPlugin{}},
|
|
AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC},
|
|
}
|
|
|
|
client := plugin.NewClient(pluginClientConfig)
|
|
pluginClientConfig.Reattach = client.ReattachConfig()
|
|
protocol, err := client.Client()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("plugin.NewClient err:%v", err)
|
|
}
|
|
|
|
raw, err := protocol.Dispense(tag)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("protocol.Dispense err:%v", err)
|
|
}
|
|
|
|
// 类型断言为PluginService接口
|
|
return raw.(shared.PluginService), nil
|
|
}
|