Hallo! Mein Name ist Zhenya, ich bin ein Java-Entwickler bei Usetech. Vor kurzem habe ich viel mit Microservice-Architektur gearbeitet. In diesem Artikel möchte ich einige Punkte erläutern, die nützlich sein können, wenn Sie einen neuen Microservice auf Spring Boot schreiben.
Erfahrene Entwickler mögen diese Empfehlungen offensichtlich finden, aber sie stammen alle aus der Praxis, an realen Projekten zu arbeiten.
1. Lassen Sie die Controller dünn
In einer herkömmlichen Schichtarchitektur akzeptiert die Controller-Klasse Anforderungen und leitet sie an den Dienst weiter, während der Dienst die Geschäftslogik verwaltet. Manchmal finden Sie jedoch in den Methoden des Controllers eine Art Validierung der Eingabeparameter sowie die Umwandlung der Entität in DTO.
Zum Beispiel:
@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;
}
Einerseits nimmt die Zuordnung nur eine Zeile ein, und die Überprüfung auf das Fehlen eines Ergebnisses erscheint ziemlich logisch. In einem solchen Fall wird jedoch der Grundsatz der alleinigen Verantwortung des für die Verarbeitung Verantwortlichen verletzt. Während die Validierung oder Zuordnung einfach ist, fallen einige zusätzliche Codezeilen in der Controller-Methode überhaupt nicht auf, aber in Zukunft wird die Logik sowohl der Validierung als auch der Zuordnung möglicherweise komplizierter, und dann wird klar, dass der Controller Anforderungen nicht nur akzeptiert und umleitet, sondern auch bearbeitet Geschäftslogik.
, , , "", , 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 -
@MockBeanMockito — , - -
@TestPropertySource— , -
@DirtiesContext— ,
, .. . , :
-
@SpringBootTest -
@ActiveProfiles("test") -
protected(@Autowired) - (@MockBean)
, (@AfterEach), / .
, , , , setUp .
@DirtiesContext.
, - .