1

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

我有以下代码:

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

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都可以成功访问)


[2020-01-31] 需要更多帮助,现在我的代码如下:

最新代码

其他代码与之前相同。

另外,这是名称解析器显示的结果:

名称解析器解析地址

4

2 回答 2

0

无需将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
    }
于 2020-01-24T03:43:28.613 回答
0

我追加grpc.WithBlock()grpc.DialOption,那么现在就可以访问所有服务grpc-gateway了。

如下所示:

dialOpts := []grpc.DialOption{grpc.WithBalancerName("round_robin"), grpc.WithInsecure(), grpc.WithBlock()}
于 2020-02-05T02:23:01.217 回答