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.

instagram viewer

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.