Spring Boot Microservices — Monorepo Heroku
Tags: java, heroku, springboot, git
Published: 2022-07-08 22:47:44

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5xjai422vz8xlkjuunj9.png)

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.
 

``` bash
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](https://elements.heroku.com/buildpacks/lstoll/heroku-buildpack-monorepo) criado por [Lincoln Stoll](https://github.com/lstoll).

Primeiro clique em adicionar um buildpack novo, coloque o link do repositório: https://github.com/lstoll/heroku-buildpack-monorepo

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvplk65ukmjjby62pc2f.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ppr9ays4t90xp7rg2y1.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ikb43nddomy9i8fol8dn.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zu97gmd26l3ijuttlfy0.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7swjd4klc38wjeifu6xk.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fkx9ffhp9cyltfjsaeic.png)

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

- https://elements.heroku.com/buildpacks/lstoll/heroku-buildpack-monorepo
- https://blog.heroku.com/managing_your_microservices_on_heroku_with_netflix_s_eureka
- https://github.com/jjeanjacques10/twitter-microservices