เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจนเฉˆ เจธเจฟเฉฑเจ–เฉ‹เฅค เจญเจพเจ— 1. เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ

เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจนเฉˆ เจธเจฟเฉฑเจ–เฉ‹เฅค เจญเจพเจ— 1. เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ

เจนเฉ‡ เจนเจฌเจฐ.

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจฆเฉ‡ เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจธเจฟเฉฑเจ–เจฃ เจฆเจพ เจฎเจพเจนเฉŒเจฒ เจฌเจฃเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจ†เจชเจฃเฉ‡ เจ…เจจเฉเจญเจต เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚เฅค เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจนเจฐ เจจเจตเฉ‡เจ‚ เจŸเฉ‚เจฒ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจ–เจฟเจ†, เจฎเฉˆเจ‚ เจนเจฎเฉ‡เจธเจผเจพ เจ‡เจธเจจเฉ‚เฉฐ เจจเจพ เจธเจฟเจฐเจซเจผ เจธเจฅเจพเจจเจ• เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡, เจธเจ—เฉ‹เจ‚ เจนเฉ‹เจฐ เจฏเจฅเจพเจฐเจฅเจตเจพเจฆเฉ€ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจตเฉ€ เจ…เจœเจผเจฎเจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจธเฉ€เฅค เจ‡เจธ เจฒเจˆ, เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจธเจฐเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจธเจฐเจตเจฟเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ, เจœเจฟเจธเจจเฉ‚เฉฐ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจนเจฐ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจฆเจฟเจฒเจšเจธเจช เจคเจ•เจจเฉ€เจ•เจพเจ‚ เจจเจพเจฒ "เจ•เจตเจฐ" เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฒเจˆ เจฎเฉเฉฑเจ– เจฒเฉ‹เฉœ เจ…เจธเจฒ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจจเฉ‡เฉœเจคเจพ เจนเฉˆ.

เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจ•เจˆ เจชเฉœเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจคเฉ‹เฉœ เจฆเจฟเฉฑเจคเจพ:

  1. เจฆเฉ‹ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฌเจฃเจพเจ“ - 'เจฌเฉˆเจ•เจเจ‚เจก' (เจฌเฉˆเจ•เจเจ‚เจก) เจ…เจคเฉ‡ 'เจ—เฉ‡เจŸเจตเฉ‡เจ…' (เจ—เฉ‡เจŸเจตเฉ‡), เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจชเฉˆเจ• เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹

    เจ•เฉ€เจตเจฐเจก: เจœเจพเจตเจพ 11, เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ, เจกเฉŒเจ•เจฐ, เจšเจฟเฉฑเจคเจฐ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ

  2. เจ—เฉ‚เจ—เจฒ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‡เฉฐเจœเจฃ เจตเจฟเฉฑเจš เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจ…เจคเฉ‡ เจธเจฟเจธเจŸเจฎ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจฆเจพ เจตเจฟเจ•เจพเจธ

    เจ•เฉ€เจตเจฐเจกเจธ: เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ, เจœเฉ€เจ•เฉ‡เจˆ, เจธเจฐเฉ‹เจค เจชเฉเจฐเจฌเฉฐเจงเจจ, เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ—, เจธเฉ€เจ•เจฐเฉ‡เจŸเจธ

  3. เจฌเจฟเจนเจคเจฐ เจ•เจฒเฉฑเจธเจŸเจฐ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฒเจˆ เจนเฉˆเจฒเจฎ 3 เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจšเจพเจฐเจŸ เจฌเจฃเจพเจ‰เจฃเจพ

    เจŸเฉˆเจ—เจธ: เจนเฉˆเจฒเจฎ 3, เจšเจพเจฐเจŸ เจคเฉˆเจจเจพเจคเฉ€

  4. เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจ•เฉ‹เจก เจฆเฉ€ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฒเจˆ เจœเฉ‡เจจเจ•เจฟเจจเจธ เจ…เจคเฉ‡ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ

    เจ•เฉ€เจตเจฐเจกเจธ: เจœเฉ‡เจจเจ•เจฟเฉฐเจธ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ, เจชเจฒเฉฑเจ—เจ‡เจจ, เจตเฉฑเจ–เจฐเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€

เจฎเฉˆเจ‚ เจนเจฐ เจ•เจฆเจฎ เจฒเจˆ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจฒเฉ‡เจ– เจธเจฎเจฐเจชเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ เจฌเจฃเจพ เจฐเจฟเจนเจพ เจนเจพเจ‚เฅค

เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจ‡เจธ เจฒเฉœเฉ€ เจฆเจพ เจซเฉ‹เจ•เจธ เจ‡เจน เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเจพ เจนเฉˆ, เจชเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‡เจน เจธเจพเจฐเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฆเฉ€ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ…เจœเฉ‡ เจตเฉ€ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ 20% (เจœเฉ‹, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจœเจพเจฃเจฆเฉ‡ เจนเฉ‹, เจจเจคเฉ€เจœเฉ‡ เจฆเจพ 80% เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ) เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเฉ‹เจฃเจพ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉˆ. เจ•เฉเจ เจฌเจฟเจจเจพเจ‚ เจธเจผเจฐเจค เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจตเจฟเจธเจผเฉ‡, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเฉเจฐเฉฑเจ–เจฟเจ†, เจจเฉ‚เฉฐ เจ‡เจธ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจฐเฉฑเจ–เจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฒเฉ‡เจ–เจ• เจ‡เจธ เจธเจฟเจธเจŸเจฎ เจฌเจพเจฐเฉ‡ เจฌเจนเฉเจค เจ˜เฉฑเจŸ เจธเจฎเจเจฆเจพ เจนเฉˆ เจœเฉ‹ เจธเจฟเจฐเจซเจผ เจจเจฟเฉฑเจœเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฒเจˆ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆเฅค เจฎเฉˆเจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจตเจฟเจšเจพเจฐ เจ…เจคเฉ‡ เจฐเจšเจจเจพเจคเจฎเจ• เจ†เจฒเฉ‹เจšเจจเจพ เจฆเจพ เจธเฉเจ†เจ—เจค เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค

เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจฌเจฃเจพเจ‰เจฃเจพ

เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ Java 11 เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เฉฐเจŸเจฐเจธเจฐเจตเจฟเจธ เจ‡เฉฐเจŸเจฐเจเจ•เจธเจผเจจ REST เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจฏเฉ‹เจœเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ€ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ เจ—เจฟเจฃเจคเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‡เจ—เฉ€ (เจคเจพเจ‚ เจœเฉ‹ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจœเฉ‡เจจเจ•เจฟเฉฐเจธ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ เจ•เฉเจ เจนเฉ‹เจตเฉ‡)เฅค เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฒเจˆ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก 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). เจ‡เจธ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจจ เจฒเจˆ, เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจ—เฉ‡เจŸเจตเฉ‡ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐเฉ‹เจ‚ "เจธเจŸเจฟเฉฑเจ• เจ†เจŠเจŸ" เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค
เจจเจพเจฒ เจนเฉ€, เจฆเฉ‹เจตเฉ‡เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจธเจพเจ‚เจเจพ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจธเจŸเฉเจฐเฉ€เจฎ เจชเฉˆเจฆเจพ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเจฒ 'เจคเฉ‡ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจฆเจ–เจฒ เจฆเฉ‡เจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจธเจพเจกเฉ€เจ†เจ‚ เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจฒเฉฑเจ— เจ•เจฐเจจเจพ เจšเฉฐเจ—เจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เจน เจตเฉฑเจ–-เจตเฉฑเจ– เจฎเจธเจผเฉ€เจจเจพเจ‚ (เจฌเจนเฉเจค เจธเจพเจฐเจพ เจชเฉˆเจธเจพ, เจฎเฉเจธเจผเจ•เจฒ) 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉฐเจก เจ•เฉ‡, เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจเจพเจ‚ (เจธเจฐเฉ‹เจค เจฆเฉ€ เจคเฉ€เจฌเจฐ, เจฒเฉฐเจฌเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค), เจœเจพเจ‚ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เจฎเฉ€เจฆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจคเฉ€เจœเจพ เจตเจฟเจ•เจฒเจช เจšเฉเจฃเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจฒเจˆ เจ‡เฉฑเจ• เจธเจพเจงเจจ เจตเจœเฉ‹เจ‚.

เจกเฉŒเจ•เจฐ

เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš, เจกเฉŒเจ•เจฐ เจ…เจฒเฉฑเจ—-เจฅเจฒเฉฑเจ— เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจชเฉเจฐเจคเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‡เฉฑเจ•เฅค เจกเฉŒเจ•เจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ - เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจจเจฟเจฐเจฆเฉ‡เจธเจผเฅค เจ…เฉฑเจ—เฉ‡, เจคเฉเจธเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เจธเจจเฉ‚เฉฐ เจšเจฟเฉฑเจคเจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ (เจจเฉฐ. เจกเฉŒเจ•เจฐเจนเฉฑเจฌ) เจ…เจคเฉ‡ เจ†เจชเจฃเฉ€ เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจธเจฐเจตเจฟเจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฎเจพเจ‚เจก เจตเจฟเฉฑเจš เจ•เจฟเจธเฉ‡ เจตเฉ€ เจกเฉŒเจ•เจฐเจพเจˆเจœเจผเจก เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‹เฅค

เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ

เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เจธเจฆเจพ เจ†เจ•เจพเจฐ เจนเฉˆ. เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจšเจฟเฉฑเจคเจฐ เจ‡เฉฑเจ• เจฐเจฟเจฎเฉ‹เจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเฉ‡เจ—เจพ, เจ˜เฉฑเจŸ เจฅเจพเจ‚ เจฒเจตเฉ‡เจ—เจพ, เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ€ เจธเฉ‡เจตเจพ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เฉ€เฅค เจ•เฉ‹เจˆ เจตเฉ€ เจšเจฟเฉฑเจคเจฐ เจ…เจงเจพเจฐ เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจ…เจงเจพเจฐ 'เจคเฉ‡ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ, เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจตเจฟเจ•เจฒเจช เจšเฉเจฃเจจ เจฆเฉ€ เจธเจฟเจซเจพเจฐเจธเจผ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ. เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจตเจฟเจ•เจฒเจช เจเจฒเจชเจพเจˆเจจ เจนเฉˆ, เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเฉฐเจชเฉ‚เจฐเจจ เจฒเฉ€เจจเจ•เจธ เจตเฉฐเจกเฅค

เจชเจนเจฟเจฒเจพเจ‚, เจ†เจ“ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ "เจฎเฉฑเจฅเฉ‡ เจ‰เฉฑเจคเฉ‡" เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ (เจฎเฉˆเจ‚ เจคเฉเจฐเฉฐเจค เจ•เจนเจพเจ‚เจ—เจพ เจ•เจฟ เจ‡เจน เจ‡เฉฑเจ• เจฌเฉเจฐเจพ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ, เจ…เจœเจฟเจนเจพ เจจเจพ เจ•เจฐเฉ‹):

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 เจ‰เฉฑเจคเฉ‡ เจ•เจฌเจœเจผเจพ เจ•เฉ€เจคเจพ เจนเฉˆ)เฅค เจ…เจคเฉ‡ เจ‡เจน เจธเจญ เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ เจ•เจฟ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจ•เจฒเจพเจธเจพเจ‚ เจ‡เฉฑเจ• เจ‰เจ‚เจ—เจฒเฉ€ 'เจคเฉ‡ เจ—เจฟเจฃเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ. เจธเจพเจกเฉ‡ เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจ†เจ•เจพเจฐ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃ เจฒเจˆ:

  • เจ…เจธเฉ€เจ‚ เจฎเจฒเจŸเฉ€-เจธเจŸเฉˆเจช เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจชเจนเจฟเจฒเฉ‡ เจชเฉœเจพเจ… เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจจเจฟเจฐเจฎเจพเจฃ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจฆเฉ‚เจœเฉ‡ เจชเฉœเจพเจ… เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจœเฉ‡เจ†เจฐเจˆ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ…เจคเฉ‡ เจคเฉ€เจœเฉ‡ เจชเฉœเจพเจ… เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจธเจพเจซเจผ เจ…เจฒเจชเจพเจˆเจจ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจ•เจพเจชเฉ€ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ•เฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจ•เฉ‡, เจธเจฟเจฐเจซ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจซเจพเจˆเจจเจฒ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจนเฉ‹เจฃเจ—เฉ‡.
  • เจ†เจ‰ เจœเจพเจตเจพ เจฆเฉ‡ เจฎเจพเจกเจฟเจŠเจฒเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ€เจเฅค Java 9 เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจฎเฉ‹เจกเจฟเจŠเจฒเจพเจ‚ เจคเฉ‹เจ‚ JRE เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ jlink เจŸเฉ‚เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฒเจˆ, เจ‡เฉฑเจฅเฉ‡ เจšเจฟเฉฑเจคเจฐ เจ˜เจŸเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ 'เจคเฉ‡ เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจฒเฉ‡เจ– เจนเฉˆ. https://habr.com/ru/company/ruvds/blog/485650/.

เจซเจพเจˆเจจเจฒ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ:

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

เจ…เฉฑเจ—เฉ‡, เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจธเจฐเจตเจฟเจธเจฟเจœเจผ-เจฌเฉˆเจ•เจเจ‚เจก: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 เจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค เจ…เจธเฉ€เจ‚ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ env เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจธเจชเจฐเจฟเฉฐเจ— เจฆเฉเจ†เจฐเจพ เจ†เจชเจฃเฉ‡ เจ†เจช เจชเฉœเฉเจนเฉ‡ เจœเจพเจฃเจ—เฉ‡ เจ…เจคเฉ‡ application.properties เจคเฉ‹เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ“เจตเจฐเจฐเจพเจˆเจก เจ•เจฐเจจเจ—เฉ‡เฅค

เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจ•เจพเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ http://localhost/ เจ…เจคเฉ‡ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ“ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจชเจฟเจ›เจฒเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจšเฅค

เจธเจฟเฉฑเจŸเจพ

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจฆเฉ‹ เจธเจงเจพเจฐเจจ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจฌเจฃเจพเจ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจชเฉˆเจ• เจ•เฉ€เจคเจพ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ•เฉ‹ เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡ เจ‡เจ•เฉฑเจ เฉ‡ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจธเจฟเจธเจŸเจฎ เจฆเฉ‡, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เจˆ เจจเฉเจ•เจธเจพเจจ เจนเจจ:

  • เจฎเจพเฉœเฉ€ เจจเฉเจ•เจธ เจธเจนเจฟเจฃเจธเจผเฉ€เจฒเจคเจพ - เจ‡เฉฑเจ• เจธเจฐเจตเจฐ 'เจคเฉ‡ เจธเจพเจกเฉ‡ เจฒเจˆ เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ
  • เจฎเจพเฉœเฉ€ เจฎเจพเจชเจฏเฉ‹เจ—เจคเจพ - เจœเจฆเฉ‹เจ‚ เจฒเฉ‹เจก เจตเจงเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจพเจงเฉ‚ เจธเฉ‡เจตเจพ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจฒเฉ‹เจก เจจเฉ‚เฉฐ เจธเฉฐเจคเฉเจฒเจฟเจค เจ•เจฐเจจเจพ เจšเฉฐเจ—เจพ เจนเฉ‹เจตเฉ‡เจ—เจพ
  • เจฒเจพเจ‚เจš เจฆเฉ€ เจ—เฉเฉฐเจเจฒเจคเจพ - เจธเจพเจจเฉ‚เฉฐ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ 3 เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเจพเจ–เจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจธเฉ€, เจ…เจคเฉ‡ เจ•เฉเจ เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ (เจ‡เจน เจธเจฟเจฐเจซ 2 เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฒเจˆ เจนเฉˆ)

เจ‰เจชเจฐเฉ‹เจ•เจค เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฒเจˆ, เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจนเฉฑเจฒ เจนเจจ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจกเฉŒเจ•เจฐ เจธเจตเฉˆเจฐเจฎ, เจจเฉ‹เจฎเฉˆเจก, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจœเจพเจ‚ เจ“เจชเจจเจธเจผเจฟเจซเจŸเฅค เจœเฉ‡ เจธเจพเจฐเจพ เจธเจฟเจธเจŸเจฎ เจœเจพเจตเจพ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจธเจชเจฐเจฟเฉฐเจ— เจ•เจฒเจพเจ‰เจก (เจšเฉฐเจ—เจพ เจฒเฉ‡เจ–).

ะ’ เจ…เจ—เจฒเจพ เจญเจพเจ— เจฎเฉˆเจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เจพ เจ•เจฟ เจฎเฉˆเจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉˆเจŸ เจ…เจช เจ•เฉ€เจคเจพ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจ—เฉ‚เจ—เจฒ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‡เฉฐเจœเจจ 'เจคเฉ‡ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹