如何通过Go代码调用GRPC服务反射的list方法?
使用Go语言调用gRPC反射获取服务列表
步骤1:导入必要的包
需要引入gRPC反射服务的官方Go包,以及上下文、格式化等基础包:
import ( "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" reflection "google.golang.org/grpc/reflection/grpc_reflection_v1" )
步骤2:通过现有连接调用反射服务
利用你已创建的conn连接,实例化反射客户端,然后通过双向流方法获取服务列表,逻辑和grpcurl list完全一致:
完整示例代码:
func main() { // 你的现有连接代码 conn, err := grpc.NewClient( "localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()), ) if err != nil { panic(fmt.Sprintf("连接失败: %v", err)) } defer conn.Close() // 创建反射服务客户端 refClient := reflection.NewServerReflectionClient(conn) // 构造请求:空字符串表示获取所有服务 req := &reflection.ServerReflectionRequest{ MessageRequest: &reflection.ServerReflectionRequest_ListServices{ ListServices: "", }, } // 调用反射的双向流方法 stream, err := refClient.ServerReflectionInfo(context.Background()) if err != nil { panic(fmt.Sprintf("调用反射服务失败: %v", err)) } // 发送请求 if err := stream.Send(req); err != nil { panic(fmt.Sprintf("发送请求失败: %v", err)) } // 接收响应 resp, err := stream.Recv() if err != nil { panic(fmt.Sprintf("接收响应失败: %v", err)) } // 解析并输出服务列表 if listResp := resp.GetListServicesResponse(); listResp != nil { fmt.Println("服务列表:") for _, svc := range listResp.Service { fmt.Printf("- %s\n", svc.Name) } } // 关闭流 stream.CloseSend() }
额外说明
- 如果你的gRPC服务器只支持
v1alpha版本的反射,只需将导入的包替换为google.golang.org/grpc/reflection/grpc_reflection_v1alpha,并使用对应包的客户端即可。 ServerReflectionInfo是双向流方法,所以需要通过流对象发送请求、接收响应,这和普通的gRPC方法调用逻辑略有区别。
内容的提问来源于stack exchange,提问作者hydradon
相关产品推荐
相关产品推荐

