Leitores como você ajudam a apoiar o MUO. Quando você faz uma compra usando links em nosso site, podemos ganhar uma comissão de afiliado.
Um dos fatores que você pode querer considerar ao construir seu aplicativo é a quantidade de tráfego que você espera dos usuários. A quantidade de tráfego possivelmente determina mais fatores que podem incluir alocação de recursos, especialmente se você estiver hospedando seu aplicativo em um provedor de serviços em nuvem.
A limitação de taxa é uma das técnicas que você pode usar para controlar o tráfego em seu aplicativo ou rede.
O que é limitação de taxa?
A limitação de taxa é uma técnica de restrição de acesso amplamente difundida para limitar o tráfego de rede, principalmente dentro de prazos especulados ou quando o usuário executou várias solicitações.
A limitação de taxa é popular para reduzir ataques cibernéticos como força bruta e DDoS (Distributed Denial of Service), limitando Raspagem da web, solicitações de API e outras interações irregulares do usuário, como automação de bot e sobrecarga do servidor.
Go fornece suporte de primeira classe para aplicativos de limitação de taxa no avaliar pacote que fornece um limitador de taxa e interopera com o tempo pacote.
O avaliar pacote faz parte do projeto Go, mas o pacote não está disponível na biblioteca padrão. Você precisará instalar o pacote com o pegar comando.
Execute este comando no terminal do seu diretório de trabalho para adicionar o pacote às dependências do seu projeto.
ir obter "golang.org/x/time/rate"
Importe esses pacotes para seu arquivo Go para este tutorial.
importar (
"codificação/json"
"golang.org/x/time/rate"
"registro"
"rede/http"
)
O json O pacote é para codificar uma estrutura como JSON para o cliente. Você usará o registro pacote para registro erros para o console e o http pacote para construir o terminal e o middleware e iniciar um servidor.
Construindo uma API Simples com um Endpoint
Convencionalmente, você escreverá um middleware para as funções do manipulador que deseja limitar a taxa. Cada vez que o usuário envia uma solicitação, o middleware valida o status da solicitação antes de retransmitir o acesso à função do manipulador, dependendo do caso.
Aqui está o modelo struct com campos de string que você codificará para o cliente.
tipo Mensagem estrutura {
Resposta corda`json:"resposta"`
Descrição corda`json:"descrição"`
}
A função do manipulador definirá o tipo de conteúdo como JSON, escreverá um código de status bem-sucedido e retornará uma instância struct codificada para o cliente.
funçãoendpointExample(escritor http. ResponseWriter, solicite *http. Solicitar) {
escritor. Header().Set("Tipo de conteúdo", "aplicativo/json")
escritor. WriteHeader (http. StatusOK)
mensagem := Mensagem{
Resposta: "Bem-sucedido",
Descrição: "Você atingiu com sucesso o endpoint da API",
}
erro := json. NewEncoder (gravador).Encode(&mensagem)
se erro != nada {
retornar
}
}
O endpointExample função de manipulador leva em um http pacote escritor e solicitar instância do método e retorna uma mensagem para o cliente com o escritor instância.
Limitando a taxa de um aplicativo Simple Go
A limitação de taxa por meio do número de solicitações de um usuário ou do número disponível de solicitações é semelhante. Você sempre precisará criar um limitador antes do processo de autorização.
Veja como você pode criar um limitador de taxa e autorizar usuários com base no número de solicitações.
funçãorateLimiterMiddleware(próximo função(escritor http. ResponseWriter, solicite *http. Solicitar)) http.HandlerFunc {
limitador := taxa. NovoLimiter(3, 6) // máx. de 6 requisições e depois mais três requisições por segundo
retornar http. HandlerFunc(função(escritor http. ResponseWriter, solicite *http. Solicitar) {
se !limitador. Permitir() {
escritor. Escrever([]byte("limite de taxa excedido"))
retornar
} outro {
endpointExample (escritor, solicitação)
}
})
}
O rateLimiterMiddleware A função handler é um middleware que aceita uma função handler como argumento e retorna o resultado da autorização após a criação de um novo limitador de taxa com o parâmetro NewLimiter método que usa dois parâmetros para o número de solicitações por segundo após o número máximo de solicitações especificado.
O Permitir O método da instância do limitador retorna um booleano com base no status das solicitações autorizadas. O rateLimiterMiddleware retorna a mensagem JSON se a solicitação for autorizada ou o "limite de taxa excedido" mensagem quando o cliente tiver enviado o número máximo de solicitações.
funçãoprincipal() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
erro := http. OuvirEServir(":8080", nada)
se erro != nada {
registro. Println("Ocorreu um erro ao ouvir na porta:8080", erro)
}
}
O principal função monta o /home ponto final para o rateLimiterMiddleware função de manipulador que recebe o endpointExample função do manipulador.
O OuvirEServir método inicia um servidor na porta localhost 8080 e retorna possíveis erros.
Você pode executar este comando no terminal do seu diretório de trabalho ou com um script bash para testar o nó de extremidade após executar o servidor.
para eu em {1..10}; fazer ondulação http://localhost: 8080/casa; feito
O código atinge o /home endpoint dez vezes com uma solicitação. Aqui estão os resultados dos pedidos.
Após a sexta requisição (no máximo), o cliente não está autorizado e não pode mais acessar o endpoint.
Limitar a taxa é importante
A limitação de taxa é essencial, especialmente se você deseja reduzir o custo de hospedagem de seu aplicativo, deseja reduzir a interferência de bots ou proteger seu aplicativo contra ataques cibernéticos. Semelhante a Go's avaliar pacote, o npm fornece o limite de taxa expressa pacote para aplicações expressas de limite de taxa.