You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:09:52