2014-01-17 7 views
3

В программе go, я хочу одновременно запустить два веб-сервера,
очевидно, что они будут обслуживать два разных порта (и, если необходимо, IP-адреса) ,
проблема связана с вызовом http.handle, когда я пытаюсь зарегистрировать обработчик для '/' для второго сервера, он паникует и говорит, что уже есть обработчик, связанный с '/',
Мне кажется, мне нужно создать мукс в дополнение к DefaultServeMux, и я попытался сделать это, используя gorillaMux, но не смог понять,Запуск двух веб-серверов одновременно за один раз в программе

Есть что-то принципиально неправильное с runni два веб-сервера в одной и той же программе/процессе.

Чтобы сделать его более понятным, один из двух веб-серверов используется как обычный веб-сервер, мне нужен второй, который будет выступать в роли RPC-сервера для обмена информацией между экземплярами программы, запущенной на разных узлах кластер,

EDIT: чтобы сделать его немного более ясно, что это не реальный код, но это суть

myMux := http.NewServeMux() 
myMux.HandleFunc("/heartbeat", heartBeatHandler) 

http.Handle("/", myMux) 

server := &http.Server{ 
    Addr: ":3400", 
    Handler: myMux, 
} 
go server.ListenAndServe() 

gorillaMux := mux.NewRouter() 
gorillaMux.HandleFunc("/", indexHandler) 
gorillaMux.HandleFunc("/book", bookHandler) 

http.Handle("/", gorillaMux) 

server := &http.Server{ 
    Addr: ":1234", 
    Handler: gorillaMux, 
} 

log.Fatal(server.ListenAndServe()) 
+0

Можете ли вы предоставить код, который используете? – Agis

+0

@Agis Только что сделал! – Ali

ответ

7

Я думаю, вам просто нужно удалить эти строки:

http.Handle("/", myMux) 
http.Handle("/", gorillaMux) 

Все маршруты уже определены в myMux и gorillaMux.

Проверьте: http://play.golang.org/p/wqn4CZ01Z6

+0

действительно ?! спасибо, это было неловко, я думал, что это зарегистрировать мультиплексор с сервером, чтобы не обслуживать «/» – Ali

+1

Я бы обновил ваш пример, чтобы быть немного более идиоматичным; в частности, ошибки должны быть проверены, и трудно понять разницу между первым и вторым серверами. Вероятно, самым простым способом сделать что-то вроде этого является создание двух отдельных функций: по одному для каждого сервера, который регистрируется и затем обслуживает (проверяя ошибки!). Затем основное заканчивается двумя операциями go и терминалом select {}. –

+0

@ kyle-lemons Я согласен с вами и даже больше, я думаю, что Go нуждается в гораздо более ** лучших практических примерах, которые могут научить, как делать вещи качественно. – jurka

 Смежные вопросы

  • Нет связанных вопросов^_^