Как обрабатывать несколько конечных точек через 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, я обнаружил, что доступен только последний зарегистрированный мной сервис, то есть сервис sso (строка err = protos.RegisterSsoHandlerFromEndpoint(ctx, mux, r.Scheme()+"://author/sso", dialOpts)).

Может ли кто-нибудь показать мне пример правильного способа регистрации нескольких конечных точек через grpc-gateway? (сделайте так, чтобы все службы, зарегистрированные с помощью grpc-gateway, могли быть успешно посещены)


[2020-01-31] ​​Нужна дополнительная помощь, теперь мой код выглядит следующим образом:

последний код

Другой код такой же, как и раньше.

Кроме того, это результат, который показывает преобразователь имен:

преобразователь имен разрешает адреса


person Rex Tsao    schedule 21.01.2020    source источник


Ответы (2)


Нет необходимости передавать ServeMux (gw) в переменную мультиплексора в качестве обработчика, вы можете просто 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 должна быть указана в аннотации API Google в файле proto.

    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
    }
person Andy    schedule 24.01.2020
comment
Ценю ваш ответ, но следуйте вашему совету, он все равно не сработает. В моем случае я использую etcd в качестве реестра, поэтому две службы user-center и sso имеют разные пары host:port, поэтому я использую r в качестве преобразователя, чтобы сообщить gRPC о разрешении адреса. После того, как я запустил службу grpc-gateway, обнаруживаются оба их адреса, но все равно доступен только последний зарегистрированный. Надеюсь на помощь. - person Rex Tsao; 31.01.2020
comment
Я обновил этот вопрос, чтобы показать более подробную информацию, с нетерпением жду вашего ответа. - person Rex Tsao; 31.01.2020

Я добавил grpc.WithBlock() к grpc.DialOption, теперь ко всем службам можно получить доступ через grpc-gateway.

Как показано ниже:

dialOpts := []grpc.DialOption{grpc.WithBalancerName("round_robin"), grpc.WithInsecure(), grpc.WithBlock()}
person Rex Tsao    schedule 05.02.2020