Spring Boot Microservices — Monorepo Heroku

Image description

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

Image description

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

Image description

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:

Image description

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.

Image description

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.

Image description

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.

Image description

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!

Image description

Repositório projeto de exemplo:

https://github.com/jjeanjacques10/twitter-microservices

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!

Referências

Simples, objetivo e assertivo. Parabéns!!!