ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ Ρ ΠΎΡΡ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΠΎΠΏΡΡΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ΅Π±Π½ΠΎΠΉ ΡΡΠ΅Π΄Ρ Π΄Π»Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ. ΠΡΠΈ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΠΌΠ½Π΅ Π²ΡΠ΅Π³Π΄Π° Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π΅Π³ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅, Π½ΠΎ ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ . ΠΠΎΡΡΠΎΠΌΡ Ρ ΡΠ΅ΡΠΈΠ» ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ "ΠΎΠ±Π²Π΅ΡΠΈΠ²Π°ΡΡ" Π²ΡΡΠΊΠΈΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠΌΠΈ. ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ β Π΅Π³ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎΡΡΡ ΠΊ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ ΡΠ°Π·Π±ΠΈΠ» ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π³ΠΎΠ²:
-
Π‘ΠΎΠ·Π΄Π°ΡΡ Π΄Π²Π° ΡΠ΅ΡΠ²ΠΈΡΠ° β ‘Π±Π΅ΠΊΠ΅Π½Π΄’ (backend) ΠΈ ‘ΡΠ»ΡΠ·’ (gateway), ΡΠΏΠ°ΠΊΠΎΠ²Π°ΡΡ ΠΈΡ Π² docker-ΠΎΠ±ΡΠ°Π·Ρ ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΈΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°: Java 11, Spring Boot, Docker, image optimization
-
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°: Kubernetes, GKE, resource management, autoscaling, secrets
-
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Helm 3 Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°: Helm 3, chart deployment
-
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Jenkins ΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΊΠΎΠ΄Π° Π² ΠΊΠ»Π°ΡΡΠ΅Ρ
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°: Jenkins configuration, plugins, separate configs repository
ΠΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ°Π³Ρ Ρ ΠΏΠ»Π°Π½ΠΈΡΡΡ ΠΏΠΎΡΠ²ΡΡΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ°ΡΡΡ.
ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΡΡΠ°ΡΠ΅ΠΉ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π΅ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΡ, Π° ΠΊΠ°ΠΊ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. Π₯ΠΎΡΡ Π²ΡΠ΅ ΡΡΠΈ Π²Π΅ΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π»Π΅ΠΆΠ°Ρ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π±ΡΡΡ Π·Π½Π°ΠΊΠΎΠΌΡΠΌ Ρ Π½ΠΈΠΌΠΈ Ρ ΠΎΡΡ Π±Ρ Π½Π° 20% (ΠΊΠΎΡΠΎΡΡΠ΅, ΠΊΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, Π΄Π°ΡΡ 80% ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°). ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ Π²Π°ΠΆΠ½ΡΠ΅ ΡΠ΅ΠΌΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, Π±ΡΠ΄ΡΡ ΠΎΡΡΠ°Π²Π»Π΅Π½Ρ Π·Π° ΡΠΊΠΎΠ±ΠΊΠ°ΠΌΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π°Π²ΡΠΎΡ Π² ΡΡΠΎΠΌ ΠΌΠ°Π»ΠΎ ΡΡΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. Π― Π±ΡΠ΄Ρ ΡΠ°Π΄ Π»ΡΠ±ΡΠΌ ΠΌΠ½Π΅Π½ΠΈΡΠΌ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΡΠΈΡΠΈΠΊΠ΅.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
Π‘Π΅ΡΠ²ΠΈΡΡ Π±ΡΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½Ρ Π½Π° Java 11 Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Spring Boot. ΠΠ΅ΠΆΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ REST. ΠΡΠΎΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΠΎΠ² (ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ Π±ΡΠ»ΠΎ, ΡΡΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² Jenkins). ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° GitHub:
Π§ΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², Π² ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΡΠ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Spring Actuator. ΠΠ½ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ½Π΄ΠΏΠΎΠΉΠ½Ρ /actuator/health ΠΈ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ 200 ΡΡΠ°ΡΡΡ, Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ²ΠΈΡ Π³ΠΎΡΠΎΠ² ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠ°ΡΡΠΈΠΊ, ΠΈΠ»ΠΈ 504 Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠΈΠΊΡΠΈΠ²Π½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ²ΠΈΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡ, ΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΡΠΎΡΡΠΌΠ°ΠΆΠΎΡΠ΅ ΠΎΠ½ΠΈ ΡΠΊΠΎΡΠ΅Π΅ ΡΡΠ°Π½ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ, ΡΠ΅ΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡ ΡΠ°ΡΡΠΈΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ. ΠΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Actuator ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ± Π½Π΅Π΅ Π½Π°ΡΠ½ΡΡ Π±ΠΈΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΠΠ, ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π° ΡΡΠΎ ΡΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ² ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΡΠ»ΠΎΠΌΠ°Π½Π½ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°.
Π‘Π΅ΡΠ²ΠΈΡ Backend
Π‘Π΅ΡΠ²ΠΈΡ Π±Π΅ΠΊΠ΅Π½Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΈ ΠΎΡΠ΄Π°Π²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠ½ΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ².
ΠΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°:
@RestController
public class RequestsCounterController {
private final AtomicLong counter = new AtomicLong();
@GetMapping("/requests")
public Long getRequestsCount() {
return counter.incrementAndGet();
}
}
Π’Π΅ΡΡ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ:
@WebMvcTest(RequestsCounterController.class)
public class RequestsCounterControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void firstRequest_one() throws Exception {
mockMvc.perform(get("/requests"))
.andExpect(status().isOk())
.andExpect(MockMvcResultMatchers.content().string("1"));
}
}
Π‘Π΅ΡΠ²ΠΈΡ Gateway
Π¨Π»ΡΠ· Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠΎΠ²ΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡ ΡΠ΅ΡΠ²ΠΈΡΡ Π±Π΅ΠΊΠ΅Π½Π΄Π°, Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ:
- id ΡΠ»ΡΠ·Π°. ΠΠ½ Π½ΡΠΆΠ΅Π½, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎ ΠΎΡΠ²Π΅ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎΡΠ»ΠΈΡΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ»ΡΠ·Π° ΠΎΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ
- ΠΠ΅ΠΊΠΈΠΉ "ΡΠ΅ΠΊΡΠ΅Ρ", ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΠ³ΡΠ°ΡΡ ΡΠΎΠ»Ρ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ (β ΠΊΠ»ΡΡΠ° ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΊΡΠΊΠΈ)
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² application.properties:
backend.url=http://localhost:8081
instance.id=${random.int}
secret="default-secret"
ΠΠ΄Π°ΠΏΡΠ΅Ρ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ Π±Π΅ΠΊΠ΅Π½Π΄ΠΎΠΌ:
@Service
public class BackendAdapter {
private static final String REQUESTS_ENDPOINT = "/requests";
private final RestTemplate restTemplate;
@Value("${backend.url}")
private String backendUrl;
public BackendAdapter(RestTemplateBuilder builder) {
restTemplate = builder.build();
}
public String getRequests() {
ResponseEntity<String> response = restTemplate.getForEntity(
backendUrl + REQUESTS_ENDPOINT, String.class);
return response.getBody();
}
}
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ:
@RestController
@RequiredArgsConstructor
public class EndpointController {
private final BackendAdapter backendAdapter;
@Value("${instance.id}")
private int instanceId;
@Value("${secret}")
private String secret;
@GetMapping("/")
public String getRequestsCount() {
return String.format("Number of requests %s (gateway %d, secret %s)", backendAdapter.getRequests(), instanceId, secret);
}
}
ΠΠ°ΠΏΡΡΠΊ:
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π±Π΅ΠΊΠ΅Π½Π΄:
./mvnw package -DskipTests
java -Dserver.port=8081 -jar target/microservices-backend-1.0.0.jar
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ»ΡΠ·:
./mvnw package -DskipTests
java -jar target/microservices-gateway-1.0.0.jar
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ:
$ curl http://localhost:8080/
Number of requests 1 (gateway 38560358, secret "default-secret")
ΠΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΡΠ°ΡΠ΅Π»Ρ ΠΎΡΠΌΠ΅ΡΠΈΡ, ΡΡΠΎ Π½Π°ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ Π±Π΅ΠΊΠ΅Π½Π΄Ρ Π½Π°ΠΏΡΡΠΌΡΡ Π² ΠΎΠ±Ρ
ΠΎΠ΄ ΡΠ»ΡΠ·Π° (
Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Π° ΡΠ΅ΡΠ²ΠΈΡΠ° Π΄Π΅Π»ΡΡ ΠΎΠ΄Π½Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΏΠ»ΠΎΠ΄ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ Π½Π°ΡΠ°ΡΡ ΠΌΠ΅ΡΠ°ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ. ΠΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ
ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π°ΡΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΡ. ΠΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π·Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΠΌΠ°ΡΠΈΠ½Π°ΠΌ (ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π΅Π½Π΅Π³, ΡΠ»ΠΎΠΆΠ½ΠΎ), ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ
ΠΌΠ°ΡΠΈΠ½ (ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΎ, Π΄ΠΎΠ»Π³ΠΈΠΉ Π·Π°ΠΏΡΡΠΊ) ΠΈΠ»ΠΈ ΠΆΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΡΠ΅ΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ
Docker
ΠΡΠ»ΠΈ Π²ΠΊΡΠ°ΡΡΠ΅, ΡΠΎ Π΄ΠΎΠΊΠ΅Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΎΠΊΠ΅Ρ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ Dockerfile β ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΠΎ ΡΠ±ΠΎΡΠΊΠ΅ ΠΈ Π·Π°ΠΏΡΡΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π·, Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠ΅Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² (β
Dockerfile
ΠΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡΠ΅ΠΉ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ ΠΎΠ±ΡΠ°Π·Π° β ΡΡΠΎ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ. ΠΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π· Π±ΡΡΡΡΠ΅Π΅ ΡΠΊΠ°ΡΠ°Π΅ΡΡΡ Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π·Π°ΠΉΠΌΠ΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ ΠΌΠ΅ΡΡΠ°, ΠΈ Π²Π°Ρ ΡΠ΅ΡΠ²ΠΈΡ Π±ΡΡΡΡΠ΅Π΅ ΡΡΠ°ΡΡΡΠ΅Ρ. ΠΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ°Π· ΡΡΡΠΎΠΈΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π°, ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π²ΡΠ±ΠΈΡΠ°ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ. Π₯ΠΎΡΠΎΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Alpine β ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ² Linux Ρ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ Dockerfile "Π² Π»ΠΎΠ±" (ΡΡΠ°Π·Ρ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±, Π½Π΅ Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ°ΠΊ):
FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests
EXPOSE 8080
ENTRYPOINT ["java","-jar","target/microservices-gateway-1.0.0.jar"]
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Alpine Ρ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ JDK Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ADD ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² ΠΎΠ±ΡΠ°Π· ΡΠ΅ΠΊΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ src, ΠΎΡΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Π΅ ΡΠ°Π±ΠΎΡΠ΅ΠΉ (WORKDIR) ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ±ΠΎΡΠΊΡ. ΠΠΎΠΌΠ°Π½Π΄Π° EXPOSE 8080 ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΄ΠΎΠΊΠ΅ΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΡΡ 8080 (ΡΡΠΎ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ ΠΈΠ·Π²Π½Π΅, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π² ΡΠΎΠΉ ΠΆΠ΅ ΡΠ΅ΡΠΈ Π΄ΠΎΠΊΠ΅ΡΠ°).
Π§ΡΠΎΠ±Ρ ΡΠΏΠ°ΠΊΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ Π² ΠΎΠ±ΡΠ°Π·Ρ Π½Π°Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· ΠΊΠΎΡΠ½Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
docker image build . -t msvc-backend:1.0.0
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°Π· ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π² 456 ΠΠ±Π°ΠΉΡ (ΠΈΠ· Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· JDK 340 Π·Π°Π½ΡΠ» ΠΠ±Π°ΠΉΡ). Π Π²ΡΠ΅ ΠΏΡΠΈΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ»Π°ΡΡΠΎΠ² Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΏΠΎ ΠΏΠ°Π»ΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΠ°ΡΡ. Π§ΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π°:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎΡΠ°Π³ΠΎΠ²ΡΡ ΡΠ±ΠΎΡΠΊΡ. ΠΠ° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ°Π³Π΅ ΡΠΎΠ±Π΅ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ, Π½Π° Π²ΡΠΎΡΠΎΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ JRE, Π° ΡΡΠ΅ΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΡΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ ΡΡΠΎ Π² Π½ΠΎΠ²ΡΠΉ ΡΠΈΡΡΡΠΉ Alpine ΠΎΠ±ΡΠ°Π·. ΠΡΠΎΠ³ΠΎ Π² ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π΅ ΠΎΠΊΠ°ΠΆΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ.
- ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ java. ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Java 9, ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° jlink ΡΠΎΠ·Π΄Π°ΡΡ JRE ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· Π½ΡΠΆΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
ΠΠ»Ρ Π»ΡΠ±ΠΎΠ·Π½Π°ΡΠ΅Π»ΡΠ½ΡΡ
, Π²ΠΎΡ Ρ
ΠΎΡΠΎΡΠ°Ρ ΡΡΠ°ΡΡΡ ΠΏΡΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠ±ΡΠ°Π·Π°
ΠΡΠΎΠ³ΠΎΠ²ΡΠΉ Dockerfile:
FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine as builder
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests
FROM alpine:3.10.3 as packager
RUN apk --no-cache add openjdk11-jdk openjdk11-jmods
ENV JAVA_MINIMAL="/opt/java-minimal"
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink
--verbose
--add-modules
java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument
--compress 2 --strip-debug --no-header-files --no-man-pages
--release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE"
--output "$JAVA_MINIMAL"
FROM alpine:3.10.3
LABEL maintainer="Anton Shelenkov [email protected]"
ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"
COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY --from=builder /src/target/microservices-backend-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
ΠΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π·, ΠΈ ΠΎΠ½ Π² ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΡ ΡΠ΄Π΅Π» Π² 6 ΡΠ°Π·, ΡΠΎΡΡΠ°Π²ΠΈΠ² 77 ΠΠΠ°ΠΉΡ. ΠΠ΅ΠΏΠ»ΠΎΡ ΠΎ. ΠΠΎΡΠ»Π΅, Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π² ΡΠ΅Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ², ΡΡΠΎΠ±Ρ Π²Π°ΡΠΈ ΠΎΠ±ΡΠ°Π·Ρ Π±ΡΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ°.
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π² Docker
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π°ΡΠΈ ΡΠ΅ΡΠ²ΠΈΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΡΠΈ. Π Π΄ΠΎΠΊΠ΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠΎΠ² ΡΠ΅ΡΠ΅ΠΉ, ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΠΉ ΠΈΠ· Π½ΠΈΡ β bridge, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ Π² ΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Ρ ΠΎΡΡΠ΅. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
docker network create msvc-network
ΠΠ°Π»Π΅Π΅ Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π±Π΅ΠΊΠ΅Π½Π΄Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ‘backend’ Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ microservices-backend:1.0.0:
docker run -dit --name backend --network msvc-net microservices-backend:1.0.0
Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ bridge-ΡΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ service discovery Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΏΠΎ ΠΈΡ
ΠΈΠΌΠ΅Π½Π°ΠΌ. Π’ΠΎ Π΅ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡ Π±Π΅ΠΊΠ΅Π½Π΄Π° Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π²Π½ΡΡΡΠΈ ΡΠ΅ΡΠΈ Π΄ΠΎΠΊΠ΅ΡΠ° ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ»ΡΠ·:
docker run -dit -p 80:8080 --env secret=my-real-secret --env BACKEND_URL=http://backend:8080/ --name gateway --network msvc-net microservices-gateway:1.0.0
Π ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΠΌΡ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ 80 ΠΏΠΎΡΡ Π½Π°ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡΠ° Π½Π° 8080 ΠΏΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠΏΡΠΈΠΈ env ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΠ΅Π΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π±ΡΠ΄ΡΡ Π²ΡΡΠΈΡΠ°Π½Ρ ΡΠΏΡΠΈΠ½Π³ΠΎΠΌ ΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈΠ· application.properties.
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π΄Π²Π° ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°, ΡΠΏΠ°ΠΊΠΎΠ²Π°Π»ΠΈ ΠΈΡ Π² Π΄ΠΎΠΊΠ΅Ρ-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. Π£ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΡΡ ΡΡΠ΄ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ²:
- ΠΠ»ΠΎΡ Π°Ρ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ β Ρ Π½Π°Ρ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅
- ΠΠ»ΠΎΡ Π°Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡ β ΠΏΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ
- Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΡΠΊΠ° β Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΠ»ΠΎΡΡ Π²Π²Π΅ΡΡΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 3 ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΏΡΠΈΡΠ΅ΠΌ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ (ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ 2 ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²)
ΠΠ»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ΄ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Docker Swarm, Nomad, Kubernetes ΠΈΠ»ΠΈ OpenShift. ΠΡΠ»ΠΈ Π²ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° Π±ΡΠ΄Π΅Ρ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Java ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΡΡΠΎΡΠΎΠ½Ρ Spring Cloud (
Π
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com