ืœืžื“ ื›ื™ืฆื“ ืœืคืจื•ืก ืฉื™ืจื•ืชื™ ืžื™ืงืจื•. ื—ืœืง 1. Spring Boot and Docker

ืœืžื“ ื›ื™ืฆื“ ืœืคืจื•ืก ืฉื™ืจื•ืชื™ ืžื™ืงืจื•. ื—ืœืง 1. Spring Boot and Docker

ื”ื™ื™ ื”ื‘ืจ.

ื‘ืžืืžืจ ื–ื”, ืื ื™ ืจื•ืฆื” ืœื“ื‘ืจ ืขืœ ื”ื ื™ืกื™ื•ืŸ ืฉืœื™ ื‘ื™ืฆื™ืจืช ืกื‘ื™ื‘ืช ืœืžื™ื“ื” ืœื”ืชื ืกื•ืช ื‘ืฉื™ืจื•ืชื™ ืžื™ืงืจื•. ื›ืืฉืจ ืœืžื“ืชื™ ื›ืœ ื›ืœื™ ื—ื“ืฉ, ืชืžื™ื“ ืจืฆื™ืชื™ ืœื ืกื•ืช ืื•ืชื• ืœื ืจืง ื‘ืžื›ื•ื ื” ื”ืžืงื•ืžื™ืช, ืืœื ื’ื ื‘ืชื ืื™ื ืžืฆื™ืื•ืชื™ื™ื ื™ื•ืชืจ. ืœื›ืŸ, ื”ื—ืœื˜ืชื™ ืœื™ืฆื•ืจ ืืคืœื™ืงืฆื™ื™ืช ืžื™ืงืจื•-ืฉื™ืจื•ืช ืคืฉื•ื˜ื”, ืฉื‘ื”ืžืฉืš ืืคืฉืจ "ืœื›ืกื•ืช ืื•ืชื”" ื‘ื›ืœ ืžื™ื ื™ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืžืขื ื™ื™ื ื•ืช. ื”ื“ืจื™ืฉื” ื”ืขื™ืงืจื™ืช ืœืคืจื•ื™ืงื˜ ื”ื™ื ื”ืงืจื‘ื” ื”ืคื•ื ืงืฆื™ื•ื ืœื™ืช ื”ืžืงืกื™ืžืœื™ืช ืฉืœื• ืœืžืขืจื›ืช ื”ืืžื™ืชื™ืช.

ื‘ืชื—ื™ืœื” ืคื™ืจืงืชื™ ืืช ื™ืฆื™ืจืช ื”ืคืจื•ื™ืงื˜ ืœืžืกืคืจ ืฉืœื‘ื™ื:

  1. ืฆื•ืจ ืฉื ื™ ืฉื™ืจื•ืชื™ื - 'backend' (backend) ื•-'gateway' (ืฉืขืจ), ืืจื•ื– ืื•ืชื ืœืชืžื•ื ื•ืช docker ื•ื”ื’ื“ืจ ืื•ืชื ืœืขื‘ื•ื“ ื™ื—ื“

    ืžื™ืœื•ืช ืžืคืชื—: Java 11, Spring Boot, Docker, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื™ืช ืชืžื•ื ื”

  2. ืคื™ืชื•ื— ืชืฆื•ืจืช Kubernetes ื•ืคืจื™ืกื” ืฉืœ ืžืขืจื›ืช ื‘-Google Kubernetes Engine

    ืžื™ืœื•ืช ืžืคืชื—: Kubernetes, GKE, ื ื™ื”ื•ืœ ืžืฉืื‘ื™ื, ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™, ืกื•ื“ื•ืช

  3. ื™ืฆื™ืจืช ืชืจืฉื™ื ืขื Helm 3 ืœื ื™ื”ื•ืœ ื˜ื•ื‘ ื™ื•ืชืจ ืฉืœ ืืฉื›ื•ืœื•ืช

    ืชื’ื™ื•ืช: Helm 3, ืคืจื™ืกืช ืชืจืฉื™ื

  4. ื”ื’ื“ืจืช Jenkins ื•-pipeline ืœืžืกื™ืจื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืงื•ื“ ืœืืฉื›ื•ืœ

    ืžื™ืœื•ืช ืžืคืชื—: ืชืฆื•ืจืช Jenkins, ืชื•ืกืคื™ื, ืžืื’ืจ ื”ื’ื“ืจื•ืช ื ืคืจื“

ืื ื™ ืžืชื›ื ืŸ ืœื”ืงื“ื™ืฉ ืžืืžืจ ื ืคืจื“ ืœื›ืœ ืฉืœื‘.

ื”ืคื•ืงื•ืก ืฉืœ ืกื“ืจืช ืžืืžืจื™ื ื–ื• ืื™ื ื• ื›ื™ืฆื“ ืœื›ืชื•ื‘ ืžื™ืงืจื•-ืฉื™ืจื•ืชื™ื, ืืœื ื›ื™ืฆื“ ืœื’ืจื•ื ืœื”ื ืœืขื‘ื•ื“ ื‘ืžืขืจื›ืช ืื—ืช. ืœืžืจื•ืช ืฉื›ืœ ื”ื“ื‘ืจื™ื ื”ืืœื” ื”ื ื‘ื“ืจืš ื›ืœืœ ืžืขื‘ืจ ืœืื—ืจื™ื•ืช ื”ืžืคืชื—, ืื ื™ ื—ื•ืฉื‘ ืฉืขื“ื™ื™ืŸ ื›ื“ืื™ ืœื”ื›ื™ืจ ืื•ืชื ืœืคื—ื•ืช 20% (ืฉื›ืคื™ ืฉืืชื ื™ื•ื“ืขื™ื, ื ื•ืชื ื™ื 80% ืžื”ืชื•ืฆืื”). ื—ืœืง ืžื”ื ื•ืฉืื™ื ื”ื—ืฉื•ื‘ื™ื ืœืœื ืชื ืื™, ื›ื’ื•ืŸ ืื‘ื˜ื—ื”, ื™ื™ืฉืืจื• ืžื—ื•ืฅ ืœืคืจื•ื™ืงื˜ ื–ื”, ืžื›ื™ื•ื•ืŸ ืฉื”ืžื—ื‘ืจ ืžื‘ื™ืŸ ืžืขื˜ ืขืœ ื”ืžืขืจื›ืช ื”ื–ื• ืฉื ื•ืฆืจื” ืืš ื•ืจืง ืœืฉื™ืžื•ืฉ ืื™ืฉื™. ืืฉืžื— ืœื›ืœ ื“ืขื” ื•ื‘ื™ืงื•ืจืช ื‘ื•ื ื”.

ื™ืฆื™ืจืช ืฉื™ืจื•ืชื™ ืžื™ืงืจื•

ื”ืฉื™ืจื•ืชื™ื ื ื›ืชื‘ื• ื‘-Java 11 ื‘ืืžืฆืขื•ืช Spring Boot. ื”ืื™ื ื˜ืจืืงืฆื™ื” ื”ื‘ื™ืŸ-ืฉื™ืจื•ืชื™ืช ืžืื•ืจื’ื ืช ื‘ืืžืฆืขื•ืช REST. ื”ืคืจื•ื™ืงื˜ ื™ื›ืœื•ืœ ืžืกืคืจ ืžื™ื ื™ืžืœื™ ืฉืœ ืžื‘ื—ื ื™ื (ื›ื“ื™ ืฉื‘ื”ืžืฉืš ื™ื”ื™ื” ืžื” ืœื‘ื“ื•ืง ื‘ื’'ื ืงื™ื ืก). ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืฉื™ืจื•ืชื™ื ื–ืžื™ืŸ ื‘-GitHub: ืื—ื•ืจื™ ะธ ืฉืขืจ.

ื›ื“ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื‘ื“ื•ืง ืืช ื”ืกื˜ื˜ื•ืก ืฉืœ ื›ืœ ืื—ื“ ืžื”ืฉื™ืจื•ืชื™ื, ื ื•ืกืฃ ืžืคืขื™ืœ ืงืคื™ืฅ ืœืชืœื•ืช ืฉืœื”ื. ื–ื” ื™ืฆื•ืจ /actuator/healthpoint ืงืฆื” ื•ื™ื—ื–ื™ืจ ืกื˜ื˜ื•ืก 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")

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

ืกึทื•ึธืจ

ื‘ืงื™ืฆื•ืจ, docker ื™ื•ืฆืจ ืžื›ื•ืœื•ืช ืžื‘ื•ื“ื“ื•ืช, ืื—ืช ืœื›ืœ ืืคืœื™ืงืฆื™ื”. ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘-docer, ืขืœื™ืš ืœื›ืชื•ื‘ Dockerfile - ื”ื•ืจืื•ืช ืœื‘ื ื™ื™ื” ื•ื”ืจืฆื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”. ืœืื—ืจ ืžื›ืŸ, ืืชื” ื™ื›ื•ืœ ืœื‘ื ื•ืช ืืช ื”ืชืžื•ื ื”, ืœื”ืขืœื•ืช ืื•ืชื” ืœืจื™ืฉื•ื ื”ืชืžื•ื ื•ืช (ืžืก. Dockerhub) ื•ืคืจื•ืก ืืช ื”ืžื™ืงืจื•-ืฉื™ืจื•ืช ืฉืœืš ื‘ื›ืœ ืกื‘ื™ื‘ื” ืžืขื•ื’ื ืช ื‘ืคืงื•ื“ื” ืื—ืช.

ื“ื•ืงืจืคื™ืœ

ืื—ื“ ื”ืžืืคื™ื™ื ื™ื ื”ื—ืฉื•ื‘ื™ื ื‘ื™ื•ืชืจ ืฉืœ ืชืžื•ื ื” ื”ื•ื ื”ื’ื•ื“ืœ ืฉืœื”. ืชืžื•ื ื” ืงื•ืžืคืงื˜ื™ืช ืชื•ืจื™ื“ ืžื”ืจ ื™ื•ืชืจ ืžืžืื’ืจ ืžืจื•ื—ืง, ืชืชืคื•ืก ืคื—ื•ืช ืžืงื•ื ื•ื”ืฉื™ืจื•ืช ืฉืœืš ื™ืชื—ื™ืœ ืžื”ืจ ื™ื•ืชืจ. ื›ืœ ืชืžื•ื ื” ื ื‘ื ื™ืช ืขืœ ื‘ืกื™ืก ืชืžื•ื ืช ื”ื‘ืกื™ืก, ื•ืžื•ืžืœืฅ ืœื‘ื—ื•ืจ ื‘ืืคืฉืจื•ืช ื”ืžื™ื ื™ืžืœื™ืกื˜ื™ืช ื‘ื™ื•ืชืจ. ืืคืฉืจื•ืช ื˜ื•ื‘ื” ื”ื™ื Alpine, ื”ืคืฆืช ืœื™ื ื•ืงืก ืžืœืื” ืขื ื—ื‘ื™ืœื•ืช ืžื™ื ื™ืžืœื™ื•ืช.

ื‘ืชื•ืจ ื”ืชื—ืœื”, ื ื ืกื” ืœื›ืชื•ื‘ 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 ืžืื•ืชืชืช ืœ-docker ืฉื”ืืคืœื™ืงืฆื™ื” ื‘ืžื›ื•ืœื” ืชืฉืชืžืฉ ื‘ื™ืฆื™ืื” 8080 ืฉืœื” (ื–ื” ืœื ื™ื”ืคื•ืš ืืช ื”ืืคืœื™ืงืฆื™ื” ืœื ื’ื™ืฉื” ืžื‘ื—ื•ืฅ, ืืœื ื™ืืคืฉืจ ื’ื™ืฉื” ืœืืคืœื™ืงืฆื™ื”, ืœืžืฉืœ, ืžืžื™ื›ืœ ืื—ืจ ื‘ืื•ืชื” ืจืฉืช docker ).

ื›ื“ื™ ืœืืจื•ื– ืฉื™ืจื•ืชื™ื ืœืชืžื•ื ื•ืช, ืขืœื™ืš ืœื”ืคืขื™ืœ ืคืงื•ื“ื•ืช ืžื”ืฉื•ืจืฉ ืฉืœ ื›ืœ ืคืจื•ื™ืงื˜:

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/.

ืงื•ื‘ืฅ ื“ื•ืงืจ ืกื•ืคื™:

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 ืžื’ื”-ื‘ื™ื™ื˜. ืœื ืจืข. ืœืื—ืจ ืžื›ืŸ, ื ื™ืชืŸ ืœื”ืขืœื•ืช ืชืžื•ื ื•ืช ืžื•ื›ื ื•ืช ืœืžืจืฉื ื”ืชืžื•ื ื•ืช ื›ืš ืฉื”ืชืžื•ื ื•ืช ืฉืœื›ื ื™ื”ื™ื• ื–ืžื™ื ื•ืช ืœื”ื•ืจื“ื” ืžื”ืื™ื ื˜ืจื ื˜.

ื”ืคืขืœื” ืžืฉื•ืชืคืช ืฉืœ ืฉื™ืจื•ืชื™ื ื‘-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 ื‘ 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/ ื•ืœื•ื•ื“ื ืฉื”ื›ืœ ืขื•ื‘ื“, ื›ืžื• ื‘ืžืงืจื” ื”ืงื•ื“ื.

ืžืกืงื ื”

ื›ืชื•ืฆืื” ืžื›ืš, ื™ืฆืจื ื• ืฉื ื™ ืžื™ืงืจื•-ืฉื™ืจื•ืชื™ื ืคืฉื•ื˜ื™ื, ืืจื–ื ื• ืื•ืชื ื‘ืžื™ื›ืœื™ docker ื•ื”ืฉืงื ื• ืื•ืชื ื™ื—ื“ ืขืœ ืื•ืชื” ืžื›ื•ื ื”. ืœืžืขืจื›ืช ื”ืžืชืงื‘ืœืช, ืœืขื•ืžืช ื–ืืช, ื™ืฉ ืžืกืคืจ ื—ืกืจื•ื ื•ืช:

  • ืกื•ื‘ืœื ื•ืช ืชืงืœื•ืช ืœืงื•ื™ื” - ื”ื›ืœ ืขื•ื‘ื“ ืœื ื• ืขืœ ืฉืจืช ืื—ื“
  • ืžื“ืจื’ื™ื•ืช ืœืงื•ื™ื” - ื›ืืฉืจ ื”ืขื•ืžืก ื’ื“ืœ, ื™ื”ื™ื” ื ื—ืžื“ ืœืคืจื•ืก ืื•ื˜ื•ืžื˜ื™ืช ืžื•ืคืขื™ ืฉื™ืจื•ืช ื ื•ืกืคื™ื ื•ืœืื–ืŸ ืืช ื”ืขื•ืžืก ื‘ื™ื ื™ื”ื
  • ืžื•ืจื›ื‘ื•ืช ื”ื”ืฉืงื” - ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื”ื–ื™ืŸ ืœืคื—ื•ืช 3 ืคืงื•ื“ื•ืช, ื•ืขื ืคืจืžื˜ืจื™ื ืžืกื•ื™ืžื™ื (ื–ื” ืจืง ืขื‘ื•ืจ 2 ืฉื™ืจื•ืชื™ื)

ื›ื“ื™ ืœืชืงืŸ ืืช ื”ื‘ืขื™ื•ืช ืœืขื™ืœ, ื™ืฉื ื ืžืกืคืจ ืคืชืจื•ื ื•ืช ื›ื’ื•ืŸ Docker Swarm, Nomad, Kubernetes ืื• OpenShift. ืื ื›ืœ ื”ืžืขืจื›ืช ื›ืชื•ื‘ื” ื‘-Java, ืืชื” ื™ื›ื•ืœ ืœื”ืกืชื›ืœ ืœื›ื™ื•ื•ืŸ Spring Cloud (ืžืืžืจ ื˜ื•ื‘).

ะ’ ื”ื—ืœืง ื”ื‘ื ืื ื™ ืื“ื‘ืจ ืขืœ ื”ืื•ืคืŸ ืฉื‘ื• ื”ื’ื“ืจืชื™ Kubernetes ื•ืคืจืกืชื™ ืืช ื”ืคืจื•ื™ืงื˜ ื‘-Google Kubernetes Engine.

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”