Gin: ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… запросов?

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 21 июн. 2017  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: gin-gonic/gin

НапримСр, я Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽ Π΄ΠΎ 2000 Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡŽ лишниС запросы.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пытаСтся Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° создаСтся Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС.

(это просто Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ синтаксис)


func LimitMiddleware() gin.HandlerFunc {
     // create a buffered channel with 2000 spaces
     semaphore := make(chan bool, 2000) 


    return func (c *gin.Context) {        
        select {
            case semaphore  <- true: // Try putting a new val into our semaphore
                // Ok, managed to get a space in queue. execute the handler
                c.Next()

                // Don't forget to release a handle
                <-semaphore 
            default:
                 // Buffer full, so drop the connection. Return whatever status you want here
                 return
        }
    }
}


ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пытаСтся Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° создаСтся Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС.

(это просто Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ синтаксис)


func LimitMiddleware() gin.HandlerFunc {
     // create a buffered channel with 2000 spaces
     semaphore := make(chan bool, 2000) 


    return func (c *gin.Context) {        
        select {
            case semaphore  <- true: // Try putting a new val into our semaphore
                // Ok, managed to get a space in queue. execute the handler
                c.Next()

                // Don't forget to release a handle
                <-semaphore 
            default:
                 // Buffer full, so drop the connection. Return whatever status you want here
                 return
        }
    }
}


@wangcn Π― написал ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для ограничСния gin, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… запросов, ΠΈ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΈΠΌΠΈΡ‚ запросов ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΠ°Π½ΠΈΠΊΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

package main

import (
    "github.com/easonlin404/limit"
    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()
    r.Use(limit.Limit(200)) // limit the number of current requests

    r.GET("/", func(c *gin.Context) {
        // your code
    })

    r.Run()
}

Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sync/atomic Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚Π΅.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ