我可以使用Go从一个Web应用程序设置多个端口吗?

pgvzfuti  于 2023-05-11  发布在  Go
关注(0)|答案(3)|浏览(200)

据我所知,我可以用Golang运行简单的Web服务器,只需使用http包,如

http.ListenAndServe(PORT, nil)

其中PORT是要侦听的TCP地址。
我可以使用PORT作为PORTS,例如来自一个应用程序的http.ListenAndServe(":80, :8080", nil)吗?
可能我的问题是愚蠢的,但“谁不问,他不会得到答案!”

jslywgbw

jslywgbw1#

不你不能
但是,您可以在不同的端口上启动多个侦听器

go http.ListenAndServe(PORT, handlerA)
http.ListenAndServe(PORT, handlerB)
mbzjlibv

mbzjlibv2#

下面是一个简单的工作示例:

package main

import (
    "fmt"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "hello")
}

func world(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "world")
}

func main() {
    serverMuxA := http.NewServeMux()
    serverMuxA.HandleFunc("/hello", hello)

    serverMuxB := http.NewServeMux()
    serverMuxB.HandleFunc("/world", world)

    go func() {
        http.ListenAndServe("localhost:8081", serverMuxA)
    }()

    http.ListenAndServe("localhost:8082", serverMuxB)
}
qco9c6ql

qco9c6ql3#

您将需要不同的*http.Server示例,每个示例都单独配置(根据您的选择相同或不同)处理程序(或路由器)来为其端点提供服务。
我们有一个更好的方法来组织并发的http.Server示例,同时仍然支持SIGINT之后的优雅关闭,这是从shell发送到操作系统的信号。终端用户按下ctrl+c时,操作系统进行编程。

func main() {
    var serverA = &http.Server{}
    var serverB = &http.Server{}

    // ... configure them as you wish: add endpoints

    go serverA.ListenAndServe()
    go serverB.ListenAndServe()

    // create a channel to subscribe ctrl+c/SIGINT event
    sigInterruptChannel := make(chan os.Signal, 1)
    signal.Notify(sigInterruptChannel, os.Interrupt)
    // block execution from continuing further until SIGINT comes
    <-sigInterruptChannel
    
    // create a context which will expire after 4 seconds of grace period
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*4)
    defer cancel()
    
    // ask to shutdown for both servers
    go serverA.Shutdown(ctx)
    go serverB.Shutdown(ctx)

    // wait until ctx ends (which will happen after 4 seconds)
    <-ctx.Done()
}

参见:

  • signal.Notify()
  • http.Shutdown(context.Context)

相关问题