
ΠΠ΄ΡΠ°Π²Π΅ΠΉ, Π₯Π°Π±Ρ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡΠ° ΡΠΈ Π² ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΅Π±Π½Π° ΡΡΠ΅Π΄Π° Π·Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΡΡΠ°Π²Π°ΠΌ Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π²ΠΈΠ½Π°Π³ΠΈ ΡΡΠΌ ΠΈΡΠΊΠ°Π» Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ±Π²Π°ΠΌ Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π½ΠΎ ΠΈ ΠΏΡΠΈ ΠΏΠΎ-ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΠΎΠΏΡΠΎΡΡΠ΅Π½ΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ "ΠΎΠ±ΠΎΠ³Π°ΡΠ΅Π½ΠΎ" Ρ Π²ΡΠ΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π±Π»ΠΈΠ·ΠΎΡΡ Π΄ΠΎ ΡΠ΅Π°Π»Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠΏΠΊΠΈ:
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π²Π΅ ΡΡΠ»ΡΠ³ΠΈ β βΠ±Π΅ΠΊΠ΅Π½Π΄β (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
Π¨Π»ΡΠ·ΡΡ ΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΊΡΠΌ ΡΠ΅ΡΠ²ΠΈΠ·Π° Π±Π΅ΠΊΠ΅Π½Π΄ ΠΈ ΡΠ΅ Π³ΠΈ Π΄ΠΎΠΏΡΠ»Π²Π° Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ°:
- ΠΈΠ΄ Π½Π° ΡΠ»ΡΠ·Π°. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·Π»ΠΈΡΠΈΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΡΠ»ΡΠ·Π° ΠΏΠΎ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° ΠΎΡ ΡΡΡΠ²ΡΡΠ°
- ΠΡΠΊΠ°ΠΊΡΠ² "ΡΠ΅ΠΊΡΠ΅Ρ", ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ³ΡΠ°Π΅ ΡΠΎΠ»Ρ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Π° ΠΏΠ°ΡΠΎΠ»Π° (β Π½Π° ΠΊΠ»ΡΡΠ° Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π½Π° Π²Π°ΠΆΠ½Π° Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠ°)
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² 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 ΠΏΠ°ΠΊΠ΅Ρ -DskipTests
java -jar target/microservices-gateway-1.0.0.jarΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅:
$ curl http://localhost:8080/
ΠΡΠΎΠΉ Π·Π°ΡΠ²ΠΊΠΈ 1 (gateway 38560358, ΡΠ΅ΠΊΡΠ΅Ρ "default-secret")ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ. ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π» ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ Π½ΠΈΡΠΎ Π½Π΅ Π½ΠΈ ΠΏΡΠ΅ΡΠΈ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ Π±Π΅ΠΊΠ΅Π½Π΄Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠΉΠΊΠΈ ΡΠ»ΡΠ·Π° (). ΠΠ° Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ, ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ Π² Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π° Π½Π°Π²ΡΠ½ "Π΄Π° ΡΡΡΡΡΠΈ" ΡΠ°ΠΌΠΎ ΡΠ»ΡΠ·ΡΡ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈ Π΄Π²Π°ΡΠ° ΡΡΡΠ²ΠΈΡΠ° ΡΠΏΠΎΠ΄Π΅Π»ΡΡ Π΅Π΄Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΌΠ½ΠΎΠΆΠ°Ρ ΠΏΠΎΡΠΎΡΠΈ ΠΈ Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ°Ρ Π΅Π΄ΠΈΠ½ Π½Π° Π΄ΡΡΠ³. ΠΠ°Π»Π°Π³Π° ΡΠ΅ Π΄Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΡΡΠ΅Π· ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ (ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΈ, ΡΠ»ΠΎΠΆΠ½ΠΎ), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ (ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΎ, Π΄ΡΠ»ΡΠ³ ΡΡΠ°ΡΡ) ΠΈΠ»ΠΈ ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ. ΠΡΠ°ΠΊΠ²Π°Π½ΠΎ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ΅ΡΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ.
Docker
ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ, Docker ΡΡΠ·Π΄Π°Π²Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΏΠΎ Π΅Π΄ΠΈΠ½ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Docker, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Dockerfile β ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΠΏΡΡΠΊΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π·, Π΄Π° Π³ΠΎ ΠΊΠ°ΡΠΈΡΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΡ Π·Π° ΠΎΠ±ΡΠ°Π·ΠΈ (β ) ΠΈ Ρ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π° ΡΠ°Π·Π²Π΅ΡΠ½Π΅ΡΠ΅ ΡΠ²ΠΎΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Π² ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π° Ρ Docker.
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 Π·Π°Π΅ ΠΠ±Π°ΠΉΡΠ°). Π Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, ΠΏΡΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π±ΡΠΎΡΡ Π½Π° ΠΏΡΡΡΡΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π°ΡΠ° ΡΡΠΊΠ°. ΠΠ° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·:
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. ΠΠ° ΠΏΡΡΠ²Π°ΡΠ° ΡΡΡΠΏΠΊΠ° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π° Π²ΡΠΎΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ 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 ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΏΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΠΈΠΌΠ΅Π½Π°. Π’ΠΎΠ΅ΡΡ, ΡΡΠ»ΡΠ³Π°ΡΠ° Π±Π΅ΠΊΠ΅Π½Π΄ ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Π²ΡΡΡΠ΅ Π² 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
