ΠΡ Π₯Π°Π±Ρ.
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°, ΡΠ°ΠΊΠ°ΠΌ Π΄Π° Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π·Π° ΠΌΠΎΠ΅ΡΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΡΡΠ΅Π΄ΠΈΠ½Π° Π·Π° ΡΡΠ΅ΡΠ΅ Π·Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ ΡΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ. ΠΠΎΠ³Π° ΡΠ° ΡΡΠ΅Π² ΡΠ΅ΠΊΠΎΡΠ° Π½ΠΎΠ²Π° Π°Π»Π°ΡΠΊΠ°, ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠ°ΠΊΠ°Π² Π΄Π° ΡΠ° ΠΏΡΠΎΠ±Π°ΠΌ Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° ΠΌΠΎΡΠ°ΡΠ° Π»ΠΎΠΊΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΡΡΠΊΡ ΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅Π°Π»Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ. ΠΠ°ΡΠΎΠ°, ΡΠ΅ΡΠΈΠ² Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π°ΠΌ ΠΏΠΎΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π·Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ, ΠΊΠΎΡΠ° ΠΏΠΎΠ΄ΠΎΡΠ½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ βΠ·Π°ΠΊΠ°ΡΠΈβ ΡΠΎ ΡΠ΅ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. ΠΠ»Π°Π²Π½ΠΈΠΎΡ ΡΡΠ»ΠΎΠ² Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π±Π»ΠΈΠ·ΠΈΠ½Π° Π½Π° ΡΠ΅Π°Π»Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ.
ΠΡΠ²ΠΈΡΠ½ΠΎ, Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΠ² ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π²ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΠΊΠΎΡΠΈ:
-
Π‘ΠΎΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΄Π²Π΅ ΡΡΠ»ΡΠ³ΠΈ - 'backend' ΠΈ 'gateway', ΡΠΏΠ°ΠΊΡΠ²Π°ΡΡΠ΅ Π³ΠΈ Π²ΠΎ Π΄ΠΎΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ Π·Π°Π΅Π΄Π½ΠΎ
ΠΠ»ΡΡΠ½ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ: Java 11, Spring Boot, Docker, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° ΡΠ»ΠΈΠΊΠΈ
-
ΠΠ»ΡΡΠ½ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ: Kubernetes, GKE, ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠ΅ΡΡΡΡΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅, ΡΠ°ΡΠ½ΠΈ
-
ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Helm 3 Π·Π° ΠΏΠΎΠ΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΡΠ΅
ΠΠ»ΡΡΠ½ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ: ΠΊΠΎΡΠΌΠΈΠ»Π° 3, ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈ
-
ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° Jenkins ΠΈ pipeline Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ Π΄ΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π΄ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ
ΠΠ»ΡΡΠ½ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ: ΠΠ΅Π½ΠΊΠΈΠ½Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ, ΠΏΠΎΡΠ΅Π±Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
ΠΠ»Π°Π½ΠΈΡΠ°ΠΌ Π΄Π° ΠΏΠΎΡΠ²Π΅ΡΠ°ΠΌ ΠΏΠΎΡΠ΅Π±Π½Π° ΡΡΠ°ΡΠΈΡΠ° Π½Π° ΡΠ΅ΠΊΠΎΡ ΡΠ΅ΠΊΠΎΡ.
Π€ΠΎΠΊΡΡΠΎΡ Π½Π° ΠΎΠ²Π°Π° ΡΠ΅ΡΠΈΡΠ° Π½Π°ΠΏΠΈΡΠΈ Π½Π΅ Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅, ΡΡΠΊΡ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ°Π°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ Π΅Π΄Π΅Π½ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ. ΠΠ°ΠΊΠΎ ΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΎΠ±ΠΈΡΠ½ΠΎ ΡΠ΅ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡΠ° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ, ΠΌΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° ΡΠ΅ΠΏΠ°ΠΊ Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π°Ρ Π±Π°ΡΠ΅ΠΌ 20% ΡΠΎ Π½ΠΈΠ² (ΡΡΠΎ Π΅ ΠΏΠΎΠ·Π½Π°ΡΠΎ Π΄Π΅ΠΊΠ° ΡΠΎΡΠΈΠ½ΡΠ²Π° 80% ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ). ΠΠ΅ΠΊΠΎΠΈ Π°ΠΏΡΠΎΠ»ΡΡΠ½ΠΎ Π²Π°ΠΆΠ½ΠΈ ΡΠ΅ΠΌΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ°, ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΠΈΠ·ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΠ΄ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π°Π²ΡΠΎΡΠΎΡ ΠΌΠ°Π»ΠΊΡ ΡΠ°Π·Π±ΠΈΡΠ° Π·Π° ΠΎΠ²Π°; ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π° ΠΈΡΠΊΠ»ΡΡΠΈΠ²ΠΎ Π·Π° Π»ΠΈΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°. ΠΠΎ ΠΏΠΎΠ·Π΄ΡΠ°Π²ΡΠ²Π°ΠΌ ΡΠ΅ΠΊΠΎΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½Π° ΠΊΡΠΈΡΠΈΠΊΠ°.
Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ
Π£ΡΠ»ΡΠ³ΠΈΡΠ΅ Π±Π΅Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ Java 11 ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Spring Boot. ΠΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΌΠ΅ΡΡ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ° ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° REST. ΠΡΠΎΠ΅ΠΊΡΠΎΡ ΡΠ΅ Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π±ΡΠΎΡ Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΈ (ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΡΠ½Π° ΡΠ΅ ΠΈΠΌΠ° ΡΡΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠ° Π²ΠΎ ΠΠ΅Π½ΠΊΠΈΠ½Ρ). ΠΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π·Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π½Π° GitHub:
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° Π½Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΎΠ΄ ΡΡΠ»ΡΠ³ΠΈΡΠ΅, Π½Π° Π½ΠΈΠ²Π½Π°ΡΠ° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ Π±Π΅ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ Spring Actuator. ΠΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ ΠΊΡΠ°ΡΠ½Π° ΡΠΎΡΠΊΠ° /Π°ΠΊΡΠΈΠ²Π°ΡΠΎΡ/Π·Π΄ΡΠ°Π²ΡΠ΅ ΠΈ ΡΠ΅ Π²ΡΠ°ΡΠΈ ΡΡΠ°ΡΡΡ ΠΎΠ΄ 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"));
}
}
Π£ΡΠ»ΡΠ³Π° Π·Π° ΠΏΠΎΡΡΠ°Π»
ΠΠΎΡΡΠ°ΡΠ° ΡΠ΅ Π³ΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ Π±Π°ΡΠ°ΡΠ΅ΡΠΎ Π΄ΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ°, Π΄ΠΎΠΏΠΎΠ»Π½ΡΠ²Π°ΡΡΠΈ ΡΠ° ΡΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ:
- ΠΠ Π½Π° ΠΏΠΎΡΡΠ°ΡΠ°. ΠΠΎΡΡΠ΅Π±Π½ΠΎ Π΅ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΅Π΄Π½Π° ΠΈΠ½ΡΡΠ°Π½ΡΠ° Π½Π° ΠΏΠΎΡΡΠ°ΡΠ° Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π° ΠΎΠ΄ Π΄ΡΡΠ³Π° ΡΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ
- ΠΠ΄ΡΠ΅Π΄Π΅Π½Π° βΡΠ°ΡΠ½Π°β ΠΊΠΎΡΠ° ΡΠ΅ ΠΈΠ³ΡΠ° ΡΠ»ΠΎΠ³Π° Π½Π° ΠΌΠ½ΠΎΠ³Ρ Π²Π°ΠΆΠ½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° (ΠΊΠ»ΡΡΠ΅Π½ Π±ΡΠΎΡ Π·Π° ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π²Π°ΠΆΠ½ΠΎ ΠΊΠΎΠ»Π°ΡΠ΅)
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π²ΠΎ 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 ΡΠΎΠ·Π΄Π°Π²Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ, ΠΏΠΎ Π΅Π΄Π΅Π½ ΠΏΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°. ΠΠ° Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ 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"]
ΠΠ²Π΄Π΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΠ»ΠΈΠΊΠ° Π·Π°ΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° Π°Π»ΠΏΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ ΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° JDK Π·Π° Π΄Π° Π³ΠΎ ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ADD, Π³ΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ src Π½Π° ΡΠ»ΠΈΠΊΠ°ΡΠ°, Π³ΠΎ ΠΎΠ·Π½Π°ΡΡΠ²Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΠ°Π±ΠΎΡΠ΅Π½ (WORKDIR) ΠΈ ΡΠ° Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ°. ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° EXPOSE 8080 ΠΌΡ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π° Π΄ΠΎΠΊΠ΅ΡΠΎΡ Π΄Π΅ΠΊΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΡΠ΅ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ²ΠΎΡΠ°ΡΠ° ΠΏΠΎΡΡΠ° 8080 (ΠΎΠ²Π° Π½Π΅ΠΌΠ° Π΄Π° ΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π΄ΠΎΡΡΠ°ΠΏΠ½Π° ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ, ΡΡΠΊΡ ΡΠ΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ΄ Π΄ΡΡΠ³ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Π½Π° ΠΈΡΡΠ°ΡΠ° Π΄ΠΎΠΊΠ΅ΡΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ° ).
ΠΠ° Π΄Π° Π³ΠΈ ΡΠΏΠ°ΠΊΡΠ²Π°ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π²ΠΎ ΡΠ»ΠΈΠΊΠΈ, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΎΠ΄ ΠΊΠΎΡΠ΅Π½ΠΎΡ Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ:
docker image build . -t msvc-backend:1.0.0
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΡΠ»ΠΈΠΊΠ° ΠΎΠ΄ 456 MB Π²ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° (ΠΎΠ΄ ΠΊΠΎΠΈ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ»ΠΈΠΊΠ° JDK 340 Π·Π΅Π΄Π΅ MB). Π ΡΠ΅ΡΠΎ ΡΠΎΠ° ΠΈ ΠΏΠΎΠΊΡΠ°Ρ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΡΠ°ΡΠΎΠ²ΠΈΡΠ΅ Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΡΠΎΡΠ°Ρ Π½Π° Π΅Π΄Π΅Π½ ΠΏΡΡΡ. ΠΠ° Π΄Π° ΡΠ° Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° ΡΠ»ΠΈΠΊΠ°:
- ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΡΠ΅ΠΏΠ΅Π½ΠΎ ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅. ΠΠΎ ΠΏΡΠ²ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ ΡΠ΅ Π³ΠΎ ΡΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ, Π²ΠΎ Π²ΡΠΎΡΠΈΠΎΡ ΡΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ JRE, Π° Π²ΠΎ ΡΡΠ΅ΡΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ ΡΠ΅ Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ΡΠΎ ΠΎΠ²Π° Π²ΠΎ Π½ΠΎΠ²Π° ΡΠΈΡΡΠ° Π°Π»ΠΏΡΠΊΠ° ΡΠ»ΠΈΠΊΠ°. Π‘Π΅Π²ΠΊΡΠΏΠ½ΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½Π°ΡΠ° ΡΠ»ΠΈΠΊΠ° ΡΠ΅ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠ°ΠΌΠΎ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ.
- ΠΡΠ΄Π΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ 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
Π‘Π»Π΅Π΄Π½ΠΎ, Π°ΡΠ΄Π΅ Π΄Π° Π»Π°Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° Π·Π°Π΄Π½ΠΈΠ½Π° Π½Π°ΡΠ΅ΡΠ΅Π½Π° βΠ·Π°Π΄Π½ΠΈΠ½Π°β ΡΠΎ ΡΠ»ΠΈΠΊΠ°ΡΠ° microservices-backend:1.0.0:
docker run -dit --name backend --network msvc-net microservices-backend:1.0.0
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π° ΠΌΠΎΡΡΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΡΡΠ»ΡΠ³Π° ΠΎΡΠΊΡΠΈΠ²Π°ΡΠ΅ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΡΡΠΈΡΠ°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΠΎ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΠΈΠΌΠΈΡΠ°. ΠΠ΄Π½ΠΎΡΠ½ΠΎ, ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° Π·Π°Π΄Π½ΠΈΠ½Π° ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ½Π° Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Docker Π½Π°
ΠΠ° ΡΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ ΠΏΠΎΡΡΠ°ΡΠ°:
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 (
Π
ΠΠ·Π²ΠΎΡ: www.habr.com