Els microserveis són una arquitectura de programari que estructura una aplicació com un conjunt de serveis petits i independents, cadascun executant en el seu propi procés i comunicant-se entre ells mitjançant mecanismes lleugers, sovint una API HTTP. Aquesta arquitectura permet una major escalabilitat, flexibilitat i mantenibilitat. En aquest mòdul, explorarem diversos patrons de disseny específics per a microserveis que ajuden a abordar els reptes comuns en aquest tipus d'arquitectura.

Objectius del Mòdul

  • Comprendre els patrons de disseny específics per a microserveis.
  • Aprendre a aplicar aquests patrons per resoldre problemes comuns en arquitectures de microserveis.
  • Veure exemples pràctics de cada patró.

Contingut

Patró API Gateway

Descripció

L'API Gateway és un patró de disseny que actua com un únic punt d'entrada per a totes les peticions dels clients. Aquest patró és especialment útil en arquitectures de microserveis per gestionar la complexitat de la comunicació entre els clients i els serveis.

Avantatges

  • Simplifica la comunicació entre clients i serveis.
  • Pot gestionar autenticació, autorització, i altres polítiques de seguretat.
  • Permet la transformació de protocols i dades.

Exemple

@RestController
public class ApiGatewayController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/user/{id}")
    public ResponseEntity<String> getUser(@PathVariable String id) {
        String userServiceUrl = "http://user-service/users/" + id;
        String response = restTemplate.getForObject(userServiceUrl, String.class);
        return ResponseEntity.ok(response);
    }
}

Exercici

Implementa un API Gateway que redirigeixi les peticions a dos serveis diferents: un servei d'usuaris i un servei de productes.

Patró Circuit Breaker

Descripció

El patró Circuit Breaker s'utilitza per evitar que una aplicació intenti realitzar operacions que probablement fallaran. Això és especialment útil per gestionar la resiliència en arquitectures de microserveis.

Avantatges

  • Millora la resiliència de l'aplicació.
  • Evita sobrecàrregues en serveis fallits.
  • Proporciona una resposta ràpida en cas de fallada.

Exemple

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String callRemoteService() {
    // Codi per cridar un servei remot
}

public String fallbackMethod() {
    return "Fallback response";
}

Exercici

Implementa el patró Circuit Breaker en una aplicació de microserveis utilitzant Hystrix o Resilience4j.

Patró Service Discovery

Descripció

El patró Service Discovery permet que els serveis trobin altres serveis dins de l'arquitectura de microserveis. Això és essencial per a la comunicació dinàmica entre serveis.

Avantatges

  • Facilita la comunicació dinàmica entre serveis.
  • Permet l'escalabilitat automàtica dels serveis.
  • Simplifica la configuració de serveis.

Exemple

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

Exercici

Configura un servei de descobriment utilitzant Netflix Eureka i registra diversos serveis.

Patró Saga

Descripció

El patró Saga és un patró de gestió de transaccions distribuïdes que permet coordinar una sèrie de transaccions locals en diferents serveis.

Avantatges

  • Permet la consistència eventual en transaccions distribuïdes.
  • Millora la resiliència i la recuperació de fallades.
  • Facilita la coordinació de transaccions complexes.

Exemple

public class OrderService {

    @Autowired
    private PaymentService paymentService;

    @Transactional
    public void createOrder(Order order) {
        // Codi per crear una comanda
        paymentService.processPayment(order.getPayment());
    }
}

Exercici

Implementa una saga per gestionar una transacció distribuïda que inclogui la creació d'una comanda i el processament del pagament.

Patró Event Sourcing

Descripció

El patró Event Sourcing emmagatzema l'estat d'un sistema com una seqüència d'esdeveniments. Cada canvi d'estat es representa com un esdeveniment que es guarda en un log d'esdeveniments.

Avantatges

  • Permet la reconstrucció de l'estat del sistema en qualsevol moment.
  • Facilita l'auditoria i el seguiment de canvis.
  • Millora la consistència i la integritat de les dades.

Exemple

public class EventStore {

    private List<Event> events = new ArrayList<>();

    public void saveEvent(Event event) {
        events.add(event);
    }

    public List<Event> getEvents() {
        return events;
    }
}

Exercici

Implementa un sistema de gestió d'inventari utilitzant el patró Event Sourcing.

Patró CQRS (Command Query Responsibility Segregation)

Descripció

El patró CQRS separa les operacions de lectura i escriptura en diferents models. Això permet optimitzar cada model per a les seves operacions específiques.

Avantatges

  • Millora el rendiment i l'escalabilitat.
  • Simplifica la gestió de dades complexes.
  • Permet la consistència eventual en operacions de lectura.

Exemple

public class ProductCommandService {

    public void createProduct(Product product) {
        // Codi per crear un producte
    }
}

public class ProductQueryService {

    public Product getProductById(String id) {
        // Codi per obtenir un producte per ID
    }
}

Exercici

Implementa una aplicació de gestió de productes utilitzant el patró CQRS.

Resum del Mòdul

En aquest mòdul, hem explorat diversos patrons de disseny específics per a microserveis, incloent-hi l'API Gateway, Circuit Breaker, Service Discovery, Saga, Event Sourcing i CQRS. Aquests patrons ajuden a abordar els reptes comuns en arquitectures de microserveis, millorant la resiliència, escalabilitat i mantenibilitat de les aplicacions. Hem vist exemples pràctics de cada patró i hem proporcionat exercicis per reforçar els conceptes apresos.

© Copyright 2024. Tots els drets reservats