Одновременный запуск серверов grpc и http

Я переношу существующее приложение http в приложение на основе GRPC. Некоторое время и grpc, и http будут работать на разных портах в одном файле go, и я перенесу существующую часть http-сервера в горутину. Вот как бы это выглядело.

    main() {
        //Move existing server  into a goroutine
        go func() {
             s.server, err = chttp.NewHTTPSServer("443", s.certPath, s.keyPath, s.Router, s.options)
            if err != nil {
                log.Fatalf("server: error creating HTTP server - %v\n", err)
            }

            if err := s.server.Serve(); err != http.ErrServerClosed {
                log.Fatalf("server: run error - %v\n", err)
            }
        }

        // Add new grpc server
        lis, err := net.Listen("tcp", ":8433")
        if err != nil {
            log.Fatalf("failed to listen: %v", err)
        }
        a := grpc.NewServer()
        pb.RegisterNewServer(a, &test.GrpcServer{})
        if err := a.Serve(lis); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }

    }

Может ли это вызвать какие-либо проблемы, может ли grpc, http-сервер запускаться одновременно из одной и той же программы? Я не уверен, может ли это вызвать какие-то проблемы, о которых я не знаю.


person Salmaan P    schedule 16.06.2020    source источник
comment
Прекрасно запускать два сервера в одном и том же двоичном файле. Убедитесь, что если один умрет, другой тоже умрет. log.Fatal должен позаботиться об этом.   -  person Burak Serdar    schedule 16.06.2020
comment
Я этого не делал. Но именно это и сделал бывший владелец сервиса, который я обслуживаю сейчас. Пока не сталкивался с проблемой, связанной с этим, уже полтора года. :П   -  person Mahmudul Haque    schedule 16.06.2020


Ответы (1)


Да, вполне нормально запускать серверы gRPC и HTTP из одного и того же двоичного файла, если порты разные.

Но, конечно, если эти два сервера делают разные вещи, лучше их разделить.

И если вы хотите сделать то же самое для обоих серверов, используя https://github.com/grpc-ecosystem/grpc-gateway - это обычная практика. Он считывает ваши определения protobuf и генерирует обратный прокси-сервер для преобразования HTTP API в gRPC.

person hutabalian    schedule 16.06.2020
comment
Ну, всегда хотел спросить: REST ориентирован на существительное, а RPC - на глагол, это выглядит абсурдом, что люди должны переводить одно в другое, не так ли? Вы знаете серьезную компанию, которая использует шлюз grpc в производстве? - person Olegs; 17.06.2020
comment
Не думаю, что это абсурд. Даже когда вы создаете в своей системе только REST API, вам нужно будет сопоставить его с функцией, которая является глаголом, верно? Несколько команд в моей нынешней компании (deliveryhero.com/brands) используют шлюз grpc. Я также использую его в своей предыдущей компании, где мой API должен использоваться другим сервером через gRPC и веб-интерфейсом через REST. - person hutabalian; 17.06.2020