Pular para conteúdo

c. Service

A implementação do microsserviço Account é definida no módulo account-service, que contém a implementação da API definida no módulo account, bem como o acesso ao banco de dados e a lógica de negócio do microsserviço Account.

classDiagram
    namespace account {
        class AccountController {
            +create(AccountIn in): Void
            +findAll(): List<AccountOut>
            +delete(String id): Void
            +healthCheck(): Void
            +findById(String id): AccountOut
        }
        class AccountIn {
            -String name
            -String email
            -String password
        }
        class AccountOut {
            -String id
            -String name
            -String email
        }
    }
    namespace account-service {
        class AccountResource {
            +create(AccountIn in): Void
            +findAll(): List<AccountOut>
            +delete(String id): Void
            +healthCheck(): Void
            +findById(String id): AccountOut
        }
        class AccountService {
            +create(Account account): Account
            +findById(String id): Account
            +delete(String id): void
            +findAll(): List<Account>
        }
        class AccountRepository {
            +save(AccountModel model): AccountModel
            +findById(String id): Optional<AccountModel>
            +deleteById(String id): void
            +findAll(): List<AccountModel>
        }
        class Account {
            -String id
            -String name
            -String email
            -String password
            -String hashPassword
        }
        class AccountModel {
            -String id
            -String name
            -String email
            -String hashPassword
            +to(): Account
        }
    }
    <<Interface>> AccountController
    AccountController ..> AccountIn
    AccountController ..> AccountOut

    <<Interface>> AccountRepository
    AccountController <|-- AccountResource
    AccountResource *-- AccountService
    AccountService *-- AccountRepository
    AccountService ..> Account
    AccountService ..> AccountModel
    AccountRepository ..> AccountModel

1. Repositório

Crie o repositório da implementação Account no GitHub e clone-o como um submódulo na sua máquina local;

git submodule add <repository_url> api/account-service
📁 api/
├── 📁 account/
└── 📁 account-service/

2. Código

Agora vamos codificar a implementação do microsserviço Account, que é composta por várias classes. A estrutura de diretórios resultante ficará assim:

📁 api/
└── 📁 account-service/
    ├── 📁 src/
    │   └── 📁 main/
    │       ├── 📁 java/
    │       │   └── 📁 store/
    │       │       └── 📁 account/
    │       │           ├──  AccountServiceApplication.java
    │       │           └──  AccountResource.java
    │       └── 📁 resources/
    │           └── YAML application.yaml
    └──  pom.xml
Classe Descrição
AccountResource Esta classe é responsável pelos endpoints da API do microsserviço Account: ela implementa a interface AccountController definida no módulo account e usa o AccountService para tratar a lógica de negócio dos endpoints.
AccountServiceApplication Esta é a classe principal do microsserviço Account, responsável por executar a aplicação Spring Boot. Ela contém o método main, que é o ponto de entrada da aplicação.

Para codificar esse microsserviço, vamos usar o framework Spring Boot, por meio do Spring Initializr, em [https://start.spring.io/], uma ferramenta web que permite gerar um projeto Spring Boot com as dependências e configurações necessárias.

Spring Initializr
Spring Initializr

Observe:

  • Project: Maven
  • Language: Java
  • Spring Boot: 4.1.1 (versão estável no momento)
  • Group: store (o nome da empresa, por exemplo)
  • Artifact: account-service (o nome da implementação)
  • Package name: store.account
  • Packaging: Jar
  • Configuration: YAML
  • Java: 25 (versão LTS no momento)

Além disso, precisamos adicionar as seguintes dependências:

  • Spring Web: uma dependência que permite criar serviços web RESTful com o framework Spring. Ela fornece as ferramentas e bibliotecas necessárias para tratar requisições e respostas HTTP, bem como para definir endpoints e controllers da API.

  • Lombok: uma biblioteca Java que ajuda a reduzir código repetitivo (boilerplate), gerando getters, setters, construtores e outros métodos comuns em tempo de compilação por meio de anotações.

  • OpenFeign: um cliente declarativo de serviços web que simplifica o envio de requisições HTTP para outros microsserviços. Ele permite definir interfaces para os nossos clientes de API e gera automaticamente a implementação em tempo de execução.

Por enquanto, vamos criar apenas as classes AccountResource e AccountServiceApplication e o arquivo de configuração application.yaml. Implementaremos a lógica de negócio e a persistência dos dados nas próximas seções.

Em AccountResource.java, o único endpoint implementado por enquanto é o health-check, um endpoint simples que retorna o código de status 200 OK, indicando que o microsserviço está no ar e funcionando.

O pom.xml também declara o módulo account (em destaque) como dependência: é assim que o AccountResource enxerga AccountController, AccountIn e AccountOut. O AccountResource é anotado com @Controller; como todo método devolve um ResponseEntity, o Spring escreve o corpo em JSON sem @ResponseBody (o @RestController também funcionaria).

Código-fonte

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.1.1</version>
    </parent>
    <groupId>store</groupId>
    <artifactId>account-service</artifactId>
    <version>1.0.0</version>

    <properties>
        <java.version>25</java.version>
        <spring-cloud.version>2025.1.3</spring-cloud.version>
        <maven.compiler.proc>full</maven.compiler.proc>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>store</groupId>
            <artifactId>account</artifactId>
            <version>1.0.0</version>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <annotationProcessorPaths>
                                <path>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </path>
                            </annotationProcessorPaths>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-testCompile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <annotationProcessorPaths>
                                <path>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </path>
                            </annotationProcessorPaths>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
1
2
3
spring:
  application:
    name: account
package store.account;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AccountServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(AccountServiceApplication.class, args);
    }

}
package store.account;

import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;

@Controller
public class AccountResource implements AccountController {

    @Override
    public ResponseEntity<Void> create(AccountIn in) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ResponseEntity<List<AccountOut>> findAll() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ResponseEntity<Void> delete(String id) {
        // TODO Auto-generated method stub
        return ResponseEntity.noContent().build();
    }

    @Override
    public ResponseEntity<Void> healthCheck() {
        return ResponseEntity
            .ok()
            .build();
    }

    @Override
    public ResponseEntity<AccountOut> findById(String id) {
        // just an example
        AccountOut out = AccountOut.builder()
            .name("John")
            .email("JAlbert@xpto.gov")
            .id("1345")
            .build();
        return ResponseEntity.ok(
            out
        );
    }

}

3. Empacotar e executar

mvn clean package
java -jar target/account-service-1.0.0.jar

ou

mvn clean package spring-boot:run

Verifique a saúde do microsserviço enviando uma requisição GET para o endpoint health-check:

curl -X GET http://localhost:8080/accounts/health-check

Se tudo estiver funcionando corretamente, você deve receber o código de status 200 OK na resposta, indicando que o microsserviço está no ar e funcionando.


Pronto! O microsserviço Account agora está pronto para ser usado no projeto.

Vamos para a próxima seção, na qual vamos containerizar o microsserviço Account com Docker e executá-lo com Docker Compose.

Containerização