plugins/sdk/instance/instance.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
}