a. Visão geral
Objetivo principal
O objetivo principal desta seção é implementar um microsserviço CRUD (Create, Read, Update, Delete) simples, para fins de ilustração.
O microsserviço Account é responsável por gerenciar as contas de usuário — praticamente toda aplicação tem um sistema de contas de usuário. Esse microsserviço fornece os endpoints para criar, ler (listar todas ou buscar uma pelo id) e excluir contas; um endpoint de atualização não faz parte dele. Ele é construído com Spring Boot e segue a abordagem Domain-Driven Design (DDD).
Slides
Clique nos slides e use ← → para navegar; F abre em tela cheia e P abre a visão do apresentador, com as notas. Abrir os slides em uma nova aba
O microsserviço é dividido em dois módulos principais: account e account-service:
- o módulo
accountcontém a definição da API e os objetos de transferência de dados (DTOs) do microsserviço Account; - o módulo
account-servicecontém a implementação do serviço, o repositório e as classes de entidade.
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 Vantagens do Java
Essa abordagem permite a separação de responsabilidades e a organização do código em módulos diferentes, o que facilita a manutenção e a escalabilidade da aplicação. Além disso, facilita a reutilização do microsserviço por outros microsserviços no futuro — desde que construídos em Java.
A construção do microsserviço Account segue a abordagem da Clean Architecture (arquitetura limpa), que promove o desacoplamento total das regras de negócio em relação às camadas de interface. O diagrama abaixo ilustra o fluxo de dados entre as camadas do microsserviço Account:
sequenceDiagram
title Abordagem da arquitetura limpa
Actor Request
participant Controller@{ "type": "boundary", "alias": "Controller<br>Resource" }
participant Service@{ "type": "control" }
participant Repository@{ "type" : "entity" }
participant Database@{ "type" : "database" }
Request ->>+ Controller: Rest API (JSON)
Controller ->>+ Service: parser (AccountIn -> Account)
Service ->>+ Repository: parser (Account -> AccountModel)
Repository ->>+ Database:
Database ->>- Repository:
Repository ->>- Service: parser (Account <- AccountModel)
Service ->>- Controller: parser (AccountOut <- Account)
Controller ->>- Request: Rest API (JSON) Para desenvolver o microsserviço Account, os passos são os seguintes:
-
Crie a interface do microsserviço Account no módulo
account, definindo os endpoints da API e os objetos de transferência de dados (DTOs); -
Implemente a camada de serviço no módulo
account-service, criando as classes necessárias para tratar a lógica de negócio e a persistência dos dados; -
Crie o Dockerfile do microsserviço Account e gere a imagem Docker do microsserviço;
-
Implemente a camada de persistência do módulo
account-service, criando as classes necessárias para tratar a persistência dos dados;