ืœืขืจื ืขืŸ ืฆื• ื ื•ืฆืŸ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก. ื˜ื™ื™ืœ 1. ืคืจื™ืœื™ื ื’ ืฉื˜ื™ื•ื•ืœ ืื•ืŸ ื“ืึธืงืงืขืจ

ืœืขืจื ืขืŸ ืฆื• ื ื•ืฆืŸ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก. ื˜ื™ื™ืœ 1. ืคืจื™ืœื™ื ื’ ืฉื˜ื™ื•ื•ืœ ืื•ืŸ ื“ืึธืงืงืขืจ

ื”ืขืœื, ื”ืื‘ืจ.

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ ืžื™ื™ืŸ ื“ืขืจืคืึทืจื•ื ื’ ืฆื• ืฉืึทืคึฟืŸ ืึท ืœืขืจื ืขืŸ ืกื•ื•ื™ื•ื•ืข ืคึฟืึทืจ ืขืงืกืคึผืขืจื™ืžืขื ื˜ื™ื ื’ ืžื™ื˜ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก. ื•ื•ืขืŸ ืื™ืš ืœืขืจื ืขืŸ ื™ืขื“ืขืจ ื ื™ื™ึท ื’ืขืฆื™ื™ึทื’, ืื™ืš ืฉื˜ืขื ื“ื™ืง ื’ืขื•ื•ืืœื˜ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ืขืก ื ื™ื˜ ื‘ืœื•ื™ื– ืื•ื™ืฃ ืžื™ื™ืŸ ื”ื™ื’ืข ืžืึทืฉื™ืŸ, ืึธื‘ืขืจ ืื•ื™ืš ืื™ืŸ ืžืขืจ ืจืขืึทืœื™ืกื˜ื™ืฉ ื˜ื ืึธื™ื. ื“ืขืจื™ื‘ืขืจ, ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ืกื™ืžืคึผืœืึทืคื™ื™ื“ ืžื™ืงืจืึธืกืขืจื•ื•ื™ืก ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ื•ื•ืึธืก ืงืขืŸ ืฉืคึผืขื˜ืขืจ ื–ื™ื™ืŸ "ื’ืขื”ืื ื’ืขืŸ" ืžื™ื˜ ืึทืœืข ืกืึธืจืฅ ืคื•ืŸ ื˜ืฉื™ืงืึทื•ื•ืข ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื–. ื“ื™ ื”ื•ื™ืคึผื˜ ืคืึธื“ืขืจื•ื ื’ ืคึฟืึทืจ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื–ื™ื™ึทืŸ ืžืึทืงืกื™ืžื•ื ืคืึทื ื’ืงืฉืึทื ืึทืœ ืคึผืจืึทืงืกื™ืžืึทื˜ื™ ืฆื• ื“ื™ ืคืึทืงื˜ื™ืฉ ืกื™ืกื˜ืขื.

ื˜ื›ื™ืœืขืก, ืื™ืš ืฆืขื˜ื™ื™ืœื˜ ื“ื™ ืฉืึทืคื•ื ื’ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ืขื˜ืœืขื›ืข ืกื˜ืขืคึผืก:

  1. ืฉืึทืคึฟืŸ ืฆื•ื•ื™ื™ ื‘ืึทื“ื™ื ื•ื ื’ืก - 'ื‘ืึทืงืขื ื“' ืื•ืŸ 'ื’ืึทื˜ืขื•ื•ื™ื™ึท', ืคึผืึทืงืŸ ื–ื™ื™ ืื™ืŸ ื“ืึธืงืงืขืจ ื‘ื™ืœื“ืขืจ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื–ื™ื™ ืฆื• ืึทืจื‘ืขื˜ืŸ ืฆื•ื–ืึทืžืขืŸ

    ื˜ืขืจืžื™ื ืขืŸ: Java 11, Spring Boot, Docker, ื‘ื™ืœื“ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ

  2. ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ Kubernetes ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืกื™ืกื˜ืขื ืื™ืŸ Google Kubernetes Engine

    ื˜ืขืจืžื™ื ืขืŸ: Kubernetes, GKE, ืžื™ื˜ืœ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’, ืึทื•ื˜ืึธืกืงืึทืœื™ื ื’, ืกื™ืงืจื™ืฅ

  3. ืฉืึทืคึฟืŸ ืึท ื˜ืฉืึทืจื˜ ืžื™ื˜ ื”ืขืœื 3 ืคึฟืึทืจ ืžืขืจ ืขืคืขืงื˜ื™ื•ื• ืงื ื•ื™ืœ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’

    ื˜ืขืจืžื™ื ืขืŸ: ื”ืขืœื 3, ื˜ืฉืึทืจื˜ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜

  4. ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ Jenkins ืื•ืŸ ืจืขืจื  - ืœื™ื ื™ืข ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืฆื•ืฉื˜ืขืœืŸ ืงืึธื“ ืฆื• ื“ืขื ืงื ื•ื™ืœ

    ื˜ืขืจืžื™ื ืขืŸ: Jenkins ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืคึผืœื•ื’ื™ื ืก, ื‘ืึทื–ื•ื ื“ืขืจ ืงืึธื ืคื™ื’ืก ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™

ืื™ืš ืคึผืœืึทืŸ ืฆื• ืึธืคึผื’ืขื‘ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืึทืจื˜ื™ืงืœ ืฆื• ื™ืขื“ืขืจ ืฉืจื™ื˜.

ื“ืขืจ ืคืึธืงื•ืก ืคื•ืŸ ื“ืขื ืกืขืจื™ืข ืคื•ืŸ โ€‹โ€‹ืึทืจื˜ื™ืงืœืขืŸ ืื™ื– ื ื™ืฉื˜ ื•ื•ื™ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืžื™ืงืจืึธืกืขืจื•ื•ื™ืกืขืก, ืึธื‘ืขืจ ื•ื•ื™ ืฆื• ืžืึทื›ืŸ ื–ื™ื™ ืึทืจื‘ืขื˜ ืื™ืŸ ืึท ืื™ื™ืŸ ืกื™ืกื˜ืขื. ื›ืึธื˜ืฉ ืึทืœืข ื“ื™ ื˜ื™ื ื’ื– ื–ืขื ืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืึทืจื•ื™ืก ื“ื™ ืคึฟืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขื›ืงื™ื™ื˜ ืคื•ืŸ ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจ, ืื™ืš ื˜ืจืึทื›ื˜ืŸ ืขืก ืื™ื– ื ืึธืš ื ื•ืฆื™ืง ืฆื• ื–ื™ื™ืŸ ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ 20% ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ื–ื™ื™ (ื•ื•ืึธืก ืื™ื– ื‘ืึทื•ื•ื•ืกื˜ ืฆื• ืึทืงืึทื•ื ืฅ ืคึฟืึทืจ 80% ืคื•ืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜). ืขื˜ืœืขื›ืข ืœืขื’ืึทืžืจืข ื•ื•ื™ื›ื˜ื™ืง ื˜ืขืžืขืก, ืึทื–ืึท ื•ื•ื™ ื–ื™ื›ืขืจื”ื™ื™ื˜, ื•ื•ืขื˜ ื–ื™ื™ืŸ ืœื™ื ืงืก ืคื•ืŸ ื“ืขื ืคึผืจื•ื™ืขืงื˜, ื•ื•ื™ื™ึทืœ ื“ืขืจ ืžื—ื‘ืจ ืคืืจืฉื˜ื™ื™ื˜ ื‘ื™ืกืœ ื•ื•ืขื’ืŸ ื“ืขื; ื“ื™ ืกื™ืกื˜ืขื ืื™ื– ื‘ืืฉืืคืŸ ืื•ื™ืกืฉืœื™ืกืœืขืš ืคึฟืึทืจ ืคึผืขืจื–ืขื ืœืขืš ื ื•ืฆืŸ. ืื™ืš ื‘ืึทื’ืจื™ืกืŸ ืงื™ื™ืŸ ืžื™ื™ื ื•ื ื’ืขืŸ ืื•ืŸ ืงืึทื ืกื˜ืจืึทืงื˜ื™ื•ื• ืงืจื™ื˜ื™ืง.

ืงืจื™ื™ื™ื˜ื™ื ื’ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก

ื“ื™ ืกืขืจื•ื•ื™ืกืขืก ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ Java 11 ืžื™ื˜ Spring Boot. ื™ื ื˜ืขืจ-ื“ื™ื ืกื˜ ืงืึธืžื•ื ื™ืงืึทืฆื™ืข ืื™ื– ืึธืจื’ืึทื ื™ื–ื™ืจื˜ ืžื™ื˜ REST. ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื•ื•ืขื˜ ืึทืจื™ื™ึทื ื ืขืžืขืŸ ืึท ืžื™ื ื™ืžื•ื ื ื•ืžืขืจ ืคื•ืŸ ื˜ืขืกืฅ (ืึทื–ื•ื™ ืึทื– ืฉืคึผืขื˜ืขืจ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืขืคึผืขืก ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ืื™ืŸ Jenkins). ื“ืขืจ ืžืงื•ืจ ืงืึธื“ ืคึฟืึทืจ ื“ื™ ืกืขืจื•ื•ื™ืกืขืก ืื™ื– ื‘ื ื™ืžืฆื ืื•ื™ืฃ GitHub: ื‘ืึทืงืขื ื“ ะธ ื’ื™ื™ื˜ื•ื•ื™ื™.

ืฆื• ืงืขื ืขืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ื™ืขื“ืขืจ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ื™ืกืขืก, ืึท ืกืคึผืจื™ื ื’ ืึทืงื˜ื•ืึทื˜ืึธืจ ืื™ื– ืฆื•ื’ืขื’ืขื‘ืŸ ืฆื• ื–ื™ื™ืขืจ ื“ืขืคึผืขื ื“ืขื ืกื™. ืขืก ื•ื•ืขื˜ ืžืึทื›ืŸ ืึทืŸ ืขื ื“ืคึผื•ื™ื ื˜ / ืึทืงื˜ื•ืึทื˜ืึธืจ / ื’ืขื–ื•ื ื˜ ืื•ืŸ ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึท ืกื˜ืึทื˜ื•ืก ืคื•ืŸ 200 ืื•ื™ื‘ ื“ื™ ืกืขืจื•ื•ื™ืก ืื™ื– ื’ืจื™ื™ื˜ ืฆื• ืึธื ื ืขืžืขืŸ ืคืึทืจืงืขืจ, ืึธื“ืขืจ 504 ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืคึผืจืึธื‘ืœืขืžืก. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ืึธืก ืื™ื– ืึท ื’ืึทื ืฅ ืคื™ืงื˜ื™ืฉืึทืก ื˜ืฉืขืง, ื•ื•ื™ื™ึทืœ ื“ื™ ืกืขืจื•ื•ื™ืกืขืก ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ืคึผืฉื•ื˜, ืื•ืŸ ืื•ื ื˜ืขืจ ืึท ืžื™ืŸ ืคื•ืŸ ืงืจืึทืคื˜ ืžืึทื“ื–ืฉื•ืจ ื–ื™ื™ ื–ืขื ืขืŸ ืžืขืจ ืžืกืชึผืžื ืฆื• ื•ื•ืขืจืŸ ื’ืึธืจ ืึทื ืึทื•ื•ื™ื™ืœืึทื‘ืึทืœ ื•ื•ื™ ืฆื• ื‘ืœื™ื™ึทื‘ืŸ ื˜ื™ื™ืœ ืึทืคึผืขืจื™ื™ืฉืึทื ืึทืœ. ืึธื‘ืขืจ ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืกื™ืกื˜ืขืžืขืŸ, ืึทืงื˜ื•ืึทื˜ืึธืจ ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ื“ื™ืึทื’ื ืึธื–ื™ืจืŸ ืึท ืคึผืจืึธื‘ืœืขื ืื™ื™ื“ืขืจ ื™ื•ื–ืขืจื– ืึธื ื”ื™ื™ื‘ืŸ ืฆื• ืฉืœืึธื’ืŸ ืขืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื•ื™ื‘ ืคึผืจืึธื‘ืœืขืžืก ืฉื˜ื™ื™ืขืŸ ืžื™ื˜ ืึทืงืกืขืก ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ืžื™ืจ ืงืขื ืขืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืจื™ืกืคึผืึทื ื“ ืฆื• ื“ืขื ื“ื•ืจืš ืกื˜ืึธืคึผืคึผื™ื ื’ ืคึผืจืึทืกืขืกื™ื ื’ ืจื™ืงื•ื•ืขืก ืžื™ื˜ ืึท ืฆืขื‘ืจืื›ืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ื™ืก.

ื‘ืึทืงืขื ื“ ื“ื™ื ืกื˜

ื“ื™ ื‘ืึทืงืขื ื“ ืกืขืจื•ื•ื™ืก ื•ื•ืขื˜ ืคืฉื•ื˜ ืฆื™ื™ืœืŸ ืื•ืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืื ื’ืขื ื•ืžืขืŸ ืจื™ืงื•ื•ืขืก.

ืงืึธื ื˜ืจืึธืœืœืขืจ ืงืึธื“:

@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")

ืึทืœืฅ ืึทืจื‘ืขื˜. ื“ืขืจ ืึทื˜ืขื ื˜ื™ื•ื• ืœื™ื™ืขื ืขืจ ื•ื•ืขื˜ ื‘ืึทืžืขืจืงืŸ ืึทื– ื’ืึธืจื ื™ืฉื˜ ืคึผืจื™ื•ื•ืขื ืฅ ืื•ื ื“ื– ืคื•ืŸ ืึทืงืกืขืก ื“ื™ ื‘ืึทืงืขื ื“ ื’ืœื™ื™ึทืš, ื‘ื™ื™ืคึผืึทืกื™ื ื’ ื“ื™ ื’ื™ื™ื˜ื•ื•ื™ื™ (http://localhost:8081/requests). ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื, ื“ื™ ืกืขืจื•ื•ื™ืกืขืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ืงืึทืžื‘ื™ื™ื ื“ ืื™ืŸ ืื™ื™ืŸ ื ืขืฅ, ืื•ืŸ ื‘ืœื•ื™ื– ื“ื™ ื’ื™ื™ื˜ื•ื•ื™ื™ ื–ืึธืœ "ืฉื˜ืขืงืŸ ืื•ื™ืก" ืึทืจื•ื™ืก.
ืื•ื™ืš, ื‘ื™ื™ื“ืข ืกืขืจื•ื•ื™ืกืขืก ื˜ื™ื™ืœืŸ ื“ื™ ื–ืขืœื‘ืข ื˜ืขืงืข ืกื™ืกื˜ืขื, ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืคึฟืขื“ืขื, ืื•ืŸ ืื™ืŸ ืื™ื™ืŸ ืคื•ื ื˜ ืงืขื ืขืŸ ืึธื ื”ื™ื™ื‘ืŸ ืฆื• ืึทืจื™ื™ึทื ืžื™ืฉื  ื–ื™ืš ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ. ืขืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืคื™ื™ึทืŸ ืฆื• ื™ื–ืึธืœื™ืจืŸ ืื•ื ื“ื–ืขืจ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก. ื“ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื˜ืฉื™ื•ื•ื“ ื“ื•ืจืš ื“ื™ืกื˜ืจื™ื‘ื™ื•ื˜ื™ื ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืึทืจื™ื‘ืขืจ ืคืึทืจืฉื™ื“ืขื ืข ืžืืฉื™ื ืขืŸ (ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื’ืขืœื˜, ืฉื•ื•ืขืจ), ื ื™ืฆืŸ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ (ืจื™ืกืึธืจืก-ืื™ื ื˜ืขื ืกื™ื•ื•ืข, ืœืึทื ื’ ืกื˜ืึทืจื˜ืึทืคึผ) ืึธื“ืขืจ ื ื™ืฆืŸ ืงืึทื ื˜ื™ื™ื ืขืจื–. ื•ื•ื™ ื“ืขืจื•ื•ืึทืจื˜, ืžื™ืจ ืงืœื™ื™ึทื‘ืŸ ื“ื™ ื“ืจื™ื˜ ืึธืคึผืฆื™ืข ืื•ืŸ ื“ืึธืงืงืขืจ ื•ื•ื™ ืึท ื’ืขืฆื™ื™ึทื’ ืคึฟืึทืจ ืงืึทื ื˜ืึทืžืึทื ื™ื™ืฉืึทืŸ.

ื“ืึธืงืงืขืจ

ืื™ืŸ ืงื•ืจืฅ, ื“ืึธืงืขืจ ืงืจื™ื™ื™ืฅ ืืคื’ืขื–ื•ื ื“ืขืจื˜ ืงืึทื ื˜ื™ื™ื ืขืจื–, ืื™ื™ื ืขืจ ืคึผืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ืฆื• ื ื•ืฆืŸ Docker, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืึท Dockerfile - ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืคึฟืึทืจ ื‘ื•ื™ืขืŸ ืื•ืŸ ืœื•ื™ืคืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื“ืขืจื ืึธืš ืื™ืจ ืงืขื ืขืŸ ื‘ื•ื™ืขืŸ ื“ื™ ื‘ื™ืœื“, ืฆื•ืคึฟืขืœื™ืงืขืจ ืขืก ืฆื• ื“ื™ ื‘ื™ืœื“ ืจืขื’ื™ืกื˜ืจื™ (ื ื™ื™ืŸ. ื“ืึธืงืงืขืจื”ื•ื‘) ืื•ืŸ ืฆืขื•ื•ื™ืงืœืขืŸ ื“ื™ื™ืŸ ืžื™ืงืจืึธืกืขืจื•ื•ื™ืก ืื™ืŸ ืงื™ื™ืŸ ื“ืึธืงืขืจื™ื™ื–ื“ ืกื•ื•ื™ื•ื•ืข ืื™ืŸ ืื™ื™ืŸ ื‘ืึทืคึฟืขืœ.

dockerfile

ืื™ื™ื ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื•ื•ื™ื›ื˜ื™ื’ืกื˜ืข ืื™ื™ื’ื ืฉืืคื˜ืŸ ืคื•ืŸ ืืŸ ืื™ืžืขื“ื–ืฉ ืื™ื– ืื™ืจ ื’ืจื™ื™ืก. ื ืงืืžืคืืงื˜ ืื™ืžืขื“ื–ืฉ ื•ื•ืขื˜ ื–ื™ืš ืฉื ืขืœืขืจ ืืจืืคืœืื“ืŸ ืคื•ืŸ ื ื•ื•ื™ื™ื˜ืขืจืŸ ืจืขืคืื–ื™ื˜ืืจื™, ื ืขืžืขืŸ ื•ื•ื™ื™ื ื™ื’ืขืจ ืคืœืืฅ, ืื•ืŸ ืื™ื™ืขืจ ืกืขืจื•ื•ื™ืก ื•ื•ืขื˜ ืฉื ืขืœืขืจ ืื ื”ื™ื™ื‘ืŸ. ื™ืขื“ืข ืื™ืžืขื“ื–ืฉ ื•ื•ืขืจื˜ ื’ืขื‘ื•ื™ื˜ ืื•ื™ืฃ ื ื‘ืื–ืข ืื™ืžืขื“ื–ืฉ, ืื•ืŸ ืก'ืื™ื– ืจืขืงืืžืขื ื“ื™ืจื˜ ืฆื• ืงืœื™ื™ื‘ืŸ ื“ื™ ืžื™ื ื™ืžืืœื™ืกื˜ื™ืฉืกื˜ืข ืืคืฆื™ืข. ื ื’ื•ื˜ืข ืืคืฆื™ืข ืื™ื– ืืœืคื™ื™ืŸ, ื ืคื•ืœืฉื˜ืขื ื“ื™ื’ืข ื“ื™ืกื˜ืจื™ื‘ื™ื•ืฆื™ืข. Linux ืžื™ื˜ ื ืžื™ื ื™ืžื•ื ืคื•ืŸ ืคึผืขืงืœืขืš.

ืขืจืฉื˜ืขืจ, ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืึท ื“ืึธืงืขืจืคื™ืœืข "ืงืึธืคึผ-ืื•ื™ืฃ" (ืื™ืš ื•ื•ืขืœ ื–ืึธื’ืŸ ื’ืœื™ื™ืš ืึทื– ื“ืึธืก ืื™ื– ืึท ืฉืœืขื›ื˜ ื•ื•ืขื’, ื˜ืึธืŸ ื ื™ื˜ ื˜ืึธืŸ ื“ืึธืก):

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 ืžืขื’ืื‘ื™ื™ื˜ืŸ ืื™ืŸ ื’ืจื™ื™ืก (ืคื•ืŸ ื•ื•ืึธืก ื“ื™ ื‘ืึทื–ืข JDK 340 ื‘ื™ืœื“ ื’ืขื ื•ืžืขืŸ ืžื‘). ืื•ืŸ ืึทืœืข ื˜ืจืึธืฅ ื“ืขื ืคืึทืงื˜ ืึทื– ื“ื™ ืงืœืืกืŸ ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืจืขื›ื ื˜ ืื•ื™ืฃ ืื™ื™ืŸ ืคื™ื ื’ืขืจ. ืฆื• ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ืœื“:

  • ืžื™ืจ ื ื•ืฆืŸ ืžืึทืœื˜ื™-ืฉืจื™ื˜ ืคึฟืึทืจื–ืึทืžืœื•ื ื’. ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืฉืจื™ื˜ ืžื™ืจ ื•ื•ืขืœืŸ ืึทืกืขืžื‘ืึทืœ ื“ื™ ืคึผืจื•ื™ืขืงื˜, ืื™ืŸ ื“ื™ ืจื’ืข ืžื™ืจ ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ JRE, ืื•ืŸ ืื™ืŸ ื“ื™ ื“ืจื™ื˜ ืฉืจื™ื˜, ืžื™ืจ ื ืึธื›ืžืึทื›ืŸ ืึทืœืข ื“ืขื ืื™ืŸ ืึท ื ื™ื™ึท ืจื™ื™ืŸ ืึทืœืคึผื™ื™ืŸ ื‘ื™ืœื“. ืื™ืŸ ื’ืึทื ืฅ, ื“ื™ ืœืขืฆื˜ ื‘ื™ืœื“ ื•ื•ืขื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ื‘ืœื•ื™ื– ื“ื™ ื ื™ื™ื˜ื™ืง ืงืึทืžืคึผืึธื•ื ืึทื ืฅ.
  • ืœืึธืžื™ืจ ื ื•ืฆืŸ ื“ื–ืฉืึทื•ื•ืึท ืžืึทื“ื–ืฉืึทืœืขืจื™ื–ื™ื™ืฉืึทืŸ. ืกื˜ืึทืจื˜ื™ื ื’ ืžื™ื˜ Java 9, ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ื“ื™ jlink ื’ืขืฆื™ื™ึทื’ ืฆื• ืฉืึทืคึฟืŸ ืึท JRE ืคึฟื•ืŸ ื‘ืœื•ื™ื– ื“ื™ ืžืึทื“ื–ืฉื•ืœื– ืื™ืจ ื“ืึทืจืคึฟืŸ

ืคึฟืึทืจ ื“ื™ ื˜ืฉื™ืงืึทื•ื•ืข, ื“ืึธ ืื™ื– ืึท ื’ื•ื˜ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ืึทืคึผืจืึธื•ื˜ืฉื™ื– ืฆื• ืจื™ื“ื•ืกื™ื ื’ ื‘ื™ืœื“ ืกื™ื–ืขืก https://habr.com/ru/company/ruvds/blog/485650/.

Final 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 network create msvc-network

ื“ืขืจื ืึธืš, ืœืึธื–ืŸ ืื•ื ื“ื– ืงืึทื˜ืขืจ ืึท ื‘ืึทืงืขื ื“ ืงืึทื ื˜ื™ื™ื ืขืจ ืžื™ื˜ืŸ ื ืึธืžืขืŸ 'ื‘ืึทืงืขื ื“' ืžื™ื˜ ื“ื™ ื‘ื™ืœื“ microservices-backend:1.0.0:

docker run -dit --name backend --network msvc-net microservices-backend:1.0.0

ืขืก ืื™ื– ื›ื“ืื™ ืฆื• ื‘ืืžืขืจืงืŸ ืึทื– ื“ื™ ื‘ืจื™ืง ื ืขืฅ ื’ื™ื˜ ื“ื™ื ืกื˜ ื•ืคื“ืขืงื•ื ื’ ืื•ื™ืก ืคื•ืŸ ื“ื™ ืงืขืกื˜ืœ ืคึฟืึทืจ ืงืึทื ื˜ื™ื™ื ืขืจื– ื“ื•ืจืš ื–ื™ื™ืขืจ ื ืขืžืขืŸ. ื“ืึธืก ืื™ื–, ื“ื™ ื‘ืึทืงืขื ื“ ื“ื™ื ืกื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืื™ืŸ ื“ื™ ื“ืึธืงืงืขืจ ื ืขืฅ ืื™ืŸ http://backend:8080.

ืœืึธืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ื“ืขื ื˜ื•ื™ืขืจ:

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 ืคื•ืŸ ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ. ืžื™ืจ ื ื•ืฆืŸ ืขื ื•ื• ืึธืคึผืฆื™ืขืก ืฆื• ืฉื˜ืขืœืŸ ื™ื ื•ื•ื™ื™ืจืึทื ืžืขื ืึทืœ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื•ื•ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืœื™ื™ืขื ืขืŸ ื“ื•ืจืš ืคืจื™ืœื™ื ื’ ืื•ืŸ ืึธื•ื•ื•ืขืจืจื™ื™ื“ ื“ื™ ืคึผืจืึธืคึผืขืจื˜ื™ืขืก ืคื•ืŸ ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ.ืคึผืจืึธืคึผืขืจื˜ื™ืขืก.

ื ืึธืš ืงืึทื˜ืขืจ, ืจื•ืคืŸ http://localhost/ ืื•ืŸ ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ืึทืœืฅ ืึทืจื‘ืขื˜, ื•ื•ื™ ืื™ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืคืึทืœ.

ืกืึธืฃ

ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืžื™ืจ ื‘ืืฉืืคืŸ ืฆื•ื•ื™ื™ ืคึผืฉื•ื˜ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก, ืคึผืึทืงื™ื“ื–ืฉื“ ื–ื™ื™ ืื™ืŸ ื“ืึธืงืงืขืจ ืงืึทื ื˜ื™ื™ื ืขืจื– ืื•ืŸ ืœืึธื ื˜ืฉื˜ ื–ื™ื™ ืฆื•ื–ืึทืžืขืŸ ืื•ื™ืฃ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืžืึทืฉื™ืŸ. ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ืกื™ืกื˜ืขื, ืึธื‘ืขืจ, ื”ืื˜ ืึท ื ื•ืžืขืจ ืคื•ืŸ ื“ื™ืกืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื–:

  • ื ืขื‘ืขืš ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ - ืึทืœืฅ ืึทืจื‘ืขื˜ ืื•ื™ืฃ ืื™ื™ืŸ ืกืขืจื•ื•ืขืจ ืคึฟืึทืจ ืื•ื ื“ื–
  • ื ืขื‘ืขืš ืกืงืึทืœืึทื‘ื™ืœื™ื˜ื™ - ื•ื•ื™ ื“ื™ ืžืึทืกืข ื™ื ืงืจื™ืกื™ื–, ืขืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืคื™ื™ึทืŸ ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืฆืขื•ื•ื™ืงืœืขืŸ ื ืึธืš ืกืขืจื•ื•ื™ืก ื™ื ืกื˜ืึทื ืกื™ื– ืื•ืŸ ื‘ืึทืœืึทื ืกื™ืจืŸ ื“ื™ ืžืึทืกืข ืฆื•ื•ื™ืฉืŸ ื–ื™ื™
  • ืงืึทื˜ืขืจ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ - ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืึทืจื™ื™ึทืŸ ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ 3 ืงืึทืžืึทื ื“ื–, ืžื™ื˜ ื–ื™ื›ืขืจ ืคึผืึทืจืึทืžืขื˜ืขืจืก (ื“ืึธืก ืื™ื– ื‘ืœื•ื™ื– ืคึฟืึทืจ 2 ื‘ืึทื“ื™ื ื•ื ื’ืก)

ืฆื• ืกืึธืœื•ื•ืข ื“ื™ ืื•ื™ื‘ืŸ ืคึผืจืึธื‘ืœืขืžืก, ืขืก ื–ืขื ืขืŸ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืกืึทืœื•ืฉืึทื ื– ืึทื–ืึท ื•ื•ื™ Docker Swarm, Nomad, Kubernetes ืึธื“ืขืจ OpenShift. ืื•ื™ื‘ ื“ื™ ื’ืื ืฆืข ืกื™ืกื˜ืขื ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ื–'ืื‘ื, ืื™ืจ ืงืขื ื˜ ืงื•ืงืŸ ืฆื• ืกืคึผืจื™ื ื’ ืงืœืึธื•ื“ (ื’ื•ื˜ ืึทืจื˜ื™ืงืœ).

ะ’ ื•ื•ื™ื™ึทื˜ืขืจ ื˜ื™ื™ืœ ืื™ืš ื•ื•ืขื˜ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ืขื’ืŸ ื•ื•ื™ ืื™ืš ืฉื˜ืขืœืŸ ืึทืจื•ื™ืฃ Kubernetes ืื•ืŸ ื“ื™ืคึผืœื•ื™ื“ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืฆื• Google Kubernetes Engine.

ืžืงื•ืจ: www.habr.com

ืงื•ื™ืคืŸ ืคืึทืจืœืึธื–ืœืขืš ื”ืึธืกื˜ื™ื ื’ ืคึฟืึทืจ ื–ื™ื™ื˜ืœืขืš ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก ๐Ÿ”ฅ ืงื•ื™ืคื˜ ืคืึทืจืœืขืกืœืขื›ืข ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ื”ืึธืกื˜ื™ื ื’ ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก | ProHoster