Escrevendo plugins para o Kong em Go
O Kong, segundo a própia documentação, é um apigateway open source, criado para a nuvem, agnóstico em plataforma, feito para alta performance e extensível via plugins. O Kong possui uma grande gama de plugins oficiais que nos permitem fazer grande parte das customizações que necessitamos e quando o plugin não está disponível, podemos criar nosso própio plugin.
A linguagem padrão para se criar plugins é Lua, contudo outras linguagens são suportadas e uma delas é Go. Pessoalmente, não tenho experiência em escrever códigos em Lua, portanto, utilizar Go me permite uma maior velocidade de desenvolvimento e maior qualidade no plugin.
Desenvolvimento
Criar um plugin usando Go é bem simples, é necessário seguir a assinatura proposta pelo plugin development kit, ou PDK, do Kong, mas ela é de fácil entendimento. Para demonstrar isso, vamos criar um plugin que vai ler um header da requisição e a configuração do plugin. Com essas duas informações, vamos adicionar um novo header na resposta.
A primeira coisa a ser feita é definir as constantes version e priority. Como o própio nome diz, isso define a versão do plugin que está sendo desenvolvido e a prioridade em execução a relação a outros plugins. Vale a pena pontuar que quanto maior o valor da prioridade, mais cedo o plugin vai ser executado. Para ver mais sobre a prioridades dos plugins, este post explica bem.
| |
Com isso realizado, vamos definir quais os parametros que o plugin aceita, criando uma struct chamada Config. No nosso exemplo, aceitamos o campo message, que é uma string.
| |
Os plugins do Kong funcionam baseados em quais fases do ciclo de vida da requisição eles devem ser executados. As fases possíveis são:
- Certificate
- Rewrite
- Access
- Response
- Preread
- Log
No nosso exemplo, vamos utilizar o Access, pois vamos atualizar a resposta antes de encaminharmos a requisição para o serviço responsável. Contudo, a assinatura de todas as fases são iguais. Para entender mais sobre as fases, recomendo ler essa documentação.
| |
Essa função utiliza o PDK para ler os headers disponíveis, através de kong.Request.GetHeader e depois adiciona um header na resposta utilizando o kong.Response.SetHeader. Para mais informações dos funções dísponíveis, dê uma olhada na documentação da Go PDK.
Por fim, vamos a função principal:
| |
Como podemos notar, a funcão principal só inicializa o servidor do Kong, passando a Config, Version e Priority definidas anteriormente. A implementação completa fica assim:
| |
Testes
Testar os plugins em Go também é bem simples, uma vez que o própio PDK nos oferece ferramentas que nos permitem fazer isso de forma direta. Então vamos testar nosso plugin:
| |
Deploy
Para o deploy, precisamos gerar um executável e colocar isso na imagem que vamos utilizar do Kong.
| |
Para o Kong conseguir encontrar e carregar o plugin customizado é necessário especificar algumas configurações. Seguindo nosso exemplo, alterei o docker-compose para incluir:
| |
Considerações sobre performance
A própia Kong fez um estudo sobre a performance, que pode ser encontrado aqui.
Conclusão
Go é uma ótima ferramenta para se escrever plugins para o Kong. Podemos contar com toda a facilidade e performance da linguagem, além de todas as ferramentas que a linguagem oferece. No meu caso, consegui ganhar velocidade na entrega e uma maior cobertura de testes. Também é possível isolar a lógica dos plugins com a utilização da PDK, facilitando assim escrever plugins que funcionam pra diversas tecnologia, desacoplando do Kong.
Para ver todo o contéudo apresentado nesse post, é só acessar o repositório.
Você também pode me encontrar no Twitter, Github ou LinkedIn.
