Feature Flags usando Kotlin + Spring Boot
English version here.
Não faz muito tempo que escrevi um artigo sobre entrega contínua, explicando um pouco do conceito e também da importância das Feature Flags como parte do processo.
Logo depois escrevi um tutorial sobre a implementação de Feature Flags com Ruby on Rails e agora chegou a vez de escrever sobre a implementação em Kotlin + Spring 😃
A minha motivação de escrever o tutorial foi por falta de encontrar em algum lugar da internet alguma implementação que fosse bem direta com o uso de Java/Kotlin, Spring Boot 2.x e o uso de um Console Web. E já devo adiantar que a implementação com Java não foge muito do que está aqui.
Procurando por uma ferramenta open-source, uma das mais populares é a FF4J e eu confesso que não encontrei nenhuma outra que cumprisse todos os requisitos que eu tinha. O Togglz era a minha primeira opção mas infelizmente eles não tem suporte para Kotlin ☹️
Vamos começar.
A aplicação de base contém as seguintes dependências:
- Kotlin v1.3.50
- Spring Boot v2.2.1.RELEASE
- Spring Security
- JDBC
Ao final desse tutorial teremos:
- Feature Flags (claro)
- Armazenamento em banco
- Console web para gerenciamento das features
- Autenticação básica para o console web
1. Dependências
A lib é dividida em módulos, então precisamos incluir o core, a lib web e o store-springjdbc.
Precisamos do thymeleaf para renderizar a página web (uma pena que não venha direto do componente ff4j-web).
2. Configurações da lib
O método getFF4j
serve como um interceptador da lib, e usamos para configurar a conexão com o banco.
o DataSource que é injetado na classe de configuração está montando a conexão do banco esperando que as credenciais da base de dados estejam presentes no seu arquivo de configuração, como a seguir:
É necessário também criar as tabelas no banco. Usando a ferramenta de migração de sua preferência, crie o script descrito na documentação, ou faça manualmente.
3. Configurações do Servlet
Precisamos configurar o Servlet que vai servir o nosso Console Web, e a configuração é bem simples:
4. Configurações de Segurança
Até aqui tudo deveria estar funcionando, mas como essa API está aberta para o mundo externo, eu quero ter a segurança de que somente pessoas autorizadas irão acessar esse console e habilitar features em produção.
Para isso, vou usar o HTTP basic auth do próprio Spring Security. Eu já estou usando Spring Security para proteger as outras rotas da minha aplicação, então o que quero é somente extender as configurações e adicionar o basic auth somente para a rota do FF4J.
Note que eu anotei essa classe com @Order(1)
porque como há outra classe de configuração, eu estou dizendo que essa tenha precedência sobre o outro arquivo (caso contrário a lógica de autenticação da minha aplicação também seria aplicada para a minha rota).
Eu também estou usando variáveis injetadas para definir o nome de usuário e senha. Garanta que se você for rodar esse código em produção, seja possível injetar esses valores através de uma variável de ambiente para que estejam seguros.
Eu criei uma classe para representar os parâmetros do meu arquivo de configuração e ficou assim:
Se você iniciar sua aplicação e navegar até http://localhost:port/ff4j-web-console
você deve ver um pop-up pedindo para inserir o usuário e senha definidos, e logo depois irá ver o dashboard do FF4J! 🍾 🙌 🎉
5. Usando no código
Eu não sou muito fã do idioma nativo da lib, que para verificar se uma lib está ativada, chamamos o método check
do ff4j. Por isso eu estendi a classe criando dois métodos, e são eles que eu uso no meu código. Ficando assim:
Para mais detalhes sobre as funcionalidades, vale a pena dar uma olhada na documentação no site porque tem bastante coisa lá, e dar uma olhada também nos samples que tem vários casos de uso. Nem sempre atualizados mas são bem úteis.
Tem interesse em trabalhar conosco? Nós estamos sempre procurando por pessoas apaixonadas por tecnologia para fazer parte da nossa tripulação! Você pode conferir nossas vagas aqui.