服务端限流-并发最大值控制简单实现

package main

import (
    "log"
    "net"
    "net/http"
    "sync"
)

func main() {
    // 创建一个WaitGroup对象,用于记录并发请求的数量
    var wg sync.WaitGroup

    // 创建一个Mutex对象,用于保证并发安全
    var mu sync.Mutex

    // 定义HTTP请求处理函数
    handler := func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path == "/index" && r.Method == "GET" {
            // 加锁,确保并发安全
            mu.Lock()

            // 如果并发请求的数量已经超过限制,返回错误码
            if wg.Len() >= 500 {
                http.Error(w, "Too Many Requests", http.StatusTooManyRequests)

                // 解锁,释放锁资源
                mu.Unlock()
                return
            }

            // 增加并发请求数量
            wg.Add(1)

            // 解锁,释放锁资源
            mu.Unlock()
            defer wg.Done()
        }

        // 正常处理请求
        w.Write([]byte("Hello, world!"))
    }

    // 创建一个HTTP服务器,监听在localhost:8080地址上
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatal(err)
    }
    defer listener.Close()

    server := http.Server{
        Handler: http.HandlerFunc(handler),
    }

    // 启动HTTP服务器
    err = server.Serve(listener)
    if err != nil {
        log.Fatal(err)
    }
}

这就没啥讲的, /index get 接口的请求并发最大500个超出即返回, 每个氢气处理完成,会进行回收

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容