如何限制在Go中实现的HTTP Server的连接数?

问题描述 投票:11回答:3

我正在尝试在Golang中实现HTTP服务器。

我的问题是,我必须在任何特定时间将最大活动连接数限制为20。

go httpserver
3个回答
13
投票

如果您不想实现自己的包装器,则可以使用netutil.LimitListener函数来包装netutil.LimitListener:-

net.Listener

5
投票

技巧是实现自己的connectionCount := 20 l, err := net.Listen("tcp", ":8000") if err != nil { log.Fatalf("Listen: %v", err) } defer l.Close() l = netutil.LimitListener(l, connectionCount) log.Fatal(http.Serve(l, nil)) 。我有一个侦听器net.Listener(请参见waitConn和WaitListener)的示例,该示例跟踪连接(但不限制连接),您可以将其用作实现的灵感。形状将如下所示:

here

本质上,这是创建您自己的net.Listener实现,您可以将其提供给type LimitedListener struct { sync.Mutex net.Listener sem chan bool } func NewLimitedListener(count int, l net.Listener) *net.LimitedListener { sem := make(chan bool, count) for i := 0; i < count; i++ { sem <- true } return &net.LimitedListener{ Listener: l, sem: sem, } } func (l *LimitedListener) Addr() net.Addr { /* ... */ } func (l *LimitedListener) Close() error { /* ... */ } func (l *LimitedListener) Accept() (net.Conn, err) { <-l.sem // acquire // l.Listener.Accept (on error, release before returning) // wrap LimitedConn return c, nil } type LimitedConn struct { /* ... */ } func (c *LimitedConn) Close() error { /* ... */ c.sem <- true // release } ,该实现仅在获得信号量时才调用底层的Accept;仅在(适当包装的)Serve关闭时释放如此获取的信号量。请注意,从技术上讲,信号量的使用相对于go1.2 net.Conn是正确的;在Go的memory model中,更简单的信号量将是合法的。


1
投票

借助渠道,您可以限制活动连接的数量。

1。在服务器启动时,创建一个通道并将相等数量的极限计数(在您的情况下为20)值放入该通道。

2。在处理一个请求时从通道中删除一个值。

网络上的一个例子

future versions
© www.soinside.com 2019 - 2024. All rights reserved.