Как обрабатывать несколько конечных точек через grp c -gateway? - PullRequest
1 голос
/ 21 января 2020

Я уверен, что все службы работают нормально.

У меня есть код ниже:

Этот фрагмент используется для регистрации двух конечных точек.

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 build я создаю преобразователь для преобразования имени в адрес, затем регистрирую две конечные точки и прослушиваю порт 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] ​​Нужна дополнительная помощь, теперь мой код подобен приведенному ниже:

the latest code

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

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

name resolver resolves the addresses

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

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

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

dialOpts := []grpc.DialOption{grpc.WithBalancerName("round_robin"), grpc.WithInsecure(), grpc.WithBlock()}
0 голосов
/ 24 января 2020

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

    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
    }
...