
ΠΠ΄ΡΠ°Π²Π΅ΠΉ, Π₯Π°Π±Ρ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡΠ° ΡΠΈ Π² ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΅Π±Π½Π° ΡΡΠ΅Π΄Π° Π·Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ. ΠΡΠΈ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π²ΠΈΠ½Π°Π³ΠΈ ΠΆΠ΅Π»Π°Π΅Ρ Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ±Π²Π°ΠΌ Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π½ΠΎ ΠΈ Π² ΠΏΠΎ-ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΠΎΠΏΡΠΎΡΡΠ΅Π½ΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° βΠΎΠ±Π²Π΅ΡΠ²Π°ΠΌβ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ Π±Π»ΠΈΠ·ΠΊΠΎ Π΄ΠΎ ΡΠ΅Π°Π»Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠΏΠΊΠΈ:
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π²Π° ΡΡΡΠ²ΠΈΡΠ° β βΠ±Π΅ΠΊΠ΅Π½Π΄β (backend) ΠΈ βΡΠ»ΡΠ·β (gateway), ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π² docker ΠΎΠ±ΡΠ°Π·ΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠ½Π°ΡΠ° ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°.
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: Java 11, Spring Boot, Docker, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: Kubernetes, GKE, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅, ΡΠ΅ΠΊΡΠ΅ΡΠΈ.
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Helm 3 Π·Π° ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: Helm 3, ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° ΡΠ°ΡΡ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Jenkins ΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄Π° Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
ΠΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ: ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° Jenkins, ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, ΠΎΡΠ΄Π΅Π»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
ΠΠ° Π²ΡΡΠΊΠ° ΡΡΡΠΏΠΊΠ° ΠΏΠ»Π°Π½ΠΈΡΠ°ΠΌ Π΄Π° ΠΏΠΎΡΠ²Π΅ΡΡ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ°ΡΠΈΡ.
Π€ΠΎΠΊΡΡΡΡ Π½Π° ΡΠΎΠ·ΠΈ ΡΠΈΠΊΡΠ» ΡΡΠ°ΡΠΈΠΈ Π½Π΅ Π΅ Π²ΡΡΡ Ρ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ, Π° ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ Π½Π°ΠΊΠ°ΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Π² Π΅Π΄ΠΈΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ Π½Π΅ΡΠ° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ° ΠΈΠ·Π²ΡΠ½ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΡΠΌΡΡΠ°ΠΌ, ΡΠ΅ Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° ΡΠΌΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ Ρ ΡΡΡ ΠΏΠΎΠ½Π΅ Π½Π° 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 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("ΠΡΠΎΠΉ Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ %s (ΡΠ»ΡΠ· %d, ΡΠ΅ΠΊΡΠ΅Ρ %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/
ΠΡΠΎΠΉ Π·Π°ΡΠ²ΠΊΠΈ 1 (ΡΠ»ΡΠ· 38560358, ΡΠ΅ΠΊΡΠ΅Ρ "default-secret")ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ. ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π» ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ Π½ΠΈΡΠΎ Π½Π΅ Π½ΠΈ ΠΏΡΠ΅ΡΠΈ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ Π±Π΅ΠΊΠ΅Π½Π΄Π°, Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠΉΠΊΠΈ ΡΠ»ΡΠ·Π° (). ΠΠ° Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ, ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ Π² Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π° Π½Π°Π²ΡΠ½ Π΄Π° "ΡΡΡΡΡΠΈ" ΡΠ°ΠΌΠΎ ΡΠ»ΡΠ·ΡΡ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΠΏΠΎΠ΄Π΅Π»ΡΡ Π΅Π΄Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΏΠΎΡΠΎΡΠΈ ΠΈ Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΡΠΈ ΠΏΡΠ΅ΡΠ°Ρ. ΠΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π»ΠΎΡΠΎ Π΄Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΡΡΠ΅Π· ΡΠ°Π·Π½Π°ΡΡΠ½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ (ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΈ, ΡΠ»ΠΎΠΆΠ½ΠΎ), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ (ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΎ, Π±Π°Π²Π΅Π½ ΡΡΠ°ΡΡ) ΠΈΠ»ΠΈ ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ. ΠΡΠ°ΠΊΠ²Π°Π½ΠΎ, ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ΅ΡΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ.
Docker
ΠΠΊΠΎ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ, 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"]Π’ΡΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±Π°Π·ΠΎΠ² ΠΎΠ±ΡΠ°Π·, ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° Alpine, Ρ Π²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ JDK Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ. Π‘ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ADD Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ src Π² ΠΎΠ±ΡΠ°Π·Π°, ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°ΠΌΠ΅ Ρ Π·Π° ΡΠ°Π±ΠΎΡΠ½Π° (WORKDIR) ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ. ΠΠΎΠΌΠ°Π½Π΄Π° EXPOSE 8080 ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π° Docker, ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΡΡΠ° 8080 (ΡΠΎΠ²Π° Π½Π΅ ΠΏΡΠ°Π²ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π½Π°Π²ΡΠ½, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡ Π΄ΡΡΠ³ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² ΡΡΡΠ°ΡΠ° Docker ΠΌΡΠ΅ΠΆΠ°).
ΠΠ° Π΄Π° ΠΎΠΏΠ°ΠΊΠΎΠ²Π°ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π² ΠΎΠ±ΡΠ°Π·ΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΡΠ΅Π½Π° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ:
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 anshelen@yandex.ru"
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.
ΠΡΡΠ²ΠΎ, Π½Π°ΡΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ Π² Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°. Π 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 Π½Π° Π°Π΄ΡΠ΅Ρ .
Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ»ΡΠ·Π°:
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.
Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ ΠΈ ΡΠ΅ ΡΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ ΠΏΡΡ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π΄Π²Π° ΠΏΡΠΎΡΡΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Ρ ΠΌΠ΅ Π³ΠΈ Π² Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ Π³ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΠΌΠ΅ Π½Π° Π΅Π΄Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. Π ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΠ±Π°ΡΠ΅ ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ:
- ΠΠΎΡΠ° ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ β Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΡΡΡΠ²ΡΡ
- ΠΠΎΡΠ° ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ β ΠΏΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³ΡΡΡΠ°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ Π±Π°Π»Π°Π½ΡΠΈΡΠ° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ
- Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ β Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ 3 ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π²ΡΡΠΊΠ° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ (ΡΠΎΠ²Π° ΡΠ°ΠΌΠΎ Π·Π° 2 ΡΡΠ»ΡΠ³ΠΈ)
ΠΠ° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π³ΠΎΡΠ΅ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΡΠ΅Π΄ΠΈΡΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΡΠΎ Docker Swarm, Nomad, Kubernetes ΠΈΠ»ΠΈ OpenShift. ΠΠΊΠΎ ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Java, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π° Π½Π° Spring Cloud ().
Π ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΠ°ΡΡΡΠ°Π²Π°Ρ Kubernetes ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² Google Kubernetes Engine.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
