Π₯Π΅ΠΉ Π₯Π°Π±Ρ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π³ΠΎΠ²ΠΎΡΡ Π·Π° ΠΌΠΎΡ ΠΎΠΏΠΈΡ Π² ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΅Π±Π½Π° ΡΡΠ΅Π΄Π° Π·Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ Ρ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ. ΠΠΎΠ³Π°ΡΠΎ Π½Π°ΡΡΠ°Π²Π°Ρ Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π²ΠΈΠ½Π°Π³ΠΈ ΠΈΡΠΊΠ°Ρ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΠΌ Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π½ΠΎ ΠΈ Π² ΠΏΠΎ-ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΠΎΠΏΡΠΎΡΡΠ΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π΄Π° Π±ΡΠ΄Π΅ "ΠΏΠΎΠΊΡΠΈΡΠΎ" Ρ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. ΠΡΠ½ΠΎΠ²Π½ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π±Π»ΠΈΠ·ΠΎΡΡ Π΄ΠΎ ΡΠ΅Π°Π»Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠΏΠΊΠΈ:
-
Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ Π΄Π²Π΅ ΡΡΠ»ΡΠ³ΠΈ - 'backend' (Π±Π΅ΠΊΠ΅Π½Π΄) ΠΈ 'gateway' (ΡΠ»ΡΠ·), ΠΎΠΏΠ°ΠΊΠΎΠ²Π°ΠΉΡΠ΅ Π³ΠΈ Π² Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π³ΠΈ Π½Π°ΡΡΡΠΎΠΉΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Π·Π°Π΅Π΄Π½ΠΎ
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: Java 11, Spring Boot, Docker, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
-
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: Kubernetes, GKE, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅, ΡΠ°ΠΉΠ½ΠΈ
-
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Ρ Helm 3 Π·Π° ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠΈ
ΠΡΠΈΠΊΠ΅ΡΠΈ: Helm 3, Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°
-
ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΠΆΠ΅Π½ΠΊΠΈΠ½Ρ ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ΄ ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅ΡΠ°
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: Jenkins ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, ΠΎΡΠ΄Π΅Π»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
Π‘ΠΌΡΡΠ°ΠΌ Π΄Π° ΠΏΠΎΡΠ²Π΅ΡΡ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ°ΡΠΈΡ Π½Π° Π²ΡΡΠΊΠ° ΡΡΡΠΏΠΊΠ°.
Π€ΠΎΠΊΡΡΡΡ Π½Π° ΡΠ°Π·ΠΈ ΡΠ΅ΡΠΈΡ ΠΎΡ ΡΡΠ°ΡΠΈΠΈ Π½Π΅ Π΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ, Π° ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ Π½Π°ΠΊΠ°ΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Π² Π΅Π΄Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ Π½Π΅ΡΠ° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ° ΠΈΠ·Π²ΡΠ½ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΌΠΈΡΠ»Ρ, ΡΠ΅ Π²ΡΠ΅ ΠΏΠ°ΠΊ Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ Ρ ΡΡΡ ΠΏΠΎΠ½Π΅ 20% (ΠΊΠΎΠ΅ΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π·Π½Π°Π΅ΡΠ΅, Π΄Π°Π²Π° 80% ΠΎΡ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°). ΠΡΠΊΠΎΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ Π²Π°ΠΆΠ½ΠΈ ΡΠ΅ΠΌΠΈ, ΠΊΠ°ΡΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°, ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΈΠ·Π²ΡΠ½ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π°Π²ΡΠΎΡΡΡ ΡΠ°Π·Π±ΠΈΡΠ° ΠΌΠ°Π»ΠΊΠΎ Π·Π° ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Π·Π° Π»ΠΈΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°. ΠΡΠΈΠ΅ΠΌΠ°ΠΌ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΌΠ½Π΅Π½ΠΈΡ ΠΈ Π³ΡΠ°Π΄ΠΈΠ²Π½Π° ΠΊΡΠΈΡΠΈΠΊΠ°.
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ
Π£ΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° Java 11 Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Spring Boot. ΠΠ΅ΠΆΠ΄ΡΡΠ΅ΡΠ²ΠΈΠ·Π½ΠΎΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° REST. ΠΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π±ΡΠΎΠΉ ΡΠ΅ΡΡΠΎΠ²Π΅ (ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π΄Π° ΠΈΠΌΠ° ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ²Π° Π² Jenkins). ΠΠ·Ρ
ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π·Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° GitHub:
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠ΅ ΡΡΠ°ΡΡΡΠ° Π½Π° Π²ΡΡΠΊΠ° ΠΎΡ ΡΡΠ»ΡΠ³ΠΈΡΠ΅, ΠΊΡΠΌ ΡΠ΅Ρ Π½ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Spring Actuator. Π’ΠΎΠΉ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° /actuator/health ΠΈ ΡΠ΅ Π²ΡΡΠ½Π΅ ΡΡΠ°ΡΡΡ 200, Π°ΠΊΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ Π³ΠΎΡΠΎΠ²Π° Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ΅ ΡΡΠ°ΡΠΈΠΊ, ΠΈΠ»ΠΈ 504, Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ° ΡΠΈΠΊΡΠΈΠ²Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΈ ΠΈ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½Π΅ΠΏΡΠ΅ΠΎΠ΄ΠΎΠ»ΠΈΠΌΠ° ΡΠΈΠ»Π° Π΅ ΠΏΠΎ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΄Π° ΡΡΠ°Π½Π°Ρ Π½Π°ΠΏΡΠ»Π½ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΈ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΄Π° ΠΎΡΡΠ°Π½Π°Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ. ΠΠΎ Π² ΡΠ΅Π°Π»Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Actuator ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ ΠΏΡΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΏΡΠ΅Π΄ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΡΠ΅ Π±ΠΎΡΡΡ Π·Π° Π½Π΅Π³ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π΄ΠΎΡΡΡΠΏΠ° Π΄ΠΎ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π½Π° ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΡΠΏΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Ρ ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°.
ΠΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ Π² Π·Π°Π΄Π½ΠΈΡ ΠΊΡΠ°ΠΉ
ΠΠ΅ΠΊΠ΅Π½Π΄ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π±ΡΠΎΠΈ ΠΈ ΡΠ΅ Π²ΡΡΠ½Π΅ Π±ΡΠΎΡ Π½Π° ΠΏΡΠΈΠ΅ΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ.
ΠΠΎΠ΄ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ°:
@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"));
}
}
Π‘Π΅ΡΠ²ΠΈΠ·Π΅Π½ ΡΠ»ΡΠ·
Π¨Π»ΡΠ·ΡΡ ΡΠ΅ ΠΏΡΠ΅ΠΏΡΠ°ΡΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ Π±Π΅ΠΊΠ΅Π½Π΄ ΡΡΠ»ΡΠ³Π°ΡΠ°, Π΄ΠΎΠΏΡΠ»Π²Π°ΠΉΠΊΠΈ Ρ ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ:
- ID Π½Π° ΡΠ»ΡΠ·Π°. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠΈ Π΅Π΄Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° ΡΠ»ΡΠ·Π° ΠΎΡ Π΄ΡΡΠ³ΠΎ ΡΡΠ΅Π· ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°
- ΠΡΠΊΠ°ΠΊΠ²Π° "ΡΠ°ΠΉΠ½Π°", ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ³ΡΠ°Π΅ ΡΠΎΠ»ΡΡΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Π° ΠΏΠ°ΡΠΎΠ»Π° (Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΊΠ»ΡΡΠ° Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π½Π° Π²Π°ΠΆΠ½Π° Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠ°)
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² application.properties:
backend.url=http://localhost:8081
instance.id=${random.int}
secret="default-secret"
Backend Π°Π΄Π°ΠΏΡΠ΅Ρ:
@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 ΡΡΠ·Π΄Π°Π²Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΏΠΎ Π΅Π΄ΠΈΠ½ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ docker, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Dockerfile - ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π΄Π° Π³ΠΎ ΠΊΠ°ΡΠΈΡΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° (No.
ΠΠΎΠΊΠ΅Ρ ΡΠ°ΠΉΠ»
ΠΠ΄Π½Π° ΠΎΡ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π½Π΅Π³ΠΎΠ²ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ. ΠΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ ΠΎΡ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΡΠ΅ Π·Π°Π΅ΠΌΠ° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΌΡΡΡΠΎ ΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° Π²ΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΠΎ-Π±ΡΡΠ·ΠΎ. ΠΡΡΠΊΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ Π½Π°ΠΉ-ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ. ΠΠΎΠ±ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Π΅ 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 MB ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ Π±Π°Π·ΠΎΠ²ΠΎΡΠΎ JDK ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π΅ΠΌΠ° 340 MB). Π Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π±ΡΠΎΡΡ Π½Π° ΠΏΡΡΡΡ. ΠΠ° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅:
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ΡΠ°ΠΏΠ½ΠΎ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅. Π ΠΏΡΡΠ²Π°ΡΠ° ΡΡΡΠΏΠΊΠ° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π²ΡΠ² Π²ΡΠΎΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ JRE, Π° Π² ΡΡΠ΅ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° ΡΠ΅ Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ Π² Π½ΠΎΠ² ΡΠΈΡΡ ΠΎΠ±ΡΠ°Π· Π½Π° Alpine. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠ°ΠΌΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π² ΠΊΡΠ°ΠΉΠ½ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
- ΠΠ΅ΠΊΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° java. ΠΠ°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ Ρ Java 9, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° jlink, Π·Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ JRE ΡΠ°ΠΌΠΎ ΠΎΡ ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΡΠ΅
ΠΠ° Π»ΡΠ±ΠΎΠ·Π½Π°ΡΠ΅Π»Π½ΠΈΡΠ΅, Π΅ΡΠΎ Π΅Π΄Π½Π° Π΄ΠΎΠ±ΡΠ° ΡΡΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡΠ΅ Π·Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΡΠ°Π΅Π½ Docker ΡΠ°ΠΉΠ»:
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 MB. ΠΠ΅ Π΅ Π·Π»Π΅. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠ°ΡΠ΅Π½ΠΈ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π° ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΠΎΡ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ.
Π£ΡΠ»ΡΠ³ΠΈ Π·Π° ΡΡΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π² Docker
ΠΠ°ΡΠΎ Π½Π°ΡΠ°Π»ΠΎ Π½Π°ΡΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ° Π² Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΌΡΠ΅ΠΆΠ°. ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΈΠΏΠ° ΠΌΡΠ΅ΠΆΠΈ Π² 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
Π‘ΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΠΌΠΎΡΡΠΎΠ²Π°ΡΠ° ΠΌΡΠ΅ΠΆΠ° ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π° Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΏΠΎ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ ΠΈΠΌΠ΅Π½Π°. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π±Π΅ΠΊΠ΅Π½Π΄ ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Π² Π΄ΠΎΠΊΠ΅Ρ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π°
Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ»ΡΠ·Π°:
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, Π·Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, ΠΊΠΎΠΈΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΈ ΠΎΡ spring ΠΈ Π΄Π° Π·Π°ΠΌΠ΅Π½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° ΠΎΡ application.properties.
Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΎΠ±Π°ΠΆΠ΄Π°ΠΌΠ΅
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π΄Π²Π΅ ΠΏΡΠΎΡΡΠΈ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ, ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Ρ ΠΌΠ΅ Π³ΠΈ Π² Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ Π³ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΠΌΠ΅ Π·Π°Π΅Π΄Π½ΠΎ Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΌΠ°ΡΠΈΠ½Π°. ΠΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΠ±Π°ΡΠ΅ ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ:
- ΠΠΎΡΠ° ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΎΡΡ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ - Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π·Π° Π½Π°Ρ Π½Π° Π΅Π΄ΠΈΠ½ ΡΡΡΠ²ΡΡ
- ΠΠΎΡΠ° ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ - ΠΊΠΎΠ³Π°ΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ, Π±ΠΈ Π±ΠΈΠ»ΠΎ Ρ ΡΠ±Π°Π²ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ Π΄Π° ΡΠ΅ Π±Π°Π»Π°Π½ΡΠΈΡΠ° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ
- Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ - ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΠΏΠΎΠ½Π΅ 3 ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ (ΡΠΎΠ²Π° Π΅ ΡΠ°ΠΌΠΎ Π·Π° 2 ΡΡΠ»ΡΠ³ΠΈ)
ΠΠ° Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΡΠ΅ Π³ΠΎΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠΎ Docker Swarm, Nomad, Kubernetes ΠΈΠ»ΠΈ OpenShift. ΠΠΊΠΎ ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Java, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΠΊΡΠΌ Spring Cloud (
Π
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com