Lectores como tú ayudan a apoyar a MUO. Cuando realiza una compra utilizando enlaces en nuestro sitio, podemos ganar una comisión de afiliado.

Uno de los factores que puede considerar al crear su aplicación es la cantidad de tráfico que espera de los usuarios. La cantidad de tráfico posiblemente decida más factores que pueden incluir la asignación de recursos, especialmente si está alojando su aplicación en un proveedor de servicios en la nube.

La limitación de velocidad es una de las técnicas que puede utilizar para controlar el tráfico en su aplicación o red.

¿Qué es la limitación de velocidad?

La limitación de velocidad es una técnica de restricción de acceso generalizada para limitar el tráfico de la red, principalmente dentro de marcos de tiempo especulados o cuando el usuario ha ejecutado varias solicitudes.

La limitación de velocidad es popular para reducir los ataques cibernéticos como la fuerza bruta y DDoS (Denegación de servicio distribuida), limitando raspado web, solicitudes de API y otras interacciones irregulares del usuario, como la automatización de bots y la tensión del servidor.

instagram viewer

Go proporciona soporte de primera clase para aplicaciones de limitación de velocidad en el tasa paquete que proporciona un limitador de velocidad e interopera con el tiempo paquete.

El tasa El paquete es parte del proyecto Go, pero el paquete no está disponible en la biblioteca estándar. Deberá instalar el paquete con el conseguir dominio.

Ejecute este comando en la terminal de su directorio de trabajo para agregar el paquete a las dependencias de su proyecto.

ir obtener "golang.org/x/time/rate"

Importe estos paquetes a su archivo Go para este tutorial.

importar (
"codificación/json"
"golang.org/x/tiempo/tasa"
"registro"
"red/http"
)

El json El paquete es para codificar una estructura como JSON para el cliente. Usarás el registro paquete a registro errores en la consola y el http paquete para construir el punto final y el middleware e iniciar un servidor.

Creación de una API simple con un punto final

Convencionalmente, escribirá un middleware para las funciones del controlador que desea limitar. Cada vez que el usuario envía una solicitud, el middleware valida el estado de la solicitud antes de transmitir el acceso a la función del controlador, según el caso.

Aquí está el modelo de estructura con campos de cadena que codificará para el cliente.

tipo Mensaje estructura {
Respuesta cadena`json:"respuesta"`
Descripción cadena`json:"descripción"`
}

La función del controlador establecerá el tipo de contenido en JSON, escribirá un código de estado correcto y devolverá una instancia de estructura codificada al cliente.

funciónpunto finalEjemplo(escritor http. ResponseWriter, solicitud *http. Pedido) {
escritor. Header().Set("Tipo de contenido", "aplicación/json")
escritor. WriteHeader (http. EstadoOK)
mensaje := Mensaje{
Respuesta: "Exitoso",
Descripción: "Has alcanzado con éxito el punto final de la API",
}
error: = json. NewEncoder (escritor).Codificar(&mensaje)
si error! = nulo {
devolver
}
}

El punto finalEjemplo función de controlador toma en un http paquete escritor y pedido instancia del método y devuelve un mensaje al cliente con el escritor instancia.

Limitación de velocidad de una aplicación Simple Go

La limitación de velocidad a través del número de solicitudes de un usuario o el número de solicitudes disponibles es similar. Siempre deberá crear un limitador antes del proceso de autorización.

Así es como puede crear un limitador de velocidad y autorizar a los usuarios según la cantidad de solicitudes.

funciónrateLimiterMiddleware(próximo función(escritor http. ResponseWriter, solicitud *http. Pedido)) http.HandlerFunc {
limitador := tasa. NuevoLimitador(3, 6) // máximo de 6 solicitudes y luego tres solicitudes más por segundo
devolver http. ManejadorFunc(función(escritor http. ResponseWriter, solicitud *http. Pedido) {
si !limitador. Permitir() {
escritor. Escribir([]byte("excede el límite de velocidad "))
devolver
} demás {
endpointExample (escritor, solicitud)
}
})
}

El rateLimiterMiddleware La función de controlador es un middleware que acepta una función de controlador como argumento y devuelve el resultado de la autorización después de crear un nuevo limitador de velocidad con el Nuevo Limitador método que toma dos parámetros para el número de solicitudes por segundo después de las solicitudes máximas especificadas.

El Permitir El método de la instancia del limitador devuelve un booleano basado en el estado de las solicitudes autorizadas. El rateLimiterMiddleware devuelve el mensaje JSON si la solicitud está autorizada o el "excede el límite de velocidad " mensaje cuando el cliente ha enviado el número máximo de solicitudes.

funciónprincipal() {
http. HandleFunc("/home", rateLimiterMiddleware (punto finalEjemplo))
error := http. Escuchar y servir (":8080", nulo)
si error! = nulo {
registro. Println("Hubo un error al escuchar en el puerto:8080", error)
}
}

El principal la función monta el /home punto final a la rateLimiterMiddleware función de controlador que toma en el punto finalEjemplo función de manejador.

El escucharyservir método inicia un servidor en el puerto localhost 8080 y devuelve posibles errores.

Puede ejecutar este comando en la terminal de su directorio de trabajo o con un script bash para probar el punto final después de ejecutar el servidor.

para i en {1..10}; hacer rizo http://localhost: 8080/hogar; hecho

El código golpea el /home endpoint diez veces con una solicitud. Aquí están los resultados de las solicitudes.

Después de la sexta solicitud (máximo), el cliente no está autorizado y ya no puede acceder al punto final.

La limitación de velocidad es importante

La limitación de velocidad es esencial, especialmente si busca reducir el costo de hospedaje de su aplicación, desea reducir la interferencia de los bots o proteger su aplicación de ataques cibernéticos. Similar a Go's tasa paquete, npm proporciona el express-rate-limit paquete para aplicaciones express de límite de velocidad.