Um boa opção para isso é utilizar o docker.
No meu caso eu criei repositorio para cada serviço, e um repositório global, que tem os serviços como submodulos, com isso posso iniciar todos os serviços a partir do repositorio global, com o docker de cada um ja configurado.
O repositorio criado está publico, pode ver como foi executado.
https://github.com/WellysonP/microservice-lsim
para criar os submodulos primeiro tive que criar os repositorios de cada serviço, depois adicionei ao repositorio global usando:
git submodule add {repositorio}
substituindo o "{repositorio}" pelo ssh do repositorio que queria adicionar.
por fim, depois de adicionado todos os repositorios, foi criado o arquivo Dockerfile para criação da imagem de cada serviço, no exemplo abaixo estou mostrando o do servidor Eureka.
FROM ubuntu:latest
LABEL authors="wellyson"
# Etapa 1: Usar uma imagem Gradle para construir o JAR
FROM gradle:8.3-jdk17 AS builder
WORKDIR /app
# Copiar os arquivos do projeto
COPY . .
# Rodar o build para gerar o JAR
RUN ./gradlew bootJar
# Etapa 2: Usar uma imagem mais leve para rodar o aplicativo
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
EXPOSE 8761
# Copiar o JAR da etapa de build
COPY --from=builder /app/build/libs/server-0.0.1-SNAPSHOT.jar /app.jar
# Copiar o script wait-for-it.sh para dentro do container
COPY wait-for-it.sh /app/wait-for-it.sh
# Tornar o script executável
RUN chmod +x /app/wait-for-it.sh
ENTRYPOINT ["java", "-jar", "/app.jar"]
com isso foi criado o docker-compose para cada serviço, no exemplo abaixo mostra o do servidor Eureka:
services:
server-lsim:
image: server-lsim
container_name: server-lsim
build:
context: .
ports:
- "8761:8761"
networks:
- lsim-network
environment:
- SPRING_PROFILES_ACTIVE=docker
networks:
lsim-network:
external: true
por fim, foi criado um docker-compose.yml também no repositorio global, onde ele utiliza os docker-compose de cada serviço para iniciar todos ao mesmo tempo, incluindo a instancia do mysql e uma rede para os serviços se comunicarem:
services:
mysql:
image: mysql
container_name: mysql-lsim
environment:
MYSQL_ROOT_PASSWORD: mysql
ports:
- "3306:3306"
networks:
- lsim-network
server-lsim:
extends:
file: ./server-lsim/docker-compose.yml
service: server-lsim
pagamentos-lsim:
extends:
file: ./pagamentos-lsim/docker-compose.yml
service: pagamentos-lsim
pedidos-lsim:
extends:
file: ./pedidos-lsim/docker-compose.yml
service: pedidos-lsim
gateway-lsim:
extends:
file: ./gateway-lsim/docker-compose.yml
service: gateway-lsim
networks:
lsim-network:
driver: bridge
por fim, basta abrir o terminal na pasta do repositorio global e rodar o comando:
docker compose up
Preciso mencionar o prós e contras dessa opção.
Prós: Todos os serviços rodando com apenas um unico comando no terminal (nem precisa abrir IDE)
Contra: A cada alteração no código, tem que subir novamente o container do serviço modificado.
exemplo: se modificou o serviço "pedidos-lsim", basta rodando o comando:
docker compose restart pedidos-lsim
esse problema do restart pode ser resolvido com uma compartilhamento de volumes com o container