Hashicorp go-plugin共享接口传参异常:调用无响应无报错
问题描述
基于Hashicorp go-plugin官方示例开发Go插件,需暴露接收JSON字符串参数的CdExec(string)方法,返回包含data和status字段的JSON字符串。调用插件时无报错但返回空结果,日志显示插件已启动且方法被调用,但最终输出为空。
核心问题定位
1. RPC客户端未传递实际参数
共享接口的CdExecutorRPCClient.CdExec方法中,RPC调用时传入的是空接口指针new(interface{}),并未将实际的请求参数传递给服务端:
// 错误代码 err := g.client.Call("Plugin.CdExec", new(interface{}), &resp)
服务端收到空值,导致后续处理无有效输入。
2. RPC服务端参数处理与错误丢弃
服务端CdExecutorRPCServer.CdExec方法参数类型定义为interface{},且丢弃了插件方法返回的错误:
// 错误代码 func (s *CdExecutorRPCServer) CdExec(args interface{}, resp *string) error { fmt.Println("CdExecutorRPCServer::args:", args) *resp, _ = s.Impl.CdExec(fmt.Sprintf("%v", args)) return nil }
客户端未传参数导致args为空,插件解析空JSON字符串失败,但错误被丢弃,客户端无法感知问题,最终返回空结果。
修复方案
1. 修正RPC客户端参数传递
修改共享接口的CdExecutorRPCClient.CdExec方法,传递实际请求参数:
func (g *CdExecutorRPCClient) CdExec(req string) (string, error) { var resp string // 传递实际的req参数 err := g.client.Call("Plugin.CdExec", req, &resp) if err != nil { return "", err } return resp, err }
2. 修正RPC服务端参数类型与错误处理
调整服务端方法参数类型为字符串,并返回实际错误:
func (s *CdExecutorRPCServer) CdExec(args string, resp *string) error { fmt.Println("CdExecutorRPCServer::args:", args) var err error *resp, err = s.Impl.CdExec(args) // 返回错误给客户端 return err }
验证修复
重新编译插件与宿主程序:
go build -o ./plugin/executor ./plugin/plugin.go go build -o CdPluginHost .
执行宿主程序后,将得到预期输出:
Plugin Result: {"data":"Your result data","status":"success"}
内容的提问来源于stack exchange,提问作者goremo
相关产品推荐
相关产品推荐

