Comment commencer à écrire un microservice dans Spring Boot pour ne pas avoir mal à la tête plus tard

salut! Je m'appelle Zhenya, je suis développeur Java chez Usetech, récemment j'ai beaucoup travaillé avec l'architecture de microservices, et dans cet article je voudrais partager quelques points qui peuvent être utiles à prêter attention lorsque vous écrivez un nouveau microservice sur Spring Boot.



Les développeurs expérimentés peuvent trouver ces recommandations évidentes, mais elles sont toutes tirées de la pratique de travailler sur de vrais projets.



1. Laisser les contrôleurs minces



Dans une architecture en couches traditionnelle, la classe de contrôleur accepte les demandes et les achemine vers le service, tandis que le service gère la logique métier. Cependant, parfois dans les méthodes du contrôleur, vous pouvez trouver une sorte de validation des paramètres d'entrée, ainsi que la transformation de l'entité en DTO.



Par exemple:



@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;
}


D'une part, le mappage ne prend qu'une ligne et le contrôle de l'absence de résultat semble assez logique. Cependant, dans un tel cas, le principe de la responsabilité exclusive du responsable du traitement est violé. Bien que la validation ou le mappage soit simple, quelques lignes de code supplémentaires dans la méthode du contrôleur ne sont pas du tout frappantes, mais à l'avenir, la logique de validation et de mappage peut devenir plus compliquée, et il deviendra alors évident que le contrôleur non seulement accepte et redirige les demandes, mais traite également les logique métier.



, , , "", , 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