Spring Boot Microservices — Monorepo Heroku
Como hospedar Microservices desenvolvidos com Spring Boot no Heroku utilizando a estratégia de Monorepo
Diversas empresas utilizam Monorepo, que consiste na estratégia de adicionar diversos projetos em apenas um repositório, gerando assim uma única base de código. Essa abordagem facilita no reaproveitamento de código e também na padronização entre projetos. Contudo, este tipo de abordagem trás consigo alguns desafios quando queremos utilizar um sistema de Continuous Deploy (CD) como o Heroku.
Neste artigo vou apresentar o caminho que utilizei para realizar o deploy de diversos microservices desenvolvidos com Spring Boot que se encontram em apenas um repositório no GitHub.
Para isso vamos precisar alterar os arquivos de configuração de nossos projetos e também configurar o processo dentro da plataforma de hospedagem, no caso o Heroku, então vamos por a mão na massa!
Configurando o repositório
Precisaremos adicionar 2 arquivos na raiz de cada projeto, no caso, como vamos trabalhar com Java o primeiro arquivo deverá ser o “system.properties”, nele informamos qual a versão que desejamos trabalhar, neste caso estou utilizando o Java 17.
java.runtime.version=17
Agora iremos criar o arquivo “Procfile”, que devemos prestar muita atenção na hora de escrever. Nele adicionamos o comando que irá ser executado quando o Heroku for realizar o deploy.
web: java $JAVA_OPTS -cp target/classes:target/dependency/* -Dserver.port=$PORT -jar target/user-service-0.0.1-SNAPSHOT.jar
Neste caso estou dizendo para ele executar o arquivo jar (user-service-0.0.1-SNAPSHOT.jar), para cada projeto você deve informar o arquivo de saída esperado. Como parâmetro neste comando passamos a porta que a aplicação deverá rodar “-Dserver.port=$PORT”, o valor da variável de ambiente $PORT será fornecido pelo Heroku. É possível adicionar mais parâmetros de acordo com a necessidade do seu projeto, então fique atento e realize alguns testes locais tentando rodar o comando em sua máquina antes de subir para o repositório e testa-lo na esteira.
Configurando o Heroku
Acessando o site do Heroku: https://dashboard.heroku.com/ devemos clicar em “new” para criar um novo App, selecione um nome único para o aplicativo, ele será o Host de sua aplicação. Após ter criado o App vá até a opção de “settings” (configurações) e localize a sessão de “Buildpacks”, nele que adicionaremos a opção de trabalhar com monorepos utilizando o pacote heroku-buildpack-monorepo criado por Lincoln Stoll.
Primeiro clique em adicionar um buildpack novo, coloque o link do repositório: https://github.com/lstoll/heroku-buildpack-monorepo
Não se esqueça de adicionar o buildpack para o Java também, como no exemplo acima. Os dois devem estar selecionados para que possamos prosseguir:
Para especificar em qual pasta estará o projeto correspondente ao App devemos alterar as variáveis de ambiente adicionando o:
APP_BASE=/nome-pasta-projeto
Neste exemplo passamos /user-service para o meu serviço que controla os usuários do Twitter.
Não se esqueça de adicionar as demais variáveis de ambiente que o seu microservice precisa para ser executado. Ambiente configurado, vamos conectar o nosso repositório GitHub. Na aba de “Deploy” selecione o método GitHub e escolha a conta desejada, pode ser a sua pessoal ou da organização que trabalha.
Após realizar liberação temos a opção de escolher o projeto que queremos trabalhar, pesquise pelo nome dele e conecte. A seguir escolha a branch que deseja utilizar, no meu caso selecionei a main, também deixei ativa a opção para realizar o deploy quando algum novo commit for feito.
Pronto! Agora com tudo configurado basta testar seus Apps. Segue o exemplo dos diversos serviços rodando na aplicação do Twitter que usei como base!
Repositório projeto de exemplo:
Conclusão
Seguindo este passo a passo é possível de forma fácil e rápida disponibilizar diversos serviços na plataforma do Heroku sem criar um repositório para cada um deles. O exemplo que dei foi utilizando Spring Boot, mas é possível fazer esta mesma configuração em projetos NodeJS, Python ou demais linguagens.
Caso tenha alguma crítica, sugestão ou dúvida fique a vontade para me enviar uma mensagem:
Linkedin: https://www.linkedin.com/in/jjean-jacques10/
Até a próxima!