如何通过 grpc-gateway 处理多个端点?

我确定所有服务都正常运行。


我有以下代码:


此代码段用于注册两个端点。


func RegisterEndpoints(ctx context.Context, c *utils.AppConfig, r resolver.Builder) (http.Handler, error) {

    var err error

    mux := runtime.NewServeMux()

    dialOpts := []grpc.DialOption{grpc.WithBalancerName("round_robin"), grpc.WithInsecure()}


    err = protos.RegisterUserCenterHandlerFromEndpoint(ctx, mux, r.Scheme()+"://author/user-center", dialOpts)

    if err != nil {

        return nil, err

    }


    err = protos.RegisterSsoHandlerFromEndpoint(ctx, mux, r.Scheme()+"://author/sso", dialOpts)

    if err != nil {

        return nil, err

    }


    return mux, nil

}

在我的 中main.go,我构建了一个解析器来解析名称到地址,然后注册两个端点并监听端口 8080。


func run() error {

    c := utils.GetAppConfig()


    ctx := context.Background()

    ctx, cancel := context.WithCancel(ctx)

    defer cancel()


    r := localresolver.NewResolver(fmt.Sprintf("%s:%d", c.Registry.Host, c.Registry.Port))

    resolver.Register(r)


    mux := http.NewServeMux()


    // Register endpoints here

    gw, err := routes.RegisterEndpoints(ctx, c, r)

    if err != nil {

        return err

    }

    mux.Handle("/", gw)

    fmt.Println("Listening localhost:8080...")

    return http.ListenAndServe(fmt.Sprintf("%s:%d", c.Gateway.Host, c.Gateway.Port), mux)

}


func main() {

    defer glog.Flush()


    if err := run(); err != nil {

        glog.Fatal(err)

    }

}

但是我跑了之后go run main.go发现只能访问我注册的最后一个服务,也就是ssoservice(err = protos.RegisterSsoHandlerFromEndpoint(ctx, mux, r.Scheme()+"://author/sso", dialOpts)行)。


任何人都可以向我展示通过注册多个端点的正确方法的示例grpc-gateway吗?(使注册的所有服务grpc-gateway都可以成功访问)



红颜莎娜
浏览 156回答 2
2回答

眼眸繁星

无需将ServeMux(gw) 作为处理程序传递给 mux var,您只需将 ListenAndServe 传递给返回的gw变量即可。    // Register endpoints here    gw, err := routes.RegisterEndpoints(ctx, c, r)    if err != nil {        return err    }    fmt.Println("Listening localhost:8080...")    return http.ListenAndServe(fmt.Sprintf("%s:%d", c.Gateway.Host, c.Gateway.Port), gw)在RegisterEndpoints函数中,端点参数应该是你的host:port,api端点应该在proto文件的google api注释中提供。    err = protos.RegisterUserCenterHandlerFromEndpoint(ctx, mux, fmt.Sprintf("%s:%d", c.Gateway.Host, c.Gateway.Port), dialOpts)    if err != nil {        return nil, err    }    err = protos.RegisterSsoHandlerFromEndpoint(ctx, mux, fmt.Sprintf("%s:%d", c.Gateway.Host, c.Gateway.Port), dialOpts)    if err != nil {        return nil, err    }

森林海

我附加grpc.WithBlock()到grpc.DialOption,然后可以通过grpc-gatewaynow 访问所有服务。如下所示:dialOpts := []grpc.DialOption{grpc.WithBalancerName("round_robin"), grpc.WithInsecure(), grpc.WithBlock()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go