Utilizando Flask, API REST e IAM com o InterSystems IRIS
Parte 3 – IAM
O InterSystems API Manager (IAM) é um componente que permite monitorar, controlar e gerir o tráfego de APIs baseadas em HTTP. Ele também atua como uma API gateway entre aplicações e servidores InterSystems IRIS.
O documento publicado em https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=PAGE_apimgr traz as informações sobre o produto.
Já o documento https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=CIAM3.0_install traz todas as informações para a instalação e configuração do IAM.
Após instalar o IAM vamos ativar o mesmo e configurar um serviço, rota e plugin para criar um Rate Limiting para a nossa API REST.
Primeiro, após instalar o IAM vamos ativa-lo conforme definido na documentação:
Uma vez ativado o IAM vamos abrir a interface de administração para criar o serviço, rota e plugin necessários. Para isso no navegador acessamos o servidor na porta 8002:
Nesta tela vemos as opções de manutenção de serviço, rota e plugins, que são as tarefas que vamos realizar. Primeiro vamos criar o serviço para atender a nossa API REST. Clique no menu lateral em Services e na sequencia em New Service:
Informe o nome (cliente-service) e na opção Add using URL informe em URL o caminho da API (http://192.168.0.13/iris/rest/servico/cliente nonosso exemplo). Clique em Create e o serviço estará criado:
Agora vamos criar a rota. No menu lateral clique em Routes e a seguir em New Route.
Selecione o serviço que criamos, informe um nome para a rota (cliente-route por exemplo), informe os protocolos que poderão ser usados (http e https), informe o host (192.168.0.13) e os métodos (GET,PUT,POST,DELETE). Clique no link Add Path e informe o path para esta rota (/api/cliente). Clique em Create e a rota estará criada:
Agora vamos criar o plugin de rate Limiting. Este plugin limita o número de solicitações que um usuário pode fazer em um determinado período de tempo. Para isso volte ao menu lateral e clique em Plugins e na sequencia em New Plugin. Na caixa de pesquisa digite Rate e veja os plugins listados:
Selecione o plugin Rate Limiting Advanced. Será a presentada a tela de configuração do plugin:
Na tela de configuração mude a opção para Scoped. Selecione o serviço que criamos. Informe a quantidade de acessos em Config.Limit (5 por exemplo) e o tempo de intervalo em Config.Window.Size (60 por exemplo). Mude Config.Strategy para local e clique em Create. Pronto. Nosso plugin está criado e já está trabalhando:
Agora vamos precisar fazer uma alteração no nosso código python para consumir a nossa API através do IAM. Para isso vamos mudar o endereço da URL da API para o endereço que criamos na Rota do IAM:
API_URL = “http://192.168.0.13/iris/rest/servico/cliente” - Código Original
API_URL = “http://192.168.0.13:8000/api/cliente“ - Nova URL passando pelo IAM
Reative o servidor do Flask e volte a página da aplicação. Desta vez dê uma sequencia de refresh (F5) de forma a chamar a API diversas vezes. Veja que na 6ª chamada da API temos uma falha:
A nossa aplicação não está preparada para tratar a falha no HTTP status. Vamos fazer alguns ajustes. Primeiro vamos criar na pasta templates uma página de erro chamada erro.html:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Erro</title>
</head>
<body>
<h1>Ocorreu um erro!</h1>
<p>Código de erro: {{ status_code }}</p>
<p>Mensagem de erro: {{ error_message }}</p>
</body>
</html>
Vamos voltar ao código em python e fazer um ajuste para capturar o erro. No trecho que chamaos a montagem da página de index vamos tratar um HTTP code diferente de 200:
Onde temos o seguinte código no rota “/”:
data = response.json()
lista = data["clientes"]
return render_template("index.html", registros=lista)
Mudamos para:
if response.status_code == 200:
data = response.json()
lista = data["clientes"]
return render_template("index.html", registros=lista)
else:
return render_template('erro.html', status_code=response.status_code, error_message=response.json().get('message', 'Erro desconhecido'))
Vamos reiniciar a aplicação Flask e mais uma vez vamos chamar a API diversas vezes. Desta vez vamos receber uma tela de erro tratado:
Podemos então ver que o IAM já está trabalhando, recebendo as requisições e aplicando os plugins configurados. De acordo com nossa configuração o IAM restringiu o acesso a API devolvendo um HTTP status 429 conforme configurado no plugin.
Voltando a tela de administração no IAM podemos ver já algumas informações sobre o consumo do serviço:
Podemos ver a quantidade de requisições que foram feitas ao serviço por HTTP Status por exemplo. Podemos também mudar a forma de visualização do gráfico:
O IAM é uma ferramenta poderosa que agrega diversas vantagens ao Iris e permite uma série de ações com seus plugins. O IAM pode ser um aliado poderoso para a publicação de serviços.
Até a próxima!