为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红颜莎娜 2022-05-05 18:13:48
我确定所有服务都正常运行。我有以下代码:此代码段用于注册两个端点。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都可以成功访问)
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

无需将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

    }


查看完整回答
反对 回复 2022-05-05
?
森林海

TA贡献2011条经验 获得超2个赞

我附加grpc.WithBlock()grpc.DialOption,然后可以通过grpc-gatewaynow 访问所有服务。

如下所示:

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


查看完整回答
反对 回复 2022-05-05
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信