Cómo comenzar a escribir un microservicio en Spring Boot para que no tenga dolores de cabeza más tarde

¡Hola! Mi nombre es Zhenya, soy desarrollador de Java en Usetech, recientemente he estado trabajando mucho con la arquitectura de microservicios, y en este artículo me gustaría compartir algunos puntos a los que puede ser útil prestar atención cuando escribes un nuevo microservicio en Spring Boot.



Los desarrolladores experimentados pueden encontrar obvias estas recomendaciones, pero todas están tomadas de la práctica de trabajar en proyectos reales.



1. Dejar los controladores delgados



En una arquitectura en capas tradicional, la clase de controlador acepta solicitudes y las enruta al servicio, mientras que el servicio maneja la lógica empresarial. Sin embargo, en ocasiones en los métodos del controlador se puede encontrar algún tipo de validación de los parámetros de entrada, así como la transformación de la Entidad en DTO.



Por ejemplo:



@GetMapping
public OperationDto getOperationById(@PathVariable("id") Long id) {

    Optional<Operation> operation = operationService.getById(id);

    if (operation.isEmpty()) {
        return EMPTY_OPERATION_DTO;
    }

    OperationDto result = mapperFacade.map(operation.get(), OperationDto.class);
    return result;
}


Por un lado, el mapeo toma solo una línea y la verificación de la ausencia de un resultado parece bastante lógica. Sin embargo, en tal caso, se viola el principio de responsabilidad exclusiva del responsable del tratamiento. Si bien la validación o el mapeo es simple, un par de líneas adicionales de código en el método del controlador no son para nada llamativas, pero en el futuro la lógica tanto de la validación como del mapeo puede volverse más complicada, y entonces resultará obvio que el controlador no solo acepta y redirige solicitudes, sino que también se ocupa de lógica de negocios.



, , , "", , DTO.



:



@GetMapping
public OperationDto getOperationById(@PathVariable("id") Long id) {
    return operationService.getById(id);
}


:



public OperationDto getById(Long id) {

    Optional<Operation> operationOptional = ... //  operation

    return operationOptional
        .map(operation -> mapperFacade.map(operation, OperationDto.class))
        .orElse(EMPTY_OPERATION_DTO);
}


2. DTO



, DTO REST API, DTO Kafka. , REST Kafka, , DTO . , DTO .



, DTO, , DTO, , . DTO , .



3. WARN-,



, , , , , Spring Boot , , .



WARN, "" Spring Boot 2 Hibernate:

spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning



, - Spring Boot 2 Open Session In View, Hibernate HTTP-.



Open Session In View LazyInitializationException, , Hibernate , , -. , , , ( n+1). .



, Open Session In View , — application.yml :



spring:
  jpa:
    open-in-view: false


4.



, @SpringBootTest , , . , @SpringBootTest, , Spring . , . , , .



:



  • @Import,
  • @ActiveProfiles
  • @MockBean Mockito — , -
  • @TestPropertySource — ,
  • @DirtiesContext — ,


, .. . , :



  • @SpringBootTest
  • @ActiveProfiles("test")
  • protected ( @Autowired) - (@MockBean)


, (@AfterEach), / .



, , , , setUp .



@DirtiesContext.



, - .




All Articles